2014-02-28 54 views

回答

3

1)在outer的構造函數初始化列表中初始化i

inner i; 

outer(): i(*this) {} 

2)(C++ 11只)用大括號初始化爲i。在這種情況下,你的使用大括號,而不是括號。

inner i{*this}; 
0

成員i可以在類中聲明,但如果您使用的是支持C++只有98編譯器不能被初始化。您可以在outer的構造函數的實現中初始化它。

class outer { 
public: 
    class inner { 
    outer & o; 
    public: 
    inner(outer & o): o(o) {} 
    }; 

    outer() : i(*this) {} 
    inner i; 
}; 
1

你不能這樣做。你可以做到這一點在外部類

outer() : i(*this) {} 

這是這樣的構造是容易出錯的,雖然,因爲實例尚未建造和this是不完整的。一般不使用this在初始化列表(GCC會給你一個警告)

另一種方式是僅適用於C++ 11

inner i { *this }; 
+0

有兩種方法之間沒有實質性的區別。非靜態成員按聲明順序初始化。如果有一個ctor-initializer,那麼它就被使用了,否則如果有一個使用了brace-initializer的話,否則它會被默認初始化,並且它會進入下一個成員。 – Brian

+0

無論如何,'* this'是一個左值,並且如果存在左值到右值的轉換,則只有一個問題。在這種情況下不會有,因爲該參數是一個參考。 – Brian

相關問題