1. ホーム
  2. c++

[解決済み] C++におけるコンストラクタの連鎖

2022-02-08 13:29:20

質問

私の理解では、クラス内に複数のコンストラクタ(オーバーロードされたコンストラクタ)がある場合、そのうちの1つが他のコンストラクタを呼び出そうとすると、コンストラクタチェーニングが発生します。 このプロセスはCONSTRUCTOR CHAININGと呼ばれ、C++ではサポートされていません。 最近、ネットの資料を読んでいて、こんな段落に出くわしました。それは次のようなものです。

<ブロッククオート

クラスをデフォルト値に戻すためのメンバ関数を書きたい、という状況になることがあります。おそらくすでにこれを行うコンストラクタがあるので、メンバ関数からコンストラクタを呼び出したくなるかもしれません。前述のとおり、C++ ではコンストラクタの連鎖呼び出しは違法です。コンストラクタのコードを関数にコピーすればうまくいきますが、重複したコードになってしまいます。この場合の最善の方法は、コンストラクタのコードを新しい関数に移動し、コンストラクタから新しい関数を呼び出してデータを初期化するようにすることです。

コンストラクタを呼び出すメンバ関数もコンストラクタ鎖に含まれるのでしょうか? C++でこのトピックに光を当ててください。

どのように解決するのですか?

この段落は、基本的にこのように書かれています。

class X
{
   void Init(params) {/*common initing code here*/ }
   X(params1) { Init(someParams); /*custom code*/ } 
   X(params2) { Init(someOtherParams); /*custom code*/ } 
};

また、メンバ関数からコンストラクタを呼び出すこともできません。やってしまったと思われるかもしれませんが、それは錯覚です。

class X
{
public:
    X(int i):i(i){}
    void f()
    {
       X(3); //this just creates a temprorary - doesn't call the ctor on this instance
    }
    int i;
};

int main()
{
    using std::cout;
    X x(4);
    cout << x.i << "\n"; //prints 4
    x.f();
    cout << x.i << "\n"; //prints 4 again
}