2012-12-29 110 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的會員。在構造函數初始化列表在初始時