struct构造函数名称优先级

时间:2012-12-29 18:02:08

标签: c++ c++11

我在C ++ 11中写了一个像这样的结构

struct StackOverflow
{
    int x;
    StackOverflow(){}
    StackOverflow(int x) { x = x; }
};

我知道我应该把后一个构造函数写成StackOverflow(int x) : x(x) {},但我很高兴我在这种情况下没有,因为我学到了一些东西:

C ++ 11编译器没有使用语句{x = x;} 做正确的事情。事实上,结构成员x甚至没有被初始化(当我调试我的应用程序失败的原因时它具有随机值)。我没有收到编译器警告。

这不应该有用吗?

3 个答案:

答案 0 :(得分:4)

你应该使用你似乎已经知道的构造函数初始化列表。所以我想你只是想知道为什么你的代码没有做你打算它要做的事情。那么问题是编译器不知道你的意图,因为它没有在程序中表达。你需要以编程方式表达你的意图:

StackOverflow(int x) { this->x = x; }

编译器需要知道x是哪个x。使用this->x,编译器知道您的意图。

答案 1 :(得分:3)

在构造函数初始化列表中初始化时,参数将影响数据成员之外。

x = xx正在遮蔽数据成员,因此它将参数分配给自身。

StackOverflow(int x) : x(x) {}
//                     ^ ^
//                     | +-- parameter x
//                     |
//                     +---- data member x

StackOverflow(int x) { x = x; }
//                     ^   ^
//                     |   |
//                     +---+-- parameter x

答案 2 :(得分:2)

不,您在构造函数的命名空间中引入了一个名为x的新变量,该变量隐藏了您的成员。

编译器可以给你一个警告,但不是必需的。

有三种选择:

  • 重命名参数
  • 使用初始化列表
  • 将会员限定为this->x

使用第一个,它是最优雅的。对于这个简单的情况,它并没有太大的区别,但想到一个更大的构造函数,你必须记住x没有引用类成员,你必须写{{1}当你想使用类成员时。