我能夠在C ++中從另外一個構造函數調用構造函數(進行構造函數連接)嗎?

做爲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


#1樓

我相信您能夠從構造函數中調用構造函數。 它將編譯並運行。 我最近看到有人這樣作,它能夠在Windows和Linux上運行。 spa

它只是不作您想要的。 內部構造函數將構造一個臨時本地對象,一旦外部構造函數返回,該本地對象將被刪除。 它們也必須是不一樣的構造函數,不然您將建立遞歸調用。 code

參考: https : //isocpp.org/wiki/faq/ctors#init-methods 對象


#2樓

調用構造函數時,它其實是從堆棧或堆中分配內存。 所以,在另外一個構造函數中調用一個構造函數將建立一個本地副本。 所以,咱們正在修改另外一個對象,而不是咱們正在關注的對象。 遞歸


#3樓

我建議使用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();
}

也就是說, 不是讓一個構造函數調用另外一個構造函數而是兩個都稱爲私人朋友!


#4樓

若是我正確理解了您的問題,那麼您在問是否能夠在C ++中調用多個構造函數?

若是這是您要尋找的,那麼不會-那是不可能的。

您固然能夠有多個構造函數,每一個構造函數都有惟一的參數簽名,而後在實例化一個新對象時調用所需的構造函數。

您甚至能夠擁有一個帶有默認參數的構造函數。

可是您可能沒有多個構造函數,而後分別調用它們。


#5樓

不,在C ++中,您不能從構造函數調用構造函數。 正如沃倫指出的,您能夠作的是:

  • 使用不一樣的簽名重載構造函數
  • 在參數上使用默認值,以使「更簡單」的版本可用

請注意,在第一種狀況下,不能經過從另外一個構造函數調用另外一個代碼來減小代碼重複。 固然,您能夠有一個單獨的私有/受保護的方法來執行全部初始化,並讓構造函數主要處理參數處理。

相關文章
相關標籤/搜索