默认构造与特殊的成员变量之间的关系

来源:互联网 发布:天猫化妆品销售数据 编辑:程序博客网 时间:2024/06/10 20:06

这次,我们先从一个简单的类开始说起

#pragma onceclass CTestA{public:CTestA(void);~CTestA(void);};

class CTestB{public:CTestA t;};
先实例化类CTestB的一个对象
CTestB  tb;
在此,会调用编译器为CTestB,生成的一个默认构造也就是一个空的构造函数(CTestB(void){} ),

那么CTestA t,成员变量是如何被初始化的呢?

在编译器生成的默认构造函数中会隐式地为类类型和它的基类调用有关的默认构造函数,

在CTestB中成员 t 是类类型,所以在实例化CTestB对象时,会调用类CTestA的构造函数

好吧,咱们来测试一下:

#pragma onceclass CTestA{public:CTestA(int);//防止编译器生成默认构造函数~CTestA(void);class CTestB{public:CTestA t;};

编译一下,出错,结果

 error C2512: “CTestB”: 没有合适的默认构造函数可用
修改一下,成功编译
#pragma onceclass CTestA{public:CTestA(){};~CTestA(void);class CTestB{public:CTestA t;};

我们在引申一下
class CTestA{public:~CTestA(void){};public:const int i;const int ri;};CTestA a;

上面 的例子能正常编译通过吗?

编译器添加一个默认构造函数形式如下:

CTestA( void ) {  } ;

两个成员

const int i;const int& ri;
const和引用必须进行初始化,包含const和引用成员的类不能进行默认构造,除非显示地提供默认构造。

CTestA():i(0),ri(i){};
添加一个带有成员初始列表的构造函数,即可。


原创粉丝点击