#include <iostream>
using namespace std;
class A
{
int x;
public:
A(int a)
{
x = a;
cout << "CTOR CALLED";
}
A(A &t)
{
cout << "COPY CTOR CALLED";
}
void display()
{
cout << "Random stuff";
}
A operator = (A &d)
{
d.x = x;
cout << "Assignment operator called";
return *this;
}
};
int main()
{
A a(3), b(4);
a = b;
return 0;
}
此代码的输出为:
CTOR CALLED
CTOR CALLED
分配操作员称为 COPY CTOR CALLED
当我在visual studio中使用手表时,它显示即使在调用重载赋值运算符之前,x
中a
的值也已更改。
那么为什么复制构造函数甚至在这里被调用?
答案 0 :(得分:6)
因为您从赋值运算符返回值。它应该返回引用:
A& operator = (A &d) { ... }
答案 1 :(得分:3)
正如@SomeProgrammerDude已经说过的那样,因为你按照值返回,而不是像通常那样使用赋值运算符。我想补充一点,你的赋值运算符目前是错误的方法:
A operator = (A &d)
{
d.x = x;
cout << "Assignment operator called";
return *this;
}
通常你通过const引用传递d
,因为我们想要改变this
的成员。您正在更改d
的成员。由于a = b;
实际上正在更改b = a;
的成员,因此将a = b;
功能性转换为b
使d
成为const&
可以防止出现这些错误。
您应将其更改为:
A& operator = (A const &d)
{
x = d.x;
cout << "Assignment operator called";
return *this;
}