August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
在同一个编译单元中的全局变量(以及名字空间变量,参见8.7节)按它们出现的顺序被初始化。例如:
逻辑上这几个变量的初始化在main()中的代码执行前发生。
除非是在一些非常特殊的情况下,否则一般来说使用全局变量不是一个好主意。我们已经提到过,程序员没有有效的方法获知程序的哪个部分读或写了一个全局变量(8.4节)。另一个问题是,在不同编译单元中的全局变量的初始化顺序是不确定的。例如:
这段代码存在这样几个问题:使用了全局变量;为全局变量起了很短的名字;对全局变量使用了复杂的初始化。如果文件f1.cpp中的全局变量先于文件f2.cpp中的全局变量初始化,那么y2的初值为5(这可能是程序员本来所期望的,也是合理的)。但是,如果文件f2.cpp中的全局变量先于文件f1.cpp中的全局变量初始化,y2的初值将为2(因为分配给全局变量的内存空间在变量的复杂初始化前被置为0)。请避免使用这种代码,并且对复杂的初始化保持足够的警惕,任何不是简单常量表达式的初始化都可以认为是复杂的。
但如果确实需要一个全局变量(或常量),而且需要对它进行复杂的初始化,你又该怎么做呢?一个看起来有道理的例子是,一个用于商务事务的函数库需要一个Date类型的对象,我们想初始化这个对象:
我们如何知道defaul_date在初始化之前从未被使用过呢?原则上我们不可能知道,因此我们不应该写出这样的代码。一种常用的技术是编写一个函数,返回我们需要的初值。 ...