Effective c++条款5:编译器默默生成并调用的哪些函数

本文详细介绍了C++中的空类默认包含的构造函数、析构函数等,以及默认的拷贝构造函数的工作原理。特别讨论了当类中包含引用或const成员时,为何需要自定义赋值操作符函数,并通过实例展示了编译失败的情况。强调了自定义这些函数的重要性以及编辑器生成函数的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

1.空类包含的哪些函数

2.一个默默生成的copy构造函数的过程

3.当类中有引用成员或const成员,需要自己定义赋值操作符函数


1.空类包含的哪些函数

对于我们写的一个空类代码1,其实相当于代码2,当相应的构造、析构等被用到的时候,编辑器就会默默生成出来并调用。

//代码1
class empty{

};

//代码2
class empty{
public:
	empty(){ }                               //构造函数
	empty(const empty& tmp){ }               //拷贝构造函数
	empty& operator=(const empty& tmp){ }    //赋值操作符函数
	~empty(){ }                              //析构函数
};

题外话:一个空类占用的是一个字节的空间,这是因为不同的对象不能占用同一块内存空间。

2.一个默默生成的copy构造函数的过程

class temp{
public:
	temp(string m_name, int m_age) :name(m_name), age(m_age){

	}
	~temp(){ }
private:
	string name;
	int age;
};

temp t1("bin", 5);
temp t2(t1);

看上述例子,我们定义的类中没有写拷贝构造函数与赋值操作符函数,t2对象会调用copy构造函数。对于编辑器生成的拷贝构造函数将t1.name与t1.age为初值初始化t2.name与t2.age。对于name的string类型,是调用string的拷贝函数进行初始化,对于age的int内置类型,是拷贝t1.age的每一位进行初始化。编辑器默默生成的拷贝构造函数也就完成了任务。

注:当我们在类中自己定义了构造、析构、拷贝构造、赋值函数后,编辑器就不会生成相对应的函数进行调用。

3.当类中有引用成员或const成员,需要自己定义赋值操作符函数

class temp{
public:
	temp(string m_name, int m_age) :name(m_name), age(m_age){

	}
	~temp(){ }
private:
	string& name;
	const int age;
};

temp t1("bin", 5);
temp t2("fen",5);

t1=t2

上述例子是编译不通过的,因为对于引用成员来说,C++不允许引用改变指向不同的对象,默认的赋值操作符函数并不能解决这个问题。const同理。所以此时我们需要自己定义赋值运算符函数。

注:当父类中赋值运算符函数设置为私有,对于子类来说,编辑器拒绝为其生成赋值操作符函数。

参考 《Effective c++》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值