面试题答案
一键面试- 初始化顺序:
- 在C++中,全局变量和静态变量(包括全局静态变量和类的静态成员变量)的初始化顺序是按照它们在编译单元中定义的顺序进行初始化的。在同一个编译单元内,先定义的变量先初始化。不同编译单元之间,全局变量和静态变量的初始化顺序是未定义的,不过通常按照链接器处理目标文件的顺序进行初始化。
- 原因:
- C++标准这样规定主要是为了简化实现并在一定程度上保证局部的可预测性。如果对不同编译单元间的变量初始化顺序严格定义,会使得编译器和链接器的实现变得非常复杂。同时,由于不同的构建系统和链接器实现细节不同,严格定义顺序可能会导致一些不可移植的行为。
- 举例代码:
#include <iostream>
// 全局变量
int globalVar1 = 1;
int globalVar2 = 2;
class MyClass {
public:
// 类的静态成员变量
static int staticMemberVar;
};
// 类的静态成员变量定义及初始化
int MyClass::staticMemberVar = 3;
// 全局静态变量
static int globalStaticVar = 4;
int main() {
std::cout << "globalVar1: " << globalVar1 << std::endl;
std::cout << "globalVar2: " << globalVar2 << std::endl;
std::cout << "MyClass::staticMemberVar: " << MyClass::staticMemberVar << std::endl;
std::cout << "globalStaticVar: " << globalStaticVar << std::endl;
return 0;
}
在上述代码中,globalVar1
会在globalVar2
之前初始化,MyClass::staticMemberVar
在globalStaticVar
之前初始化(因为代码定义顺序如此)。不同编译单元间变量初始化顺序的未定义性可以通过将变量拆分到不同的.cpp
文件中并进行链接来体现。例如,假设有file1.cpp
和file2.cpp
,在file1.cpp
中定义int a = 1;
,在file2.cpp
中定义int b = 2;
,它们的初始化顺序依赖于链接器处理这两个目标文件的顺序,在不同的构建环境下可能不同。