我在C ++ 11中写了一个像这样的结构
struct StackOverflow
{
int x;
StackOverflow(){}
StackOverflow(int x) { x = x; }
};
我知道我应该把后一个构造函数写成StackOverflow(int x) : x(x) {}
,但我很高兴我在这种情况下没有,因为我学到了一些东西:
C ++ 11编译器没有使用语句{x = x;}
做正确的事情。事实上,结构成员x
甚至没有被初始化(当我调试我的应用程序失败的原因时它具有随机值)。我没有收到编译器警告。
这不应该有用吗?
答案 0 :(得分:4)
你应该使用你似乎已经知道的构造函数初始化列表。所以我想你只是想知道为什么你的代码没有做你打算它要做的事情。那么问题是编译器不知道你的意图,因为它没有在程序中表达。你需要以编程方式表达你的意图:
StackOverflow(int x) { this->x = x; }
编译器需要知道x
是哪个x
。使用this->x
,编译器知道您的意图。
答案 1 :(得分:3)
在构造函数初始化列表中初始化时,参数将影响数据成员除之外。
在x = x
中x
正在遮蔽数据成员,因此它将参数分配给自身。
StackOverflow(int x) : x(x) {}
// ^ ^
// | +-- parameter x
// |
// +---- data member x
StackOverflow(int x) { x = x; }
// ^ ^
// | |
// +---+-- parameter x
答案 2 :(得分:2)
不,您在构造函数的命名空间中引入了一个名为x
的新变量,该变量隐藏了您的成员。
编译器可以给你一个警告,但不是必需的。
有三种选择:
this->x
使用第一个,它是最优雅的。对于这个简单的情况,它并没有太大的区别,但想到一个更大的构造函数,你必须记住x
没有引用类成员,你必须写{{1}当你想使用类成员时。