1.常量成员函数
1.1把this指针的类型变为const type *const this
1.2常量成员函数内部不能修改其成员,但这只是语法层面的限制
void foo() const { //this->p = nullptr;//编译报错 HasPtr *ptr = (HasPtr*)this;//强制转换,突破语法限制 ptr->p = nullptr; }
2.构造函数初始值列表
class HasPtr { public: HasPtr(int *p, int cnt) :ptr(p), count(cnt) {} private: const int *ptr; const int count; };
2.1成员的初始化顺序
成员的初始化顺序和它们在类中定义的顺序一致,第一个成员先被初始化,然后第二个,以此类推。构造函数初始值列表中初始值的前后位置关系不会影响初始化顺序。
2.2构造和析构的顺序
构造函数:先构造成员,再执行构造函数体,这样就能在构造函数体内操作成员。
析构函数:先执行析构函数体,再析构成员,这样就能在析构函数体内操作成员。
3.静态成员
3.1静态数据成员的声明和实现要分开
头文件中:
class HasPtr { public: HasPtr(int *p=nullptr) :ptr(p) {} private: const int *ptr; static int count;//声明了一个静态成员,类外还要定义一下,否则error LNK2001: 无法解析的外部符号 "public: static int HasPtr::count" (?count@HasPtr@@2HA) };
cpp文件中:
int HasPtr::count = 1;//不需要static
3.2静态数据成员保存在全局数据区
3.3静态成员函数通过类名调用,没有this指针:
cout << HasPtr::GetCount();
原文:https://www.cnblogs.com/Nutshelln/p/12884864.html