0

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

#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();
}

这是代码的输出:

在:缺点

在:缺点

在:复制缺点

在:assignOp

在:德

-1216991244

在:德

在:德

现在,关于输出有两件事我无法理解。

首先,为什么代码在复制构造函数中?其次,为什么'i'的值被打印为垃圾而不是'1'?

我是新手,如果我的疑问很明显,请原谅。

4

2 回答 2

2
B = A;

这导致调用赋值运算符。您在输出中看到的原因copy cons是因为您的赋值运算符按值获取其参数。所以A被复制到赋值运算符函数中,这需要使用复制构造函数。

复制构造函数和复制赋值运算符通常都通过const引用来获取它们的参数。

你得到垃圾值的原因是因为你有这条线向后:

b.i = this->i;

它应该是:

this->i = b.i;

否则,您的复制构造函数会将 的不确定值this->i复制到您从中复制的对象中。

于 2013-05-04T16:05:06.070 回答
1

首先,为什么代码在复制构造函数中?

当为赋值运算符复制参数时,将调用复制构造函数。您通过值而不是引用将参数传递给赋值运算符:

fun& operator=(fun b)

代替

fun& operator=(const fun& b)

其次,为什么'i'的值被打印为垃圾而不是'1'?

在您的复制构造函数中,您分配了错误的方法:

b.i = this->i;

代替

this->i = b.i;
于 2013-05-04T16:15:48.997 回答