オブジェクトを返すときは、オブジェクトを返すときに一時オブジェクトが作成されるため、ポインターまたは参照を返すのが正しい方法だと思いました。
この例では、hello() 関数は型 A のオブジェクトを返し、戻り値はオブジェクト a に格納されます。
A hello()
{
A a(20); // <-- A object is created in stack
cout << &a << endl;
return a; // <-- Temporary object is created for return value
}
void test1()
{
A a = hello(); // copy constructor is called
cout << &a << endl;
}
私の予想では、3 つのコンストラクターが呼び出されるはずでした。ただし、test1()
g++ 4.8 で実行すると、コンストラクターは 3 回ではなく 1 回だけ呼び出されます。
class A
{
int x;
public:
A() {
cout << "Default constructor called" << endl;
}
A(const A& rhs)
{
this->x = rhs.x;
cout << "Copy constructor called" << endl;
}
A& operator=(const A& rhs)
{
this->x = rhs.x;
cout << "Copy constructor called" << endl;
}
A(int x) : x(x) {
cout << "*I'm in" << endl;
}
~A() {
cout << "*I'm out" << endl;
}
int get() const {return x;}
void set(int x) {this->x = x;}
};
実行結果:
*I'm in
0x7fff62bb30c0 <-- from hello()
0x7fff62bb30c0 <-- from test1()
*I'm out
- これは C++ で予想される動作ですか、それとも g++ の最適化のためにこの結果が得られたのでしょうか?
- オブジェクトは hello() 関数の
A a(20)
スタックに生成され、返されると削除されるはずです。オブジェクトスタックを削除せずに呼び出し元に渡すにはどうすればよいですか?