1

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

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

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

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

这不应该奏效吗?

4

3 回答 3

4

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

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

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

于 2012-12-29T18:03:00.227 回答
3

参数将隐藏数据成员,除非在构造函数初始化列表中进行初始化。

x = xx隐藏数据成员,因此它将参数分配给自身。

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

StackOverflow(int x) { x = x; }
//                     ^   ^
//                     |   |
//                     +---+-- parameter x
于 2012-12-29T18:06:39.937 回答
2

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

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

有三个选项:

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

使用第一个,它是最优雅的。对于这个简单的情况,它并没有太大的区别,但是考虑一个更大的构造函数,你必须记住它x不引用类成员,并且this->x当你想使用类成员时你必须编写。

于 2012-12-29T18:04:02.137 回答