为什么编译器在这种情况下不会删除复制结构

时间:2012-06-27 01:02:36

标签: c++ visual-studio-2010

class test
{

public:

    int data;
    test(int var = 0):data(var){cout<<"constructor"<<endl;}
    ~test(){ cout<<"destructor"<<endl; }

    test(const test& var)
    {
        cout<<"copy constructor"<<endl;
        this->data = var.data;

    }
    test& operator=( const test& var)
    {
        cout<<"assignment op"<<endl;
        this->data = var.data;
        return *this;
    }

};


test passByref_returnByVal(test& obj)    
{    
    return obj;    
}


int main()
{

    test o1(5);
    test o2 = passByref_returnByVal(o1);
    cout<<"=========================="<<endl;
    test o3;
    o3 = passByref_returnByVal(o1);   
}

输出:

constructor

copy constructor

constructor

copy constructor

assignment op

destructor

在给定的示例中,对象o2可以直接复制而不使用任何临时值。

但是在第二种情况下,我想为o3分配函数的返回值,首先使用复制构造函数创建临时值,然后调用赋值运算符进行值赋值。

我的问题是,当我的赋值运算符引用时,这个临时需要是什么。我找到了相关问题,但他们没有回答这个问题。

1 个答案:

答案 0 :(得分:1)

test o3;

将导致对构造函数的调用以创建对象。 C ++不是Java,其中对象类型声明仅声明引用但不实例化对象。

test passByref_returnByVal(test& obj) {....}

导致复制构造函数调用,因为在其内部执行return obj;时,编译器需要创建一个临时对象,因为该函数的返回类型为test(而不是test&test*)。

最后,因为o3已经存在

的礼貌
test o3;

声明,调用赋值运算符以将passByref_returnByVal的返回值分配给已存在的o3

因此,复制构造函数调用发生在passByref_returnByVal,而不是operator=