2016-08-29 13 views
3

複数のオブジェクトコンストラクタを必要とするC++オブジェクトを作成しようとしています。 Foo()Foo(int)とし、Foo(int)Foo()となります。簡略化されたコードは、以下に書かれている:結果は予想通りsetX方法の動作を示すようC++クラスを別のコンストラクタから呼び出す方法

#include <iostream> 
class Foo{ 

private: 
     int iX; 

public: 
     void printX(string sLabel){ 
      cout << sLabel << " : " << " Foo::iX = " << Foo::iX << endl; 
     }; 
     void setX(int iX){ 
      Foo::iX = iX; 
      Foo::printX("setX(void) Method"); 
     }; 
     Foo(){ 
      Foo::iX = 1; 
      Foo::printX("Foo(void) Constructor"); 
     }; 
     Foo(int iX){ 
      Foo::setX(iX); 
      Foo::printX("Foo(int) Constructor"); 
      Foo::Foo(); 
      Foo::printX("Foo(int) Constructor"); 

     }; 
}; 

int main(int argc, char** argv){ 

    Foo bar(2); 

    return 0; 
} 

出力が

setX(void) Method : Foo::iX = 2 
Foo(int) Constructor : Foo::iX = 2 
Foo(void) Constructor : Foo::iX = 1 
Foo(int) Constructor : Foo::iX = 2 

あります。 Foo::iXは、その機能のスコープの内側と外側の2に等しい。

Foo(void)コンストラクタをFoo(int)コンストラクタ内から呼び出すときは、Foo::iXはそのコンストラクタ内でのみ1にとどまります。その方法を終了すると、すぐに2に戻ります。

だから私の質問は2倍です:

  1. なぜCは、(コンストラクターが割り当てられていた値をせずに別のコンストラクタ内から呼び出すことはできません)これを振る舞う++のでしょうか?
  2. 複数のコンストラクタシグネチャを作成するにはどうすればよいですか?

ご協力いただければ幸いです。

おかげ

+0

_delegating constructors_を読んでください。 _member initialization_も読んでください。たとえば、[ここ](http://en.cppreference.com/w/cpp/language/initializer_list)。 –

答えて

3

あなたがC++ 11コンパイラを使用することができます場合は、委任コンストラクタを使用することができます。 Foo::Foo(int)

// Use Foo(int) to initialize the object when default constructor is used. 
Foo() : Foo(1) {} 
7

Foo::Foo();あなたは予想通り、現在のオブジェクトにデフォルトコンストラクタを呼び出していません。これは現在のオブジェクトには何もない一時的なFooを構築するだけです。

あなたはdelegating constructor(C++ 11以降)次のように使用することができます:

Foo(int iX) : Foo() { 
    // ... 
}; 

Foo::Foo()ことは、ここでFoo::Foo(int)の体の前に呼び出されます。

重複したコードを避ける代わりに、setX()を共通の初期化方法として使用することもできます。 (適切でない場合は新しいものを作成してください)

Foo() { 
    setX(1); 
    // ... 
}; 
Foo(int iX) { 
    setX(iX); 
    // ... 
}; 
+0

@songyuanyaho:あなたは一時的な方法をどう定義しますか?一般的な意味やより技術的な意味では?説明してください。どうも。 – WoodMath

+0

@WoodMathより技術的な意味で。デフォルトのコンストラクタは、一時的なオブジェクトを作成するために明示的に呼び出され、一時的に破棄されます。 – songyuanyao

2

コンストラクタは別のコンストラクタ内から呼び出すことができます。戻り値を代入するのは忘れてしまいます。

*this = Foo::Foo(); 

質問2の場合は、delegating constructorsが必要です。

Foo(int iX) : Foo() { 
    ... 
} 
+0

'* this = Foo:Foo()'は、部分的に構築されたオブジェクトに代入できる場合にのみ機能します。 (メンバーと基盤はすべて正しく構築されますが、コンストラクタは完了していないため、オブジェクト自体のライフタイムはまだ始まっていません)。 –

関連する問題