0

我遇到了这段代码,但我无法理解这段代码的功能。如果有人能解释一下,那将是一个很大的帮助。

struct A{
   int i,j;
   A(int ii,int jj) : i(ii),j(ii){}

   A(const A&a){
           }
   A& operator =(const A& a){
               i=a.i;j=a.j;
   }
};

int main()
{
int i;
A a(1,2);
A b(2,3);
A z = (a=b);
cout<<z.i<<" "<<z.j<<endl;

system("pause");
return 0;
}
4

4 回答 4

1

解释:

struct A{
   int i,j;//members i and j

   A(int ii,int jj) : i(ii),j(ii){} //A constructor. Short form of A(int ii,int jj){i = ii;j = jj;} Original code is wrong too. Should be j(jj) instead of j(ii)

   A(const A&a){}//Another constructor. It is missing the assignment

   A& operator =(const A& a){
               i=a.i;j=a.j;
   }//Equal operator overload definition for A = another A. It copies the data from another A and assign to this new one
};

完整的工作代码:

#include <iostream>
using namespace std;

struct A{
   int i,j;

   A(int ii,int jj) : i(ii),j(jj){}

   A(const A&a){i=a.i;j=a.j;}

   A& operator =(const A& a){i=a.i;j=a.j;}
};

int main()
{
    int i;
    A a(1,2);
    A b(2,3);
    A z = (a=b);
    cout<<z.i<<" "<<z.j<<endl;

    return 0;
}
于 2012-04-21T04:08:27.020 回答
1

你的问题是这一行:

A z = (a=b);

它最终会调用您的operator=方法和您的复制构造函数。当a = b执行时,它使用该operator=方法,因为a已经存在,然后a返回一个引用。你本质上是在打电话a.operator=(b)

执行时A z = ...,它实际上使用 Copy Constructor A(const A&a),而不是该operator=方法,因为z尚不存在。由于z是由该复制构造函数创建i并且j从未初始化,因此当您尝试将它们打印出来时,您会得到内存中为iand保留的任何垃圾j

查看此行的另一种方法:

A z = (a=b);

其实是这样的:

A z(a.operator=(b));

这是一个完整的例子:

int main()
{
    A a(1,2);
    A b(2,3);

    a = b; //calls A& operator=(const A& a)

    A z = a; //calls A(const A& a)
}

总之,解决方法是这样做:

A(const A& a)
   {
        i = a.i;
        j = a.j;
   }
于 2012-04-21T04:23:33.480 回答
0

三个错误:

1.A(int ii,int jj) : i(ii),j(ii /* jj here? */){}

2.复制构造函数应该初始化成员: A(const A&a): i(a.i), j(a.j) {}

3.你应该return *this添加operator=

A& operator =(const A& a){
    i=a.i;j=a.j;
    return *this;
}
于 2012-04-21T04:56:36.493 回答
-1

OP问了the operator overloadin part. if we take a as const how can we edit it.

运算符重载部分是:

A& operator =(const A& a){
           i=a.i;j=a.j;

}

当你写作时a=b,你只期望a改变而不是改变b。这是由函数参数定义中的 const 说明符强制执行的。此 const 说明符与等号左侧出现的任何内容无关。它只是说等号的右边不会被修改。

于 2012-04-21T04:26:36.010 回答