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.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

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

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

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

管理Kubernetes

Brendan Burns, Craig Tracey
Python编程入门与实战

Python编程入门与实战

Posts & Telecom Press, Fabrizio Romano

Publisher Resources

ISBN: 9787111562252