class A {};
class B { public: B (A a) {} };
A a;
B b=a;
技術的に言えば、ここでの作成時にコピーコンストラクターが適用されていb
ますか?
class A {};
class B { public: B (A a) {} };
A a;
B b=a;
技術的に言えば、ここでの作成時にコピーコンストラクターが適用されていb
ますか?
はい、理論的には。これがコピー初期化です。B
最初にイニシャライザ ( a
)から一時インスタンスが構築され、次にb
コピー コンストラクタを介してこの一時インスタンスから初期化されます。
ただし、コンパイラーは、一時的な構造とコピーの構造を省略し、コンストラクターを使用してb
直接構築することが許可されており、頻繁に行われます。a
B(A)
技術的に言えば、 b の作成時にここでコピー コンストラクターが適用されていますか?
はい...しかし、おそらくあなたの考えではありません。 のコピー コンストラクターは、B コンストラクターへのA
パラメーターとしてパラメーターの値渡しを行うために、b の作成時に呼び出されています。A a
ただし、b の作成で B のコピー コンストラクターを実行していません。
編集:毎日何か新しいことを学びます。@CharlesBaileyが指摘したように、明らかにさらに技術的に言えば...構文(「直接初期B b = a;
化」)の代わりに構文(「コピー初期化」)を使用するB b (a);
場合、タイプBの一時値を作成する必要がある場合があります。この時点で、B のコピー コンストラクターが呼び出されることになります。
この現象を研究するのは少し難しいですが、Charles は gcc にはオプションがあると指摘してい-fno-elide-constructors
ます (また、 Wikipedia on Copy Elision ) @JesseGood のリンクには、完全な説明といくつかのデモ コードがあります。
いいえ、コピー コンストラクターは同じ種類のオブジェクトへの参照を取ります。
C++03 12.1 コンストラクター
- クラス Xのコピー コンストラクター
X&
は、 or型の最初のパラメーターを持つコンストラクターconst X&
です。
編集:OK、公平を期すために(そして他の回答を読んだ後)、コピーコンストラクターが呼び出されていますが、それはA
のコピーコンストラクターです。の意味だと思っていB
ました。
EDIT2:より公平にするために、それを呼び出す必要はまったくありません:
A a;
B b = a; //called
B c = A(); //probably not called due to copy elision
いいえ。コピーコンストラクタではありません。
同じクラスのオブジェクトでオブジェクトを初期化してオブジェクトを作成する場合、それはコピーコンストラクターです。
A a;
A b=a;
上記のコードはコピーコンストラクタです。