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=メソッドと Copy Constructor の両方を呼び出すことになります。がa = b実行されると、既に存在するoperator=ためメソッドを使用し、への参照が返されます。あなたは本質的に呼び出しています。aaa.operator=(b)

が実行されると、まだ存在しないため、A z = ...実際にはメソッドではA(const A&a)なくCopy Constructor を使用します。はそのコピー コンストラクターによって作成されており、とは初期化されていないため、それらを印刷しようとすると、 と のために予約されたメモリにあるジャンクが取得されます。operator=zzijij

この行を表示する別の方法:

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

3 つの間違い:

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 に答える