2016-12-29 7 views
3

私は本当に答えを知っておくべき基本的なC++の質問があります。C++でのクラスオブジェクトの作成

Aのコンストラクタを持つクラスがあります。A(int a)

A test_obj(4); 

A test_obj = A(4); 

:違いは何ですか?

私は一般的に後者の構文を使用しますが、私の信頼できるC++のプライマーで無関係なものを調べた後、私はそれらが一般的に前者を使用することに気付きました。これらの2つの違いは、組み込みタイプ(例えば、int a(6)int a = 6)のコンテキストでよく説明されていますが、この場合は同等です。

しかし、ユーザー定義クラスの場合、オブジェクトを同等に定義する2つの方法はありますか?または、後者のオプションの最初のデフォルトはtest_objを構築し、次にAのコピーコンストラクタを使用してA(4)の戻り値をtest_objに割り当てますか?この2番目の可能性がある場合、大きなクラスの2つのアプローチの間にパフォーマンスの違いがあると思います。

この質問はインターネット上のどこかで答えられていると確信していますが、最初のオプションとnewとの違いを質問することなく効果的に検索することはできませんでした。

+2

*私は一般的に後者の構文*を使用します - なぜですか?経験豊富なC++プログラマーがその構文を目的に使用しているのを見つけるのは難しいでしょう。 – PaulMcKenzie

+0

@PaulMcKenzie特に良い理由はありません。私は変わることに戸惑います。私はこれまでこれまで考えなかった。 –

+0

@PaulMcKenzie元の質問に戻って、違いは何ですか? – jacknad

答えて

4

A test_obj = A(4);概念的に実際に構築しません一時的なAオブジェクトを作成し、次にコピーしてください。test_objを一時的にコピーしてから一時的に破棄してください。

ただし、このプロセスはcopy elisionの候補です。これは、コピー/移動コンストラクタが存在し、アクセス可能であることを確認した後にコンパイラがA test_obj(4);として処理できることを意味します。

コンパイラがこれを行うことは必須です。それ以前はオプションでしたが、通常はコンパイラがそれを行いました。

+1

'A test_obj = A(4);'が 'A test_obj = 4; 'と同じであれば、' 'explicit'指定子を使うことを意味します(http://en.cppreference.com/w/cpp/言語/明示的に)コンパイル時にエラーが発生しますか? – UnholySheep

+0

@UnholySheep良い点。OPの質問に実際には関係していないので、私の答えからそのビットを削除しました –

+0

明示的なコピーコンストラクタは本当に私のためにこれを壊します。 –

3

copy elisionで義務付けられているように、非標準のコピーコンストラクタを使用していても、これらは同等です。これはC++ 17以降では保証されていましたが、以前の標準に準拠したコンパイラであっても許可され、広く提供されています。

(右上にあるコマンドラインを変更したり、C++ 03)すべての最適化をオフにし、標準のC++ 11に強制的に、あなた自身のために試してみてください。 https://godbolt.org/g/GAq7fi

関連する問題