Effective C++笔记之三确定对象在使用前已初始化

来源:互联网 发布:淘宝 欧丽运动是正品吗 编辑:程序博客网 时间:2024/04/29 08:56

1.在同一个编译单元中对象的初始化.

class PhoneNumber{.....} ; 

class Info

{

    public:

        Info(const std::string name , const std::string address , const std::list<PhoneNumber> phonenum) : m_Name(name) , m_Address(address) ,                                                                                                                                                                                                                                                m_PhoneNum(phonenum)

        {}   

    private:

        std::string m_Name ; 

        std::list<PhoneNumber>   

         std::string m_Address ; 

} ;

 (1) . 注意若用赋值的方法逐个的赋值给相应的数据成员,这不是初始化,仅仅是赋值,并且这样的话,这个构造函数进行了两次赋值,传参的时候也要一次,所以这样的话导致效率低。

(2).要注意数据成员的初始化的顺序, 它是按照数据成员在类中的声明的顺序来初始化的,与你所写的初始化列表中的顺序无关!!

(3).如果有多个不同的构造函数的时候,并且,它们之间有很多的相同的数据成员时,可调用共同的私有的成员函数Init(),来进行初始化!!


2.若对象在不同的编译单元, 若在一个non-local static 对象要使用另外一个位于不同的编译单元的对象,这个时候就不能保证这个对象被使用前已被初始化,其实不同编译单元的对象之间的初始化顺序是不确定的。这样我们使用designe pattern 的Singleton模式的方法来解决,即:将每一个non-local static对象搬到自己的专属函数内(该对象被声明为static),此类函数返回一个reference指向它所含的对象,这时候当用户使用这些对象时,而不直接涉及这些对象,这时候调用的就是local static 对象了。

eg1:

class FileSystem          //文件系统class

{

    public:

        ..........

        std::size_t numDisk() const ;

} ;

FileSystem  tfs ;

假设客户建立一个管理系统文件的类

class Directory

{

        Directory(params) ;

} ;

Direcoty::Directory(params)

{

    std::size_t  disks = tfs.numDisks() ;      //此时使用的tfs对象可能还未初始化,所以有很大的漏洞

}

所以我们用上面的所说的方法来解决此问题:

class FileSystem{.....} ;  //类同上

FileSystem& tfs()

{

    static FileSystem fs ;

    return fs ;

}

class Directory{....}  //同上

Directory& DirecTemp()

{

    static Directory dirtemp ;

    return dirtemp ;

}


原创粉丝点击