これの違いは何ですか:
TestClass t;
この:
TestClass t = TestClass();
2番目はコンストラクターを2回呼び出し、次にoperator =を呼び出す可能性があると予想しましたが、代わりに、最初のコンストラクターと同じように、コンストラクターを1回だけ呼び出します。
これの違いは何ですか:
TestClass t;
この:
TestClass t = TestClass();
2番目はコンストラクターを2回呼び出し、次にoperator =を呼び出す可能性があると予想しましたが、代わりに、最初のコンストラクターと同じように、コンストラクターを1回だけ呼び出します。
TestClass t;
デフォルトのコンストラクターを呼び出します。
TestClass t = TestClass();
コピーの初期化です。のデフォルトコンストラクターを呼び出してTestClass()
から、コピーコンストラクターを呼び出します(理論的には、コピーはコピーの省略の対象になります)。ここでは割り当ては行われません。
直接初期化の概念もあります:
TestClass t(TestClass());
代入演算子を使用する場合:
TestClass t;
TestClass s;
t = s;
最初のケースは非常に単純です。デフォルトのコンストラクターを使用してインスタンスを構築します。
2番目のクラスは、匿名オブジェクトを作成してから、コピーコンストラクターを呼び出すことです。ここで、は割り当てではないことに注意してください。これは、次のように書く=
のと似ています(ただし同一ではありません)。
TestClass t(TestClass());
コピーコンストラクターを使用不可にすることで、コピーコンストラクターを使用可能にする必要があることを確認できます。例:
#include <iostream>
struct TestClass {
TestClass() { std::cout << "Ctor" << std::endl; }
TestClass(const TestClass&) = delete;
};
int main() {
TestClass t = TestClass();
}
コピーコンストラクターが削除されたため、コンパイルに失敗します。(C ++ 03では、代わりに使用できますprivate:
)。
ただし、実際に発生している可能性が最も高いのは、コンパイラが戻り値の最適化を実行していることです。これにより、適切なコンストラクタが存在し、アクセス可能であれば、コピーコンストラクタの呼び出しを完全に省略できます。
最初の例では、デフォルトのコンストラクターを暗黙的に呼び出しています。そして2番目のものではあなたはそれを明示的に呼んでいます。
後者はコピーコンストラクターを呼び出すことができるため、パブリックである必要があります。
編集:私は確かにあなたが使用したタイプ名からあまりにも大きな結論を引き出しました。上記の文は、クラスタイプにのみ適用されます(つまり、PODには適用されません)。PODタイプの場合、前者は変数を初期化せずに残し、後者はいわゆる「デフォルト」値で変数を初期化します。