我有一个显示奇怪行为的程序
#include <cstdlib>
#include <iostream>
using namespace std;
class man{
int i ;
public:
man(){
i=23;
cout << "\n defaul constructir called\t"<< i<<"\n";
}
man (const man & X) {
i = 24;
cout << "\n COPY constructir called\t"<< i<<"\n";
}
man & operator = (man x ) {
i = 25;
cout << "\n = operator called\t"<< i<<"\n";
return *this;
}
};
int main(int argc, char *argv[])
{
man x;
cout <<"\n ----------\n";
man y = x;
cout <<"\n ----------\n";
x=y;
return 0;
}
中显示的输出
defaul constructir called 23
----------
COPY constructir called 24
----------
COPY constructir called 24
= operator called 25
对于x = y的第三次调用,此输出很奇怪;
为什么在我没有制作新对象但使用旧对象时,会调用复制构造器的额外打印件。
是否因为两者之间存在临时对象,如果是,我可以在这里阻止它们......
答案 0 :(得分:12)
因为赋值运算符按值获取其参数。你可以通过const引用来获取它。
答案 1 :(得分:3)
man& operator =(man x);
您的参数通过 - value 获取其参数,当发生这种情况时,它将调用copy-constructor。这就是造成额外不必要的电话的原因。通过引用传递你的参数将避免复制,但是你将无法传递临时值(通常称为rvalues):
struct man
{
man& operator =(man& x) { return *this; };
};
int main()
{
man a, b;
a = b; // works
a = man(); // error: no viable overloaded '=',
// expected an l-value for 1st argument
}
通过引用传递给 const
将允许左值和右值的复制构造:
man& operator =(man const& x);
// ^^^^^