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

来源:互联网 发布:js下载文件进度条 编辑:程序博客网 时间:2024/05/15 05:36

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


        永远在使用对象之前先将它初始化。对于无任何成员的内置类型,你必须手工完成此事。至于内置类型以外的任

其它东西,初始化责任落在构造函数身上,确保每一个构造函数都将对象的每一个成员初始化。

    

    1、 赋值和初始化:
   
 C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。所以应将成员变量的初始化置于构造函数

的初始化列表中。


    
 ABEntry::ABEntry(conststd::string& name, const std::string& address,
                                   const std::list<PhoneNumber>& phones)

     { 
           theName = name;               //这些都是赋值,而非初始化
           theAddress = address;         //这些成员变量在进入函数体之前已调用默认构造函数,接着又调用赋值函数
           thePhones = phones;           //即要经过两次的函数调用。           
           numTimesConsulted = 0;
    } 

    
ABEntry::ABEntry(conststd::string& name, const std::string& address, const std::list<PhoneNumber>& phones) 

 : theName(name),                   //这些才是初始化 
       theAddress(address),               //这些成员变量只用相应的值进行拷贝构造函数,所以通常效率更高
       thePhones(phones),
       numTimesConsulted(0)
        {    } 


   
 所以,对于非内置类型变量的初始化应在初始化列表中完成,以提高效率。

    而对于内置类型对象,如numTimesConsulted(int),其初始化和赋值的成本相同,但为了一致性最好也通过成员

初始化表来初始化。如果成员变量时const或reference,它们就一定需要初值,不能被赋值。


     C++有着十分固定的“成员初始化次序”。基类总是在派生类之前被初始化,而类的成员变量总是以其说明次序被初

始化。所以:当在成员初始化列表中列各成员时,最好总是以其声明次序为次序。
  

 2、 请记住:

  • 为内置对象进行手工初始化,因为C++不保证初始化它们;
  • 构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。初始化列表列出的成员变量,其排列次序应该和它们在类中的声明次序相同;
  • 为免除跨编译单元之初始化次序问题,请以local static对象替换non-local static对象。   
原创粉丝点击