2011-10-13 15 views
15

クラスのコンストラクタでメンバのコンストラクタを呼び出すことはできますか?コンストラクタでクラスメンバのコンストラクタを呼び出す

私のクラスMClassにクラスタイプfooのメンバーbarがあるとします。 MClassのコンストラクタでbarのコンストラクタを呼び出せますか?そうでない場合は、どうすればメンバーバーを初期化できますか?

構成(集約)のメンバを初期化するのは問題です。

class C { 
    int m; 

public: 

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

}; 

あなたのメンバーのコンストラクタは、パラメータを望んでいる場合は、あなたがそれらを渡すことができます。このよう

答えて

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

。それらは、クラスコンストラクタのパラメータと既に初期化された型から作成された式にすることができます。

覚えておいてください。:メンバは、初期化リストに表示される順序ではなく、クラスで宣言された順に初期化されます。

2

はい、できます。これはクラスの初期化リストで行われます。例えば:これは通常に渡される引数でbarを構築します

class MClass 
{ 

    foo bar; 

public: 

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

、引数はコンストラクタに渡されたクラスや引数の他のメンバーになります。この構文は、引数のないコンストラクタを持たないすべてのメンバーに必要です。

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

関連する問題