本文共 2148 字,大约阅读时间需要 7 分钟。
目录
类的声明中,可以包含自身类型的一个static对象,也可以包含自身类型的一个指针,但是,不能包含一个自身类型的non-static对象。
1.自身类型的静态对象
类可以拥有自身类型的静态对象。
下面程序可以正常运行。
#includeusing namespace std;class Test { static Test self; //合法声明};int main(){ Test t; return 0;}
2.自身类型的指针
类可以拥有自身类型的指针。
下面的这个程序也能正常运行。
#includeusing namespace std; class Test { Test * self; //合法声明 }; int main(){ Test t; return 0;}
3.自身类型的非静态对象
类不能声明自身类型的非静态对象。
下面程序会编译失败。
#includeusing namespace std; class Test { Test self; // 非法声明 }; int main(){ Test t; return 0;}编译器报错:..\src\test.cpp:6: error: field `self' has incomplete type
这是因为:
如果一个非静态对象做为类成员,则类的声明不是完整的,编译器无法计算出类对象的大小。 而静态变量不会计算在类的大小中,所以即使包含自身类型的静态变量,也是合法的。 对于编译器来说,所有的指针都有着固定的大小(32位系统中为4字节),不论它指向的是什么类型的数据。所以也是合法的。4.使用静态对象的场景
下面代码演示了使用自身类型的静态对象的作用:
#includeusing namespace std;class Singleton{private: static bool instanceFlag; static Singleton *single; Singleton() { //private constructor }public: static Singleton* getInstance(); void method(); ~Singleton() { instanceFlag = false; }};bool Singleton::instanceFlag = false;Singleton* Singleton::single = NULL;Singleton* Singleton::getInstance(){ if (!instanceFlag) { single = new Singleton(); instanceFlag = true; return single; } else { return single; }}void Singleton::method(){ cout << "Method of the singleton class" << endl;}int main(){ Singleton *sc1, *sc2; sc1 = Singleton::getInstance(); sc1->method(); sc2 = Singleton::getInstance(); sc2->method(); return 0;}
输出:
Method of the singleton class Method of the singleton class5.可以使用非静态对象的场景
下面代码演示了什么情况下可以使用自身类型的非静态对象。
#includeusing namespace std;class Dummy{ char c; int current; //Dummy dummyObj; // 编译错误public: //Dummy dummyObj; // 编译错误 Dummy() { c = 'N'; //Dummy dummyObj; // 可以编译通过,但是导致死循环 } void updateDummy(int curr) { current = curr; Dummy dummyObj_1; // 正常工作 } void printDummy() { cout << current << endl; Dummy dummyObj_2; // 正常工作 }};int main(){ cout << "sizeof(Dummy) " << sizeof(Dummy) << endl; Dummy d; d.updateDummy(888); d.printDummy(); Dummy d2(d); d2.printDummy(); return 0;}
输出:
sizeof(Dummy) 8 888 888 结论:成员函数中可以包含对象类型,但是构造函数中不行。转载地址:http://uqeji.baihongyu.com/