Effective C++构造函数析构函数Assignment运算符

发表于:2012-7-23 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:啊汉    来源:51Testing软件测试网采编

  在看《Effective C++》这本书的过程中,我无数次的发出感叹,这他妈写得太好了,句句一针见血,直接说到点上。所以决定把这本书的内容加上自己的理解写成5篇博客,我觉得不管你是否理解这些条款,都值得你先记下来。下面的索引对应的是书中的章节。

  11:如果class内动态配置有内存,请为此class声明一个copy constructor和一个assignment运算符

  12:在constructor中尽量initialization动作取代assignment工作

  13:initialization list中的members初始化次序应该和其在class内的声明次序相同

  14:总上base class拥有virtual constructor

  15:令operator =传回*this的reference

  16:在operator=中为所有data member赋值

  17:在operator =中检查是否自己赋值给自己

  11:如果class内动态配置有内存,请为此class声明一个copy constructor和一个assignment运算符。

  默认的copy constructor和operator=不会对类的每个data member一一赋值,而是一个简单引用,让左边的对象指向右边对象所指的对象。再也没有起动作,如果这个类动态分配了内存,比如左边对象本来指向一块内存A,现在左边的对象指向右边对象所指的内存B了,而再也没有其他对象指向内存A,由于它是动态分配,不会自己回收,所以就出现内存泄露,还有就是两个对象指向同一块内存,如果其中一个对象出了其作用域,那么其析构函数将自动调用,其动态分配的内存将被回收,现在另一个对象却指向一块已经被回收的内存,只要一调用这个对象的数据,就会出现不可知的异常,还有一点值得一提,就算一个对象没有指向任何地址或是它所指的地址已经被回收了,在调用它的方法的时候,只要它的方法没有使用它的data member(肯定不存在),就不会出现任何问题,因为方法的内存是和对象类型一起分配,实例化一个对象的时候不会为方法分配内存,只会为data member及其他一些指针分配内存,如指向父类的指针,指向虚拟表的指针等。

  如11所述,如果不声明那两个方法,在方法调用的时候也会出现问题,当这个对象是以传值的方式被调用时,会产生一个临时变量,这个临时变量会引用这个对象,当方法执行完成,这个临时变量超出它的作用域,析构函数被调用,这个对象就这样被销毁了。所以你必须遵守这一条规则。

  12:在constructor中尽量initialization动作取代assignment工作

  对象的构造分两个阶段:

  1、data member被初始化

  2、被调用的构造函数执行起来

  如果在构造函数中对data member一一赋值,那么先要调用data member的构造函数,如果你没有为data member赋初值,那么调用的是默认的构造函数,如果你赋了初值调用的是copy constructor,但是我的编译器不允许data member在定义的时候赋初值,那么就是调用默认的构造函数,当你在构造函数内为data member赋值的时候调用operator =,相当于你调用了一次constructor和一次operator =,而initialization 只调用一次copy constructor,因为在data member初始化的时候已经为data member赋值了,在构造函数里面就不用为data member赋值了,经常会遇到这样的面试题:一个data member在定义的时候给他一个初始值,又在构造函数内赋另一个值,请问这个data member现在的值是多少?还有一些就是base class中的一个data member,多处赋值,然后问题最后它的值是多少?只要记住父类的构造函数在子类的构造函数之前执行,初始化参数在构造函数之前执行。

  总之一句话initialization效率比在构造函数中赋值的效率高,如果data member很多且需要初始化成同一个值,而且效率不是那么重要的话,可以在构造函数中用连等式赋值,这样会清晰明了一点。效率不是永远都放在第一位的,代码的可读性也很重要。82法则还记得吗,我曾经因为多写了一个if,在代码评审中被批评,理由就是100万访问的时候会影响效率,在两家公司遇到过这种情况,什么都是这个理由,百万级访问时会影响效率。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号