08. 常量成员函数,构造函数初始值列表,静态成员
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();
3.4应用举例:存取配置信息
//存取配置信息,优点:可用于多种文件格式,txt,xml,json等
//类中定义一个静态成员,静态成员类似全局变量,程序启动时自动调用构造,程序退出时自动调用析构
//将构造析构定义为私有,不提供给外部使用,防止错误操作
class Config {
public:
static int GetWidth() { return width; }
static int GetHeight() { return height; }
private:
Config() {
//从文件读配置信息
cout << "read" << endl;
}
~Config() {
//写配置信息到文件
cout << "write" << endl;
};
static int width;
static int height;
static Config config;
};
int Config::width = 800;
int Config::height = 600;
Config Config::config;

浙公网安备 33010602011771号