了解C ++拷贝构造函数行为

时间:2015-08-29 22:45:15

标签: c++

这是我的代码:

#include <iostream>
using namespace std;

class A
{
    int i;

public:
    A(int v) : i(v) { }

    A(const A& r) : i(r.i) {
        cout << "Copy constructor" << endl;
    }

    A operator=(const A& r) {
        cout << "Assignment function" << endl;
        return r;
    }

    void show() {
        cout << i << endl;
    }
};

int main()
{
    A a(1);
    A b(2);
    a = b;
    a.show();
    return 0;
}

b的值为2a的值为1。在&#39; main&#39;中,b被复制到a,这就是我得到的输出:

Assignment function
Copy constructor

这是可以理解的,但a.show()的输出结果为1。我无法理解这一点。怎么样?因为使用复制构造函数将b复制到a中,所以不应该a.i的值为b.i

3 个答案:

答案 0 :(得分:6)

b使用赋值运算符复制到a,而不是复制构造函数。并且您的分配运算符不会分配i,因此a.i会保留其原始值。

您看到的复制构造函数的返回值为operator=。通过引用返回左侧更为习惯,而不是通过值返回右侧:

A& operator=(const A& r) {
    cout << "Assignment function" << endl;
    i = r.i;
    return *this;
}

答案 1 :(得分:2)

定义赋值运算符时,必须完成复制数据的所有工作。

A operator=(const A& r) {
    cout << "Assignment function" << endl;
    i = r.i;
    return r;
}

所以a = b正在调用你的赋值运算符(显然是你的输出)。但是现在它并没有复制任何东西。

答案 2 :(得分:1)

赋值运算符不对“已分配给”对象执行任何操作。您看到报告的复制构造函数调用是从创建赋值返回值。

您的副本任务应该看起来像这样:

A& A::operator= (A const& other) {
    // output
    this->i = other.i;
    return *this;
}