2012-12-29 107 views
1

我写了一个结构是这样的...在C++ 11结构构造函数名的优先

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

我知道我应该写后者构造函数StackOverflow(int x) : x(x) {}但我很高兴,我在此没有案例,因为我学到了一些东西:

C++ 11编译器没有做正确的事与语句{x = x;}。逸岸,结构体成员x甚至没有初始化(它有随机值,当我调试为什么我申请失败)。我没有收到编译器警告。

不应该有这样的工作?

+0

看起来像一个'this'丢失。 – Hogan

+4

编译器绝对_did权thing_。但是,你没有。 –

回答

3

参数将跟随数据成员,除了

x = xx被遮蔽的数据成员,并因此它的分配参数本身。

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

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

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

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

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

2

不,你介绍了在隐藏你的会员的构造函数的命名空间命名x新的变量。

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

有三个选项:

  • 重命名参数
  • 使用初始化列表
  • 资格的成员为this->x

使用第一个,它的最优雅。对于这个简单的情况下,它不会带来很大的区别,但想到一个更大的构造,在那里你必须记住,x当你要使用的类不引用类成员,你必须写this->x的会员。在构造函数初始化列表在初始时