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

《Effective C++》——条款04:确定对象使用前已先被初始化

时间:2015-07-11 10:37:17      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

  读取未初始化的值会导致不明确的行为。在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以及许多令人不愉快的调试过程。

  • 对于内置类型的对象手动初始化
  • 对于内置类型以外的任何其他东西,初始化责任落在构造函数身上。

   但要区别赋值和初始化。对象的成员变量的初始化动作发生在进入构造函数本体之前。

技术分享

 在上述代码中,theName,theAddress和thephones都不是被初始化,而是被赋值。初始化的发生时间更早,发生于这些成员的默认构造函数被自动调用时(比进入ABEntry构造函数本体的时间更早)。但这对numTimesConsulted不为真,因为它属于内置类型,不保证一定在你所看到的那个赋值动作的时间点之前获得初值。

ABEntry构造函数的一个较佳写法是,使用初始化成员列表替换赋值动作:

技术分享

这个构造函数效率更高。基于赋值的那个版本首先调用默认构造函数为theName,theAddress和thePhones设初值,然后立刻再对它们赋予新值。默认构造函数的一切作为就因此浪费了。成员初始化列表避免了这一问题。因为初始化列表中针对各个成员变量而设的实参,被拿去作为各成员变量之构造函数的实参。本例中的theName以name为初值进行copy构造,theAddress以address为初值进行copy构造,thePhones以phones为初值进行copy构造。

  对大多数类型而言,比起先调用默认构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数时比较高效的。对于内置型对象,其初始化和赋值的成本相同,但为了一致性最好也通过成员初始化列表来实现。

《Effective C++》——条款04:确定对象使用前已先被初始化

标签:

原文地址:http://www.cnblogs.com/happygirl-zjj/p/4638120.html

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