Effective C++ 阅读笔记 02:构造/析构/赋值运算

本文详细阐述了C++编程中的几个关键原则,包括理解编译器默认生成的函数、禁用不需要的函数、声明虚析构函数以实现多态、避免析构函数中抛出异常、不在构造和析构中调用虚函数、正确实现赋值运算符、处理自我赋值情况、以及确保对象复制的完整性。这些实践对于编写高效、健壮的C++代码至关重要。

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

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

请记住

编译器会缺省地为类创建默认构造函数、复制构造函数、赋值复制操作符以及析构函数。

我的理解

确实如此。


条款06:显示地拒绝哪些你并不想使用的编译器自动生成的函数

请记住

为实现这一条款,可以将相应的成员函数声明为private,并且不予实现。

我的理解

这种情况出现于单例模式等现象中,比如我们不希望实例出现多份副本,那么我们就要按照如上所说的,禁止掉缺省的复制与辅助操作。


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

请记住

  • 多态基类应该声明虚析构函数。如果类带有任何虚函数,那么析构函数应该也是虚的。
  • 如果不是做虚基类,就不要声明虚析构函数。

我的理解

简单来说,当且仅当声明虚基类时,使用虚析构函数。
如果是虚基类,那么在派生类调用析构函数时,会先调用虚基类的析构函数,如果该函数非虚,那么后果很可能是,基类部分被删除,而派生类部分未被删除(具体原因未知,书41页)。
如果是非虚基类,使用了虚构造函数,会增加类的负担,也不好。


条款08:不要在析构函数中写异常(书上翻译很奇怪,我改了下说法)

请记住

  • 析构函数绝对不要抛出异常。如果一定要处理异常,请写一个catch来处理,或者直接终止程序。
  • 在不同函数中处理运行抛出的异常,而不是析构函数。

我的理解

如果生成一个自定义类的向量,在删除该向量时,要调用多次析构函数,如果析构函数会抛出异常,那就很难办了,所以应按照上述两种方法之一来进行解决。


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

请记住

在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。

我的理解

确实如此,遵守就好。


条款10:operator=应该返回*reference to this

请记住

赋值运算符返回一个this指针的解引用的引用

我的理解

确实如此,包括+=,-=也是。


条款11:operator=应该能处理给自己赋值

请记住

确保当对象自我赋值时,operator=有良好行为。
确定任何函数在操作对象为多个,且有可能多个对象指向同一个对象时,行为仍然正确。

我的理解

实现这一条款的方法如下:

Object& operator=(const Object& others) {
	Object* pOrig = po;	// 记住原先的指针
	po = new Object(*others.po);	// 将po指向others.po的一个副本
	delete pOrig;	// 删除原先的指针
	return *this;
}

条款12:复制对象时保证复制完全

请记住

  • 复制函数要确保复制基类和派生类中的所有内容。
  • 不要用某个copying函数实现另一个copying函数。应该把共同机能放进第三个函数中,并由两个copying函数共同调用。

我的理解

轻易不要自己写复制函数,如果要写,一定要小心,确保复制的完全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值