不可或缺 Windows Native (17) - C++: 类与对象
作者:webabcd
介绍
不可或缺 Windows Native 之 C++
- 类与对象
示例
1、类的设计
CppEmployee.h
#pragma once #include <string> using namespace std; namespace NativeDll { class CppEmployee { int Number; // 默认为 private private: // 以下都是 private 的 string Name; bool IsMale; protected: // 以下都是 protected 的 string ToString(); public: // 以下都是 public 的 float Salary; int Age; string Show(); // 构造函数(constructor),不定义的话,编译时会自动生成一个默认的不做任何事情的无参数构造函数(如果指定为 private 的话就可以禁止直接实例化,一般做单例模式的话会这么做) // 另外:如果声明了带参数的构造函数,则不会自动生成默认的无参数构造函数 CppEmployee(); CppEmployee(int number, string name = "webabcd"); // 可以为构造函数中的参数指定默认值(参考:CppFunction1.cpp) CppEmployee(int number, string name, bool isMale); // 析构函数(destructor),对象被销毁时会调用,例如释放动态分配的内存等。不需要时也可以不定义,编译时会自动生成一个默认的不做任何事情的析构函数,析构函数的函数名与类名相同,前面有“~” ~CppEmployee(); private: // 注:在体内定义的成员函数,系统会自动将其作为 inline 函数处理(关于 inline 函数,参见:CppFunction2.cpp) void Temp() { int a = 100; } /* 下面这个与上面那个一样 inline void Temp() { int a = 100; } */ }; }
CppEmployee.cpp
/* * CppEmployee 类 */ #include "pch.h" #include "CppEmployee.h" #include "cppHelper.h" using namespace NativeDll; // “::”是作用域限定符(field qualifier) string CppEmployee::Show() { return int2string(Number) + " " + Name; } string CppEmployee::ToString() { return int2string(Number) + " " + Name; } // 无参数的构造函数 CppEmployee::CppEmployee() { Number = 888; Name = "webabcd"; } // 有参数的构造函数,可以在声明中为参数指定默认值 CppEmployee::CppEmployee(int number, string name) { Number = number; Name = name; } // 可以通过下面这种简单的方式,将构造函数中的参数值赋值给对象的变量 CppEmployee::CppEmployee(int number, string name, bool isMale) :Number(number), Name(name), IsMale(isMale) { } CppEmployee::~CppEmployee() { }
2、类的使用
CppClass1.h
#pragma once #include <string> using namespace std; namespace NativeDll { class CppClass1 { public: string Demo(); }; }
CppClass1.cpp
/* * 类与对象 */ #include "pch.h" #include "CppClass1.h" #include "CppEmployee.h" using namespace NativeDll; // “::”是作用域限定符(field qualifier) string CppClass1::Demo() { // 定义对象的方法 1:类声明的同时定义对象(此时也可以无类名) // 定义对象的方法 2:一般用如下的方法定义对象 // class CppEmployee employee; // class 可以省去 CppEmployee employee; // 实例化,同时分配内存空间(仅数据部分分配空间,函数部分不分配空间) // 可以访问 public 的属性或函数 employee.Salary = 100.0f; employee.Show(); // 对象的引用 CppEmployee &employee2 = employee; employee2.Salary = 1000.0f; // 对象的指针 CppEmployee *employee3 = &employee; employee3->Salary = 10000.0f; // 也可以这么实例化 CppEmployee employee5(1, "webabcd"); // 实例化 1 次 CppEmployee employee6 = { 1, "webabcd" }; // 实例化 1 次 CppEmployee employee7 = CppEmployee(1, "webabcd"); // 实例化 2 次。CppEmployee employee7 会实例化一次,CppEmployee(1, "webabcd") 会实例化一次 // 也可以这么实例化 CppEmployee *employee8 = new CppEmployee(1, "webabcd"); // 实例化,并返回对象的地址 employee8->Show(); delete employee8; // 注: // 1、上面在 Demo 函数中实例化了很多内部对象,他们会按顺序一个一个地压入栈中,栈是 FILO 的,所以当 Demo 函数执行完毕,要销毁其内部对象时,是按照 FILO 的顺序调用析构函数的 // 2、如果同一个类实例化了 n 个对象,则有 n 组同样大小的空间以存放 n 个对象中的数据成员。但是,不同对象都调用同一个函数代码段。 return "看代码及注释吧"; }
OK
[源码下载]