不可或缺 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 = ;
} /*
下面这个与上面那个一样
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 = ;
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(, "webabcd"); // 实例化 1 次
CppEmployee employee6 = { , "webabcd" }; // 实例化 1 次
CppEmployee employee7 = CppEmployee(, "webabcd"); // 实例化 2 次。CppEmployee employee7 会实例化一次,CppEmployee(1, "webabcd") 会实例化一次 // 也可以这么实例化
CppEmployee *employee8 = new CppEmployee(, "webabcd"); // 实例化,并返回对象的地址
employee8->Show();
delete employee8; // 注:
// 1、上面在 Demo 函数中实例化了很多内部对象,他们会按顺序一个一个地压入栈中,栈是 FILO 的,所以当 Demo 函数执行完毕,要销毁其内部对象时,是按照 FILO 的顺序调用析构函数的
// 2、如果同一个类实例化了 n 个对象,则有 n 组同样大小的空间以存放 n 个对象中的数据成员。但是,不同对象都调用同一个函数代码段。 return "看代码及注释吧";
}
OK
[源码下载]