高效C++ --经验条款(三)
给多态基类声明virtual析构函数:
“给base classes一个virtual析构函数”,这个规则只适用于带有多态性质的base classes身上。这种base classes的设计目的是为了用来“通过base class接口处理derived class对象”。
并非所有base classes的设计目的都是为了多态用途。例如标准stirng和STL容器都不被设计作为base classes使用,更别提多态了。某些classes的设计目的是作为base classes使用,但不是为了多态用途。有些类并非被设计用来“经由base class接口处置derived class对象”,因此他们不需要virtual析构函数。
带多态性质的baseclasses应该声明一个vitual析构函数。如果class带有任何virtual函数,他就应该拥有一个virtual析构函数。
Classes的设计目的如果不是作为baseclasses使用,或不是为了具备多态性,就不该声明virtual析构函数。
不要在构造和析构函数中调用virtual函数
将operator=操作符返回reference *this
注意在operator=中处理“自我赋值”
在自定义的operator=中,一定要明确将所有成员都进行复制,特别是有继关系在内时。
标准库中auto_ptr类似智能指针的unique_ptr,他只能指向唯一一个对象,若通过copy构造函数或copy assignment操作符复制他们,他们会变成NULL,而复制所得的指针将取得资源的唯一拥有权力。受auto_ptr管理的资源必须绝对没有一个以上的auto_ptr同时指向它。
Auto_ptr和shared_ptr两者都在其析构函数内做delete而不是delete[]动作,那意味在动态分配而得的array身上使用auto_ptr或shared_ptr不是一个好主意。
其实New和delete有很多中使用方法和含义,这里说最经典的一个使用方法,使用New动态生成一个对象:
当使用New动态生成一个对象时,有两件事情发生。第一,内存被分配出来(通过名为operator new的函数),第二,针对此内存会有一个(或更多)构造函数被调用。当你使用delete,也有两件事情发生,针对此内存有一个(或多个)析构函数被调用,然后内存才被释放(通过名为operator delete的函数)。Delete的最大问题在于:即将被删除的内存之内究竟存有多少对象?这个问题的答案决定了由多少个析构函数必须被调用起来。也就是说即将被删除的那个指针,所指的是单一对象或对象数组?
这样就会有一个问题,如果你使用的new表达式中使用[],必须在相应的delte表达式中也使用[]。如果在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。
先记住,这是new的第一种使用方法,往后还会介绍New的别的使用方法。
在使用智能指针时,以独立语句将newed对象存储于(置于)智能指针内。也就是说,比如一个函数的一个参数是智能指针的,那么不要在传递参数的时候完成指针指针额初始化,首先初始化,然后传递初始化好的东西。不然可能会造成错误。