問題タブ [ctor-initializer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - コンストラクターの初期化リスト内の「this」ポインター
なぜこれが機能しないのか理解できないと思います。' ' ポインターをコンストラクター内で使用できるとずっと思っていましたが、初期化リストでthis
' ' を使用できないことを知りませんでした。this
それに関連する詳細を知りたいです。
c++ - ctor 初期化子リストの文字列代入で関数の二重呼び出しを避ける
次のコード例では、std::string A::str_
inA
の初期化子リストを、関数からの戻り値 ( を返す可能性があるNULL
) またはconst char*
. しかし、2回呼び出されるのは好きではありませんFunc()
。
私はこのようなことをしたいと思います:
しかし、一時変数を使用して、寿命を延ばすために参照であっても、この方法では違法に思えます(私の現在の理解によると)。
グローバル/静的変数を使用せずに、1 回だけA::str_
呼び出して、初期化子リストでの初期化を可能にする C++03 構文はありますか? Func()
一時変数を使用する解決策があれば、その構文を学びたいです。
c++ - 仮想継承の内部メカニズム
C++ のサンプル コード:
これは、ダイヤモンド問題の典型的なコード (ソリューション) です。virtual キーワードが使用される理由を認識しています。しかし、コンパイラが問題を処理する内部メカニズムは私にはわかりません。今、私は、以下に述べるように、上記のメカニズムについて2つの異なる理論に出くわしました.
クラスが virtual キーワードで継承されると、コンパイラは派生クラスに仮想ベース ポインターを追加します。派生クラスのサイズを確認しましたが、追加のポインターのサイズが含まれています。しかし、上記の例でクラス A のメンバーがクラス D で参照されている場合、それがどこを指しているのか、どのように機能するのかはわかりません。
コンストラクターごとに、コンパイラーは、プログラマーによって提供された各定義の 2 つのバージョンを作成します。 上記のコードなどで、このリンクから知りました。コンパイラは C のコンストラクタの 2 つのバージョンを生成します
そして、コンストラクター B の 2 つの異なるバージョン
したがって、D が構築されると、コンパイラは以下のコードのいずれかを生成します。
A のインスタンスが 1 つだけ作成されるようにするため、A の重複コピーが回避されます。
内部メカニズムを理解するのを手伝ってください。