質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

728閲覧

C++ - 一時オブジェクトに関する疑問点

tiitoi

総合スコア21956

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2020/07/02 12:36

質問内容

以下のコードの挙動について確認したいことがあります。

cpp

1MyClass obj = MyClass(1);

以下のように考えていたのですが

  1. 右辺の MyClass() で一時オブジェクトが作られる。
  2. その一時オブジェクトを引数にコピーコンストラクタが呼ばれて、左辺の 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
yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

言語仕様としてはコピー省略が許されています。 ただし、省略が許されているというのは省略「してもよい」という意味で、コンパイラが省略しないという選択をしても仕様通りです。 つまり、省略されることもされないこともありえます。

ちなみに C++17 以降においては質問の事例ではコピー省略は必須の動作に変更されています。

投稿2020/07/02 13:21

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/07/02 13:31

仕様として許可されていたのですね。調べてもわからなかったので、すっきりしました。 ご回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問