Item 4:确定对象被使用前已先被初始化【effective C++读书笔记】

版权声明:本文为博主原创文章,转载请注明出处并附带本文链接。 https://blog.csdn.net/IOT_Flower/article/details/78561942

使用未初始化的值可能会导致意料之外的结果,因此在使用前最好先做好初始化工作。

存在规则用于描述“对象的初始化动作何时一定会发生,何时不一定发生”。一般来说,C part of C++Item 1)初始化可能招致运行期成本,那么就不保证发生初始化,但对于non-C parts of C++则不然。例如数组(C)不保证其内容被初始化,而vectorSTL)则不然。

 

对于内置类型必须手动初始化,因为C++不保证初始化它们,如:int i = 5;

对于内置类型以外的任何其他东西,初始化由构造函数完成。要分清楚构造函数中赋值与初始化的差别,构造函数最好使用成员初值列的方法

 

class A{

private:

         int a;

         std::string b;

};

 

赋值(实质上先调用了默认构造函数,再在构造函数内进行赋值):

A::A(int c, std::string d)    //构造函数

{

         a = b;          //赋值

         b = d;          //赋值

}

 

初始化:(使用成员初值列的做法,直接在调用构造函数的时候指定初始化值,只调用了一次拷贝构造函数,更高效)

A:A(int c, std::string d)      //构造函数

         :a(c),          //注意a为内置类型变量,必须初始化,否则没有初值可能会带来意想不到的结果

         b(d)           //b为用户自定义类型,如果不带参初始化则调用b的默认构造函数

{

         //空

}

 

为免除“跨编译单元之初始化次序”问题,应以本地静态对象替换非本地静态对象。

C++保证了函数内的本地静态对象会在函数被调用期间以及首次遇到该对象定义式时被初始化,所以只要用函数调用的方式返回对象的引用,就可以代替直接访问对象的方式同时确保初始化次序。

 

*注意,所有包含有静态对象的函数都有可能在多线程环境下碰见意料之外的问题,处理方法是:在程序的单线程启动阶段手工调用所有引用返回函数,这可消除与初始化有关的 “竞速形势”

猜你喜欢

转载自blog.csdn.net/IOT_Flower/article/details/78561942