Skip to Content
C++程序设计:原理与实践(基础篇)(原书第2版)
book

C++程序设计:原理与实践(基础篇)(原书第2版)

by 本贾尼 斯特劳斯特鲁普
August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
Pearson
Content preview from C++程序设计:原理与实践(基础篇)(原书第2版)

8.6.2 全局初始化

在同一个编译单元中的全局变量(以及名字空间变量,参见8.7节)按它们出现的顺序被初始化。例如:

逻辑上这几个变量的初始化在main()中的代码执行前发生。

除非是在一些非常特殊的情况下,否则一般来说使用全局变量不是一个好主意。我们已经提到过,程序员没有有效的方法获知程序的哪个部分读或写了一个全局变量(8.4节)。另一个问题是,在不同编译单元中的全局变量的初始化顺序是不确定的。例如:

这段代码存在这样几个问题:使用了全局变量;为全局变量起了很短的名字;对全局变量使用了复杂的初始化。如果文件f1.cpp中的全局变量先于文件f2.cpp中的全局变量初始化,那么y2的初值为5(这可能是程序员本来所期望的,也是合理的)。但是,如果文件f2.cpp中的全局变量先于文件f1.cpp中的全局变量初始化,y2的初值将为2(因为分配给全局变量的内存空间在变量的复杂初始化前被置为0)。请避免使用这种代码,并且对复杂的初始化保持足够的警惕,任何不是简单常量表达式的初始化都可以认为是复杂的。

但如果确实需要一个全局变量(或常量),而且需要对它进行复杂的初始化,你又该怎么做呢?一个看起来有道理的例子是,一个用于商务事务的函数库需要一个Date类型的对象,我们想初始化这个对象:

我们如何知道defaul_date在初始化之前从未被使用过呢?原则上我们不可能知道,因此我们不应该写出这样的代码。一种常用的技术是编写一个函数,返回我们需要的初值。 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普
管理Kubernetes

管理Kubernetes

Brendan Burns, Craig Tracey
Go程序设计语言

Go程序设计语言

艾伦A. A.多诺万, 布莱恩W. 柯尼汉

Publisher Resources

ISBN: 9787111562252