在C ++对象返回[重复](Object return in C++ [duplicate])

2019-10-18 06:36发布

这个问题已经在这里有一个答案:

  • 为什么拷贝构造函数是不是在这种情况下,叫什么? 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()函数的堆栈生成的对象,并且假定在返回到被删除。 如何对象堆栈可以不删除并传递给调用者?
文章来源: Object return in C++ [duplicate]