博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类与对象(2) - class可以拥有自身类型的对象
阅读量:4071 次
发布时间:2019-05-25

本文共 2148 字,大约阅读时间需要 7 分钟。

目录


类的声明中,可以包含自身类型的一个static对象,也可以包含自身类型的一个指针,但是,不能包含一个自身类型的non-static对象。

1.自身类型的静态对象

类可以拥有自身类型的静态对象。

下面程序可以正常运行。

#include
using namespace std;class Test { static Test self; //合法声明};int main(){ Test t; return 0;}

2.自身类型的指针

类可以拥有自身类型的指针。

下面的这个程序也能正常运行。

#include
using namespace std; class Test { Test * self; //合法声明 }; int main(){ Test t; return 0;}

3.自身类型的非静态对象

类不能声明自身类型的非静态对象。

下面程序会编译失败。

#include
using 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.使用静态对象的场景

下面代码演示了使用自身类型的静态对象的作用:

#include 
using 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 class

5.可以使用非静态对象的场景

下面代码演示了什么情况下可以使用自身类型的非静态对象。

#include 
using 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/

你可能感兴趣的文章
Ajax中的get和post请求比较
查看>>
'VBoxManage' is not recognized as an internal or external command, operable program or batch file.
查看>>
Linux VNC server的安装及简单配置使用
查看>>
解决RHEL6 vncserver 启动 could not open default font 'fixed'错误.
查看>>
Linux 下路由的设置
查看>>
CentOS/Linux 网卡设置 IP地址配置
查看>>
Python实现ping指定IP
查看>>
linux下ping命令使用详解
查看>>
html引入jquery库
查看>>
js与jq比较
查看>>
js学习一数组类型foreach方法
查看>>
js学习二函数
查看>>
js学习三-日期Date
查看>>
js学习五-JSON
查看>>
linux下安装django
查看>>
Python django报错ImportError: cannot import name find_spec
查看>>
js学习六-闭包
查看>>
Django入门
查看>>
宏内核与微内核、Linux内核与Unix内核的区别
查看>>
Django视图模板
查看>>