コンストラクターが2回呼ばれるのはもったいない
上述した関数 foo のようにしてインスタンスを返すと、foo 内で一度コンストラクターが呼ばれ、それを return で戻り値として返すときにもコンストラクター(コピーコンストラクター)が呼ばれ、計2回呼ばれていることになる。無駄というかもったいない。1回だけにできないのか?
ためしにつぎのようにしてみた。
#includeusing namespace std; class A { public: A() { cout << "A::A()" << endl; } A(const A& a) { cout << "A::A(const A&)" << endl; } virtual ~A() { cout << "A::~A()" << endl; } }; A foo() { cout << "b" << endl; return A(); } void main() { cout << "a" << endl; A a = foo(); cout << "c" << endl; }
こうすると実行結果は、
a b A::A() c A::~A()
となり、一応節約できていることにはなる。しかし、return の1行内でできることには制限がありすぎる。
たしかにスタックの深さが、foo とそれを呼ぶ main とでは違っているので、foo の(return 以外の)中で作ったインスタンスを、その呼び出し元の main のスタックに渡そうとすると、どうしてもコピーしないといけないのは分かるような気がする。でも無駄だ。そもそもインスタンスの実体をヒープではなくスタックに置く、という概念が Java に慣れた身から見ると、奇異に感じる。