这个问题已经在这里有一个答案:
- 为什么拷贝构造函数是不是在这种情况下,叫什么? 4个回答
- 拷贝构造函数不叫? 2个回答
当返回的对象,因为返回一个对象时创建的临时对象心想返回指针或引用才是正道。
在此实例中,喂()函数返回类型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;
}
我的期望是有应在三个构造函数调用。 然而,当我执行test1()
与G ++ 4.8,构造函数被调用一次,而不是瞬间。
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 ++优化这样的结果?
- 在
A a(20)
是在hello()函数的堆栈生成的对象,并且假定在返回到被删除。 如何对象堆栈可以不删除并传递给调用者?