在代码中怀疑测试赋值运算符的使用

时间:2013-05-04 16:00:59

标签: c++ copy-constructor assignment-operator

我正在编写一个代码来测试赋值运算符和复制构造函数的使用。代码如下:

#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'?

我是新手,请原谅我,如果我的怀疑是显而易见的。

2 个答案:

答案 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;