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

sve*_*etu 0 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;
}
Run Code Online (Sandbox Code Playgroud)

价值b就是2和价值a是1.在'main'中,b被复制到a我得到的输出中:

Assignment function
Copy constructor
Run Code Online (Sandbox Code Playgroud)

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

asc*_*ler 6

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

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

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