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

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

#pragma once

class CTestA
{
public:
	CTestA(void);
	~CTestA(void);
};

class CTestB
{

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

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

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

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

好吧,咱们来测试一下:

#pragma once

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

class CTestB
{
public:
	CTestA t;
};

编译一下,出错,结果

 error C2512: “CTestB”: 没有合适的默认构造函数可用
修改一下,成功编译
#pragma once

class 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){};
添加一个带有成员初始列表的构造函数,即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值