为何C++类作用域中成员变量的定义顺序不影响程序运行?
为什么类中成员变量的初始化器允许引用后声明的成员?
先看函数内的场景:
int a=b; // 编译报错:b未声明 int b=0;
函数内的变量是逐行声明并进入作用域的,执行到int a=b;时,b还没被声明,编译器找不到这个名字,直接报错。
但类的情况完全不同:
class Foo { int a=b; // 编译不报错,但运行时a的值未定义 int b=0; };
核心原因是类作用域的名字查找规则:类体是一个完整的作用域,类中所有成员的名字在整个类体内部都是可见的,不管声明顺序先后。所以编译器处理int a=b;时,能在类体里找到后面声明的b,不会因为名字找不到而报错。
但这里有个容易踩的坑:成员变量的初始化顺序是按照它们在类中的声明顺序来的,和初始化器的写法顺序无关。这个例子里a先声明,会先被初始化,此时b还没完成赋值(b的初始化在a之后),所以a会被初始化为一个未定义的垃圾值——这属于运行时的未定义行为,编译器不会拦截,但程序运行后可能出现异常。
简单总结:类允许在初始化器里用后声明的成员,是因为名字查找能找到,但实际初始化顺序仍按声明来,乱用会引发运行时问题。
内容的提问来源于stack exchange,提问作者Jibel
相关产品推荐
相关产品推荐

