(参照 | 値)を返す関数からの戻り値を(参照 | 値)型で受け取るときにコピーコンストラクタが発動するか否かの表

ポインタだと混乱しないけど、参照だとよく頭がごっちゃになるのでメモっとく。

受取/関数 値返し 参照返し
参照 ×

(コピーコンストラクタが発動するケース○・しないケース×)
結局オブジェクトのコピーを作りたくないときは”参照戻し”の関数からの返り値を”参照”で受け取らなきゃだめということか。

#include <iostream>
using namespace std;
//適当なクラス&そのオブジェクト
class Hoge
{
public :
	Hoge(){cout << "デフォルト・コンストラクタ" << endl;}
	Hoge(const Hoge & obj){cout << "コピー・コンストラクタ" << endl;}
};
Hoge x;
//値と参照を返す関数
Hoge   get_val(){return x;}
Hoge & get_ref(){return x;}

int main()
{
	cout << "値返し" << endl;
	cout << "値で受け取り" << endl;
	Hoge   x_val = get_val();
	cout << "参照で受け取り" << endl;
	Hoge & y_val = get_val();

	cout << "参照返し" << endl;
	cout << "値で受け取り" << endl;
	Hoge   x_ref = get_ref();
	cout << "参照で受け取り" << endl;
	Hoge & y_ref = get_ref();

	return 0;
}

実行結果

デフォルト・コンストラクタ
値返し
値で受け取り
コピー・コンストラクタ
参照で受け取り
コピー・コンストラクタ
参照返し
値で受け取り
コピー・コンストラクタ
参照で受け取り