effective c++

  • 条款1:视C++为一个语言联邦:C、Object-Oriented C++、Template C++、STL

对于内置类型pass-by-value 比pass-by-reference高效,用户自定义类型pass-by-reference-to-const更好

STL中迭代器和函数对象都是在C指针的基础上塑造出来的,所以旧式的C pass-by-value再次试用

  • 条款2:尽量以const,enum,inline替换#define

1、对于单纯的常量,最好以const对象或enums替代#define

2、对于形似函数的宏,最好用inline函数替代#define

因为使用的#define 的变量未进入编译器的记号表(symbol table)

#define ASPECT_RATIO 1.63 ==>const double AspectRatio = 1.63

  • 条款3:尽可能使用const

void f1(const  Widget* pw)  <=> void f2(Widget const *pw)     //等价,f1/f2获得一个指针,指向一个常量的(不变的)Widget对象

  • 条款4:确定对象使用前已被初始化。

对内置类的对象进行手工初始化,因为C++不保证初始化它们。

构造函数最好使用成员初值列,而不要在构造函数内使用赋值操作。前者效率更高,后者要先调用 default构造再赋值

为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。????

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

9、编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。是 public且 inline 的

10、当手工创建一个构造函数后,编译不会再创建default构造函数。

11、内含引用或const成员,编译器不会创建copy assignment操作符。

class Empty{}
==》
class Empty{
    public:
       Empty(){}    
       Empty(const Empty& rhs){}
       ~Empty(){}    
       Empty& operator=(const Empty& rhs){} //拷贝复制函数
}
  • 条款6:若不想使用编译器自动生成的函数,应该明确拒绝。

12、为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。

  • 条款7:为多态基类声明virtual析构函数。

13、polymorphic带有多态性质的base classes 应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。当子类以父类指针的形式被析构时,子类对象的成分没有被销毁,故需要将父类的析构函数需要为virtual

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

15、若父类带有pure virtual(纯虚函数)时,子类的析构函数中会有对父类析构函数的调用,因此必须为父类的纯虚函数提供一份定义。

  • 条款8:别让异常逃离析构函数。

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

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

  • 条款9:绝不在构造和析构过程中调用virtual函数。

18、子类构造时,先调用base class,此时子类被认为是一个base class。析构时先调用自身的析构函数,再调用base class的析构函数。

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

Widget& operator=( constWidget& rhs){... return* this;}

  • 条款11:在operator=中处理“自我赋值”

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

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

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

资源管理:

  • 条款13:以对象管理资源。

25、以对象管理资源的两个关键想法:

(1)、获得资源后立刻放进管理对象。资源获取时机便是初始化时机。

(2)、管理对象运用析构函数确保资源被释放。

26、使用shared_ptr智能指针。

条款14:在资源管理类中小心copying行为。

 

 

 

转载于:https://my.oschina.net/u/347414/blog/2999366

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值