《Effective C++》念书条记04:确保工具在利用之前被初始化
当前位置:以往代写 > C/C++ 教程 >《Effective C++》念书条记04:确保工具在利用之前被初始化
2019-06-13

《Effective C++》念书条记04:确保工具在利用之前被初始化

《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工具相互之间都有关联,那。。对不起,是设计出了问题。

    关键字:

在线提交作业