2011-10-13 149 views
15

我可以在我的類的構造函數中調用成員的構造函數嗎?在構造函數中調用類成員的構造函數

讓我說如果我有一個類型爲foo的成員bar在我的課。我可以在MClass的構造函數中調用bar的構造函數嗎?如果不是,那麼我怎樣才能初始化我的成員欄?

這是初始化構圖(聚合)中的成員的問題。

回答

26

是的,當然可以!這就是構造函數初始化列表的用途。這是你需要初始化成員沒有缺省構造,以及常量和參考的基本特徵:

class Foo 
{ 
    Bar x;  // requires Bar::Bar(char) constructor 
    const int n; 
    double & q; 
public: 
    Foo(double & a, char b) : x(b), n(42), q(a) { } 
    //      ^^^^^^^^^^^^^^^^^^^ 
}; 

您需要進一步的初始化列表指定基類的非默認構造函數派生類構造函數。

3

像這樣:

class C { 
    int m; 

public: 

    C(int i): 
    m(i + 1) {} 

}; 

如果您的會員構造想要的參數,你可以通過它們。它們可以是由類構造函數參數和已經初始化的類型構成的表達式。

還記得:成員的初始化順序是它們在類中聲明的順序,而不是它們在初始化列表中出現的順序。

2

是的,你可以。這是在你的類的初始化列表中完成的。例如:

class MClass 
{ 

    foo bar; 

public: 

    MClass(): bar(bar_constructor_arguments) {}; 
} 

這將構建bar,在正常情況下傳遞的參數,參數將是你的類或參數傳遞給你的構造函數中的其他成員。對於沒有無參數構造函數的成員,此語法是必需的。

3

通過初始化列表,如果基類沒有默認構造函數。

struct foo{ 
    foo(int num) 
    {} 
}; 

struct bar : foo { 
    bar(int x) : foo(x) 
       // ^^^^^^ initializer list 
    {} 
}; 
6

是的,你可以:

#include <iostream> 

using std::cout; 
using std::endl; 

class A{ 
public: 
    A(){ 
     cout << "parameterless" << endl; 
    } 

    A(const char *str){ 
     cout << "Parameter is " << str <<endl; 
    } 
}; 

class B{ 
    A _argless; 
    A _withArg; 

public: 
    // note that you need not call argument-less constructor explicitly. 
    B(): _withArg("42"){ 
    } 
}; 

int main(){ 
    B b; 

    return 0; 
} 

輸出是:

parameterless 
Parameter is 42 

View this on ideone.com

+0

你在沒有顯式調用參數少成員的構造函數的評論是什麼我是尋找。謝謝! – Jaime

相關問題