在编写类时,我一直是个好 child ,所有成员变量都以 m_ 为前缀:
class Test {
int m_int1;
int m_int2;
public:
Test(int int1, int int2) : m_int1(int1), m_int2(int2) {}
};
int main() {
Test t(10, 20); // Just an example
}
然而,最近我忘了这样做,最后写了:
class Test {
int int1;
int int2;
public:
// Very questionable, but of course I meant to assign ::int1 to this->int1!
Test(int int1, int int2) : int1(int1), int2(int2) {}
};
信不信由你,编译的代码没有错误/警告,并且分配正确进行!只有在检查我的代码之前做最后的检查时,我才意识到我做了什么。
我的问题是:为什么我的代码会编译? C++ 标准中是否允许这样的事情,还是仅仅是编译器聪明的一个例子?如果您想知道,我使用的是 Visual Studio 2008
最佳答案
是的,它是有效的。成员初始值设定项列表中的名称在构造函数类的上下文中查找,因此 int1
找到成员变量的名称。
在构造函数本身的上下文中查找初始化表达式,因此 int1
找到屏蔽成员变量的参数。
关于C++ 构造函数初始化列表的奇怪之处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2476381/