Effective C++读书笔记之条款05 了解C++默默编写并调用哪些函数。

条款05 了解C++默默编写并调用哪些函数。

1、我们编写的每个类几乎都有一个或多个构造函数、一个析构函数和一个赋值运算符。 他们操控类对象基本的生死行为。
2、如果自己没有声明,编译器就会为类声明一个default 构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数。 所有这些函数都是 public 而且 inline(第30条)。
PS:空类(empty class):https://www.jianshu.com/p/ff9eb9c381c1

class EmptyClass 
{
public:
	EmptyClass();//default构造
	~EmptyClass();//析构
	EmptyClass(const EmptyClass&);//拷贝构造
	EmptyClass& operator=(const EmptyClass& res);//copy assignment操作符
};

3、唯有这些函数被调用,它们才会被编译器创建出来。
Empty e1; // default构造函数
Empty e2(e1); // copy构造函数
e2 = e1; // copy assignment操作符
4、当类成员为reference或者是const时,编译器拒绝为class生成一个operator=(copy assignment)。
这是因为:①、c++并不允许让reference改指向不同的对象②、const声明的变量也不允许被修改。

class MyTest
{
public:
	MyTest(int nNum,string& str)
		:m_nNum(nNum),
		m_string(str)
	{
	}
private:
	const int m_nNum;
	string& m_string;
};
int main()
{
	int x(111);
	string s = "123ABC";
	MyTest t(x, s);

	int xx(111);
	string ss = "123ABC";
	MyTest tt(xx, ss);

	tt = t;//error
	cin.get();
	return 0;
}

在这里插入图片描述
此时编译器为之构造的函数就不能解决问题,这种情况下就需要自己来定义copy assignment操作符的函数。
5、总结。
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment函数,以及析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值