《Effective C++》念书条记04:确保工具在利用之前被初始化
我本身在写代码的时候也常常会碰着健忘初始化某工具的问题,并且这些错误较量难 以调试,Meyers提出了一些制止这些错误的办理要领:
1.手工初始化所以内置类 型:
这一条很好领略,对付int,enum等内置范例,在利用前必然要初始化。
2.对付类范例等用户自界说的工具,利用成员初值列初始化所有的工具:
1 using namespace std;
2
3 class PhoneNumber{};
4 class Customer
5 {
6 public:
7 Customer(const string& name, const string& address,
8 const PhoneNumber& phone);
9 private:
10 string theName;
11 string theAddress;
12 PhoneNumber thePhone;
13 int usedTimes;
14 }
对付Customer 类的结构函数界说,一般我们会这么写:
1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone)
2 {
3 theName = name; //这些都是赋值
4 theAddress = address; //而不是初始化
5 thePhone = phone;
6 usedTimes = 0;
7 }
但是,在c++中,对不是内置型的对 象的初始化都产生在进入结构函数之前,也就是说,在举办theName = name;赋值之前, theName就已经举办了初始化了,这个进程挪用本身的默认结构函数。
紧接着有立 刻举办了赋值操纵,这样会造成特另外挥霍,所以我们可以这样写结构函数:
1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone)
2 :theName (name),//成员初始化列
3 theAddress(address),
4 thePhone(phone),
5 usedTimes(0)//内置范例也一并初始化
6 {
7 }
利用了成员初始化列的要领,在进入结构函数体之前就举办了初始 化,淘汰了赋值的开销,同时为了保持一致性,将内置范例也一并举办了初始化。
尚有一点要记着:在成员初始化列中对变量的初始化序次是凭据变量声明的序次 的,也就是说,纵然将上面的序次任意改变,也改变不了初始化序次,所以我们要尽大概 地凭据利用的顺序来声明变量!
3.在多个编译单位内的non-local static工具的 初始化序次问题:
non-local static工具暗示在措施执行进程中一直存在的工具 ,像类中声明的static变量,全局变量,而在普通函数中声明的static变量称为local static变量。
那么当有多个差异的编译单位(即存在于差异的文件中)时,对这 些non-local static工具的初始化序次,在c++中,是不确定的,并且也没法确定!
当两个或多个文件中的non-local static工具产生关联时,问题就呈现了。
办理要领就是利用了设计模式中的:Singleton单件模式,将对non-local static 的会见移到函数中,将其转变为local static变量,确保其被初始化了再利用。
假如是多个non-local static工具相互之间都有关联,那。。对不起,是设计出了问题。