[解決済み] 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
}
関連
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] コンストラクタのコロンメンバー(" : ")の変な構文は何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C#でコンストラクタのチェーニングを行う方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++