Inside the c++ object model读书笔记之拷贝构造函数(二)

在上一篇中提到编译器会在需要的时候合成一个拷贝构造函数,有以下四种情况如果没有提供显示的拷贝构造函数,编译器会合成一个构造函数,来完成一些必要的操作:

1.在一个类中,有一个类成员变量,且这个这个成员变量的类中提供了一个拷贝构造函数(此处的构造函数可以是显式声明的也可以是编译器合成的),这时候会需要编译器来合成一个拷贝构造函数,以便调用成员变量的类中的拷贝构造函数

class Base
{
public:
	Base()
	{}
	~Base()
	{}
    Base(Base& obj)
	{
		cout << "This is base copy constructor!" <<  endl;
	}
};
class Derived
{
public:
	Derived()
	{}
	~Derived()
	{}
public:
	Base obj;
};
Derived obj;
Derived Obj(obj);
测试结果为:

说明了此时编译器为Derived类合成了一个拷贝构造函数,在合成的拷贝构造函数中调用了Base的拷贝构造函数,上面说了成员变量的类无论是显式声明的拷贝构造函数还是编译器合成的拷贝构造函数,都会触发编译器去为该类合成一个拷贝构造函数,请看如下例子:

class Test
{
public:
	Test()
	{}
	~Test()
	{}
public:
	Derived m;
}; 
Test obj;
Test Obj(obj);
测试结果为:

此时的Test类中有个Derived类对象,而该类有一个编译器合成的拷贝构造函数,所以编译器也需要为Test合成一个拷贝构造函数来调用Derived的拷贝构造函数。


2.当一个类的基类有一个拷贝构造函数时(无论是编译器合成的还是显式声明的),编译器会给子类合成一个拷贝构造函数。

class Base
{
public:
	Base()
	{}
	~Base()
	{}
    Base(Base& obj)
	{
		cout << "This is base copy constructor!" <<  endl;
	}
};
class Derived : public Base
{
public:
	Derived()
	{}
	~Derived()
	{}
};
Derived obj;
Derived Obj(obj);
测试结果为:


说明在基类有显式的拷贝构造函数时,编译器会为子类合成一个拷贝构造函数,合成的拷贝构造函数调用父类的拷贝构造函数,当基类中没有显式的拷贝构造函数,但是有编译器合成的构造函数时,子类也会合成一个拷贝构造函数:

class Test : public Derived
{
public:
	Test()
	{}
	~Test()
	{}
}; 
Test obj;
Test Obj(obj);
测试结果为:


说明在父类中有编译器合成的拷贝构造函数时,子类也需要合成一个拷贝构造函数,来调用父类的拷贝构造函数。

除了以上这两种情况以外还有两种情况,编译器也会合成一个默认的拷贝构造函数,由于另外两种情况较为复杂,将在下一篇文章中分析。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值