这是我的代码:
#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
的值为2
,a
的值为1
。在&#39; main&#39;中,b
被复制到a
,这就是我得到的输出:
Assignment function
Copy constructor
这是可以理解的,但a.show()
的输出结果为1
。我无法理解这一点。怎么样?因为使用复制构造函数将b
复制到a中,所以不应该a.i
的值为b.i
?
答案 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;
}