(参照 | 値)を返す関数からの戻り値を(参照 | 値)型で受け取るときにコピーコンストラクタが発動するか否かの表
ポインタだと混乱しないけど、参照だとよく頭がごっちゃになるのでメモっとく。
受取/関数 | 値返し | 参照返し |
---|---|---|
値 | ○ | ○ |
参照 | ○ | × |
(コピーコンストラクタが発動するケース○・しないケース×)
結局オブジェクトのコピーを作りたくないときは”参照戻し”の関数からの返り値を”参照”で受け取らなきゃだめということか。
#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; }
実行結果
デフォルト・コンストラクタ 値返し 値で受け取り コピー・コンストラクタ 参照で受け取り コピー・コンストラクタ 参照返し 値で受け取り コピー・コンストラクタ 参照で受け取り