在c++中对象在使用前应该初始化,对于初始化有两种一种是利用初始化列表初始化,另一种则是采用赋值的方式进行初始化,但是因为用列表初始化的效率会比用赋值符号初始化高效,所以,C++语言中建议用列表初始化完成对象的初始化。当用构造函数完成数据初始化时,应该确保每一个成员变量被初始化。
如下的赋值方式:
以上的方式不值得推崇,而使用成员列表初始化具有更高的效率,因为对于大多数的类型成员来说,先调用默认构造函数在调用赋值运算符的方式比单一的copy要低效。因此我们可以这样构造。
对于没有用参数的构造函数,我们可以调用相应成员的类型的默认构造函数来构造该成员。
事实上我们不需要记住那些成员需要初始化那些不需要,我们只需要将每一个成员都进行初始化就可以了。
对于构造函数初始化,编译器有相对固定的次序,先初始化基类的成员,而对于派生类的数据初始化,总是按照声明顺序初始化,即使在初始化列表中没有按照声明顺序写,编译器初始化的顺序也是按照声明顺序进行的。如果我们使用成员变量有要求则应该注意变量的声明顺序。
non-local static 对象的使用
local-static对象是指函数内部的数据对象,其他的static对象被称为none-local static 对象。包括 全局变量、命名空间内、类内和文件内的static对象。
如果某个编译单元内的某个none-local static对象的初始化动作使用了另一个编译单元的none-local static 对象,那么它所用到的数据对象可能是未定义的。
除非tfs在tempDir之前被初始化,否则tempDir的构造函数将会用到未初始化的tfs。
消除这种情况的方案:将每个non-loca static对象搬到自己的专属函数内,并将该对象声明为static,并返回指向该对象的引用。 这样将non-local static对象变成来local-static对象,而在C++语言中,函数内的local static对象将会在该函数被调用期间,该变量被使用之前,将该对象初始化。
对于这样的函数实现非常简单:第一行定义并初始化一个local static对象,第二行返回它。