当前位置:编程学习 > C/C++ >>

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

 

 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 ;

}

 



摘自 Cql_liliang‘s Blog
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,