C++ 的 Rule-of-Three

本文介绍了C++中的Rule-of-Three概念,包括copy constructor、copy assignment operator和destructor。当类中包含需要手动管理的资源时,为确保正确拷贝和赋值,需要遵循Rule-of-Three规定,否则可能导致程序崩溃。文章通过示例说明了为什么需要制定这一规则,并提出了两种解决策略。
摘要由CSDN通过智能技术生成

Three 為何物?

所谓的 Three 其实就是 copy constrcutor (拷贝构造函数)copy assignment operator (拷贝赋值操作符)destructor (析构函数) 。 在介绍 Rule-of-Three 之前,我们回顾一下 C++ Class 的声明与定义。

class Empty 
{
   
private:
	int _val {
    0 };
}; 

class Empty 十分简单,我没有为它赋予任何 data members (数据成员) 或显式地声明/定义 member functions (成员函数) 。但事实上,在必要时编译器为 class Empty 合成必要的成员函数。此话何解?我们不妨来看一下示例。

int main()
{
   
    Empty e1 {
   }; // 创建一个Empty对象
	Empty e2 {
    e1 }; // 通过一个已有的Empty对象给另外一个Empty对象初始化
	
	Empty e3;
	e3 = e2; // 通过一个已有的Empty对象给另外一个Empty对象初始化
}

当我们需要创造 Empty e1 这个对象的时候,届时我们没有为 class Empty 显式地编写构造函数函数。编译器自然会为我们补充如下的一个 default constructor (默认构造函数)注意:我只是在模仿编译器的行为,并不代表编译器的具体做法必须跟我的做法一样。

// C++ 概念代码
Empty::Empty()
{
   
	// 啥也不干
}

当我们需要通过 Empty e1 去构造更多的相同类型对象的时候,编译器又帮我们做了以下的事情。编译器会为 class Empty 添加拷贝构造函数 Empty::Empty(const Empty&) 和拷贝赋值操作符 Empty& operator=(const Empty& other)

事实上就 class Empty 的结构而言,编译器根本不需要生成拷贝构造函数和拷贝赋值操作符。因为 class Empty 的数据成员里根本没有 class object (类对象)。编译器只需要通过 bitwise copy (位逐次拷贝) 把对象的内存逐一拷贝就能完成任务,简化了拷贝流程。为了更好地演示 Three ,我就假设编译器会自动生成所需要的函数。

注意:我只是在模仿编译器的行为,并不代表编译器的具体做法必须跟我的做法一样。

// C++ 概
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值