Effective C++改善程序与设计的55个具体做法 2. 构造/析构/赋值运算

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

编译器可以暗自为 class 创建 default 构造函数、 copy 构造函数、 copy赋值操作符,以及析构函数。

个人理解:

条款 06: 若不想使用编译器自动生成的函数,就该明确拒绝

为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private 并且不予实现。使用像 Uncopyable 这样的 base class 也是一种做法。

个人理解:防止编译器默认的行为(方法)出现和预期不符合的现象。方法一是在链接期阻止,方法二是在编译器组织;方法二也存在可能存在多重继承的问题。

条款 07: 为多态基类声明 virtual 析构函数

polymorphic (带多态性质的) base classes 应该声明一个 virtual 析构函数。如果class 带有任何 virtual 函数,它就应该拥有一个 virtual 析构函数。

Classes 的设计目的如果不是作为 base classes 使用,或不是为了具备多态性(polymorphically) ,就不该声明 virtual 析构函数。

个人理解:派生类析构的时候,析构基类的函数。

条款 08: 别让异常逃离析构函数

析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。

如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么 class 应该提供一个普通函数(而非在析构函数中)执行该操作。

个人理解:当析构多个对象时,每个对象都抛出异常 会出现未定义的行为;

条款 09: 绝不在构造和析构过程申调用 virtual 函数

构造和析构期间不要调用 virtual 函数,因为这类调用从不下降至 derived class(比起当前执行构造函数和析构函数的那层)。

个人理解:在构造函数中使用析构函数,对象还没有被创建,无法执行析构函数;在析构函数中执行virtual函数,如果virtual 函数下沉到派生类,但是派生类已经被析构了。

条款 10: 令 operator= 返回一个 reference to *this

令赋值( assignment) 操作符返回一个 reference to *this 。

个人理解:连锁反应,ostream 这个协议不仅适用于以上的标准赋值形式,也适用于所有赋值相关运算。

class Widget {
	public:
		...
		Widget& operator=(const Widget& rhs) 
    { 
			return *this;
    }
		...
}

条款 11: 在 operator= 申处理"自我赋值“

确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较"来源对象"和"目标对象"的地址、精心周到的语句顺序、以及copy-and-swap 。

确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

个人理解:考虑入参的特殊情况,不能直接删除原来的内存。

条款 12: 复制对象时勿忘其每一个成分

Copying 函数应该确保复制"对象内的所有成员变量"及"所有 base class 成分"。

不要尝试以某个 copying 函数实现另一个 copying 函数。应该将共同机能放进第三个函数中,并由两个 coping 函数共同调用。

个人理解:防止出现未定义的数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值