内部类静态成员赋值外部类静态成员的行为及程序输出是否确定?
问题解答
问题1:内部类静态成员初始化为外部类静态成员时,行为是否确定?
这个行为是否确定,核心取决于两个静态成员的定义位置:
- 如果两个静态成员在同一个翻译单元内,且定义顺序明确,那么初始化行为是确定的:按照定义的先后顺序依次执行初始化。先初始化的成员会使用后定义成员的零初始化值(所有静态变量都会先完成零初始化,再执行用户指定的初始化逻辑)。
- 如果两个静态成员在不同翻译单元内,它们的动态初始化顺序是未指定的,此时行为不确定。
问题2:给定代码的输出是否确定?
输出是确定的,结果为 Outer::Inner::thrd=0。
具体分析代码的初始化流程:
- 所有静态存储期变量首先执行零初始化:
Outer::num被初始化为0,Outer::Inner::thrd也被初始化为0。 - 然后按照全局作用域中变量定义的顺序执行用户指定的初始化:
- 先执行
const int Outer::Inner::thrd = Outer::num;,此时Outer::num还未被赋值为5,依然保持零初始化的0,因此thrd被设置为0。 - 之后执行
const int Outer::num = 5;,将num的值更新为5,但这不会改变已经完成初始化的thrd的值。
- 先执行
- 最终
main函数中输出的thrd结果就是0。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

