質問内容
以下のコードの挙動について確認したいことがあります。
cpp
1MyClass obj = MyClass(1);
以下のように考えていたのですが
- 右辺の
MyClass()
で一時オブジェクトが作られる。 - その一時オブジェクトを引数にコピーコンストラクタが呼ばれて、左辺の obj が初期化される
確認したところ、コンストラクタが呼ばれたのは obj の1回のみで、テンポラリオブジェクトが作られていませんでした。
cpp
1// 以下と同じ? 2MyClass obj(1);
最適化の結果ではなく、C++ の仕様としてこのような挙動になっているのでしょうか?
以上、よろしくおねがいします。
環境
- C++11
- Visual Studio 2019
確認に使用したコード
cpp
1#include <iostream> 2 3class MyClass 4{ 5public: 6 MyClass(int id) : id_(id) 7 { 8 std::cout << "constractor " << id_ << std::endl; 9 } 10 11 MyClass(const MyClass &obj) 12 { 13 std::cout << "copy constractor " << obj.id_ << "->" << id_ << std::endl; 14 } 15 16 ~MyClass() 17 { 18 std::cout << "destractor " << id_ << std::endl; 19 } 20 21 MyClass &operator=(const MyClass &obj) 22 { 23 std::cout << "assignment operator " << obj.id_ << "->" << id_ << std::endl; 24 return *this; 25 } 26 27private: 28 int id_; 29}; 30 31void test1() 32{ 33 MyClass obj = MyClass(0); 34} 35 36int main() 37{ 38 std::cout << std::endl << "test1" << std::endl; 39 test1(); 40}
結果
test1 constractor 0 destractor 0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/02 13:31