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;

  

posted @ 2020-05-13 20:59  八转达人  阅读(208)  评论(0)    收藏  举报