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

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

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

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

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

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

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

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

时间: 2024-10-07 19:27:06

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

effective c++ 条款 04 (对象初始化)整理

确定对象使用前已被初始化 原则:不论是类的成员变量还是其他作用域的变量,使用前都要保证已被初始化(或者说赋值) 一.无任何成员的内置类型初始化 /*内置类型通过复制完成初始化*/ int x = 0; const char* a = "abc"; int a[2] = {0,0}; 二.STL容器初始化 STL容器关注容器大小,防止越界,初始化的工作不用关心 三.类成员变量初始化 参考:http://www.cnblogs.com/BlueTzar/articles/1223169.h

Effective C++ 条款四 确定对象被使用前已被初始化

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

04——确定对象使用前被初始化

内置类型手动初始化 类类型-构造函数(确保构造函数将对象的每个成员都初始化) 类构造函数初始化列表与函数体内赋值的区别: 效率更高 函数内的赋值语句执行时先执行成员的默认构造函数,再执行copy assignment 初始化列表直接执行一次 copy构造函数 含有const成员.reference成员时需使用初始化列表 基类的初始化 成员的初始化次序: 先基类,够派生类 class成员的初始化次序为其声明次序 04--确定对象使用前被初始化

Effective C++ 之 Item 4:确定对象被使用前已先被初始化

Effective C++ Effective C++ Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure that objects are initial

Effective C++ Item 4 确定对象被使用前已先被初始化

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验1:为内置对象进行手工初始化,因为C++不保证初始化它们 示例: int x = 0;//对int进行手工初始化 const char *text = "A C-style string"; //对指针进行手工初始化 double d; std::cin >> d;//以读取input stream的方式完成初始化 经验2:构造函数最好使用成员初值列 (membe

[effictive c++] 条款04 确定对象被使用前已被初始化

成员初始化 在c和c++ 中,使用为初始化的类型常常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个很好的习惯. 永远在使用之前对对象进行初始化.对于无任何成员的内置类型,你必须手工完成初始化操作.因为c++不保证初始化他们. 内置类型意外的其他东西,初始化责任落在构造函数身上.但要注意区分构造函数中的变量是赋值还是初始化.举个例子 class PhoneNumber{...}; class ABEntry{ public: ABEntry(

Effective C++ 条款4 确定对象被使用前已被初始化

1. 对于内置类型,如果变量在全局作用域内定义,默认初始化为0,如果变量在局部作用域内定义,默认不进行初始化; 对于类类型,默认调用默认构造函数进行初始化,如果没有默认构造函数,则必须显式初始化. 2. 构造函数对成员进行初始化的动作发生在初始化列表中而不是函数体内,在函数体内进行的"初始化"实际上是赋值,对于类类型,降低了程序效率,对于内置类型在初始化列表还是在函数体内初始化对于效率没有影响,但在某些特殊情况(例如const变量和引用)必须在初始化列表进行初始化. 3. 类类型的构造

Effective C++学习笔记 条款04:确定对象被使用前已先被初始化

一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. 1 class A 2 { 3 public: 4 A(const string &str) 5 { 6 m_str = str; //m_str 的初始化是在进入构造函数中用户自定义编写代码前完成的,所以这里的m_str = str,执行的不是初始化,而是赋值 7 } 8 private: 9 string m_str;

条款04:确定对象使用前已被初始化

目录 1. 总结 2. 构造函数体 VS 初始化列表 3. 对象的初始化顺序问题 1. 总结 无论是在初始化列表中,还是在构造函数体内,请为内置类型对象进行手工初始化,因为C++不保证初始化它们 最好使用初始化列表进行初始化,而不要在构造函数体中使用赋值:初始化列表最好列出所有的成员变量,其排列顺序应该和它们在class中的声明顺序相同 为了避免"不同源文件内定义的non-local static对象在编译时的初始化顺序"问题,请以local static对象替换non-local s