码迷,mamicode.com
首页 > 编程语言 > 详细

高效C++ --经验条款(三)

时间:2014-12-14 22:47:10      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:c++

高效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对象存储于(置于)智能指针内。也就是说,比如一个函数的一个参数是智能指针的,那么不要在传递参数的时候完成指针指针额初始化,首先初始化,然后传递初始化好的东西。不然可能会造成错误。

高效C++ --经验条款(三)

标签:c++

原文地址:http://blog.csdn.net/yusiguyuan/article/details/41930603

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!