我正在编写一个代码来测试赋值运算符和复制构造函数的使用。代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
class fun {
int i;
public:
fun():i(1) {i=1;cout<<"in: cons\n";}
~fun() {cout<<"in: des\n";}
fun& operator=(fun b) {
cout<<"in: assignOp\n";
swap(this->i, b.i);
return *this;
}
fun(fun& b) {
cout<<"in: copy cons\n";
b.i = this->i;
}
void print() {
cout<<i<<endl;
}
};
main()
{
fun A;
fun B;
B = A;
A.print();
}
以下是代码的输出:
in:cons
in:cons
in:copy cons
in:assignOp
in:des
-1216991244
in:des
in:des
现在,有两件事我无法理解输出。
首先,为什么代码会进入复制构造函数? 其次,为什么'i'的值被打印为垃圾而不是'1'?
我是新手,请原谅我,如果我的怀疑是显而易见的。
答案 0 :(得分:2)
B = A;
这导致调用赋值运算符。您在输出中看到copy cons
的原因是因为赋值运算符按值获取其参数。因此A
被复制到赋值运算符函数中,这需要使用复制构造函数。
复制构造函数和复制赋值运算符通常都通过const
引用来获取它们的参数。
获得垃圾值的原因是因为你有这条线向后:
b.i = this->i;
应该是:
this->i = b.i;
否则,您的复制构造函数会将this->i
的不确定值复制到您要复制的对象中。
答案 1 :(得分:1)
首先,为什么代码会进入复制构造函数?
为赋值运算符复制参数时,将调用复制构造函数。您将通过值将参数传递给赋值运算符,而不是引用:
fun& operator=(fun b)
而不是
fun& operator=(const fun& b)
其次,为什么“i”的值被打印为垃圾而不是“1”?
在你的拷贝构造函数中,你指的是错误的方法:
b.i = this->i;
而不是
this->i = b.i;