做爲C#開發人員,我習慣於遍歷構造函數: ide
class Test { public Test() { DoSomething(); } public Test(int count) : this() { DoSomethingWithCount(count); } public Test(int count, string name) : this(count) { DoSomethingWithName(name); } }
有沒有辦法在C ++中作到這一點? 函數
我嘗試調用類名稱並使用'this'關鍵字,但均失敗。 this
我相信您能夠從構造函數中調用構造函數。 它將編譯並運行。 我最近看到有人這樣作,它能夠在Windows和Linux上運行。 spa
它只是不作您想要的。 內部構造函數將構造一個臨時本地對象,一旦外部構造函數返回,該本地對象將被刪除。 它們也必須是不一樣的構造函數,不然您將建立遞歸調用。 code
參考: https : //isocpp.org/wiki/faq/ctors#init-methods 對象
調用構造函數時,它其實是從堆棧或堆中分配內存。 所以,在另外一個構造函數中調用一個構造函數將建立一個本地副本。 所以,咱們正在修改另外一個對象,而不是咱們正在關注的對象。 遞歸
我建議使用private friend
方法,該方法實現構造函數的應用程序邏輯,並被各類構造函數調用。 這是一個例子: 內存
假設咱們有一個名爲StreamArrayReader
的類, StreamArrayReader
包含一些私有字段: 開發
private: istream * in; // More private fields
咱們要定義兩個構造函數: get
public: StreamArrayReader(istream * in_stream); StreamArrayReader(char * filepath); // More constructors...
第二個只使用第一個(固然,咱們不想重複前一個的實現)。 理想狀況下,您但願執行如下操做:
StreamArrayReader::StreamArrayReader(istream * in_stream){ // Implementation } StreamArrayReader::StreamArrayReader(char * filepath) { ifstream instream; instream.open(filepath); StreamArrayReader(&instream); instream.close(); }
可是,這在C ++中是不容許的。 所以,咱們能夠以下定義一個私有的方法,該方法實現第一個構造函數應該執行的操做:
private: friend void init_stream_array_reader(StreamArrayReader *o, istream * is);
如今,此方法(由於它是一個朋友)能夠訪問o
的私有字段。 而後,第一個構造函數變爲:
StreamArrayReader::StreamArrayReader(istream * is) { init_stream_array_reader(this, is); }
請注意,這不會爲新建立的副本建立多個副本。 第二個變爲:
StreamArrayReader::StreamArrayReader(char * filepath) { ifstream instream; instream.open(filepath); init_stream_array_reader(this, &instream); instream.close(); }
也就是說, 不是讓一個構造函數調用另外一個構造函數 , 而是兩個都稱爲私人朋友!
若是我正確理解了您的問題,那麼您在問是否能夠在C ++中調用多個構造函數?
若是這是您要尋找的,那麼不會-那是不可能的。
您固然能夠有多個構造函數,每一個構造函數都有惟一的參數簽名,而後在實例化一個新對象時調用所需的構造函數。
您甚至能夠擁有一個帶有默認參數的構造函數。
可是您可能沒有多個構造函數,而後分別調用它們。
不,在C ++中,您不能從構造函數調用構造函數。 正如沃倫指出的,您能夠作的是:
請注意,在第一種狀況下,不能經過從另外一個構造函數調用另外一個代碼來減小代碼重複。 固然,您能夠有一個單獨的私有/受保護的方法來執行全部初始化,並讓構造函數主要處理參數處理。