在编写类时,我一直是个好 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/

10-15 06:08