2

C# では、「+」、「-」などの演算子をオーバーロードするには、関数をクラスの静的メンバーにする必要があります。

class MyType
{
   /*...*/

   public static MyType operator+ (MyType a, MyType b)
   {
       MyType ret;
       /* do something*/
       return ret;
   }
}

私の知る限り、C++ では次のようにして演算子をオーバーロードできます。

class MyType
{
   /*...*/

public:
   MyType operator+ (MyType b) // *this is the first operand
   {
       MyType ret;
       /* do something*/
       return ret;
   }
};

問題は*this、これが最初のオペランドであるため、最初のオペランドは MyType 型でなければなりません。たとえばMyType、整数に加算したい場合:

MyType a, b;
b = a + 1;  // Valid
b = 1 + a;  // Error

C# では、ケースごとに「+」演算子をオーバーロードできます。

私の質問は、静的演算子を使用して、C# と同じように C++ で行うことはできますか? 私の知る限り、フレンド演算子を使用してそれを行う方法は 1 つありますが、関数を継承するときに失われます。

4

2 に答える 2

3

C++ では、グローバル スコープで演算子を定義できます。

MyType operator+ (const MyType& a, const MyType& b)
{
    MyType ret;
       /* do something*/
    return ret;
}

MyTypeオペレーターがクラスのプライベート メンバーにアクセスする必要がある場合は、friend 宣言を追加する必要がある場合があります。

于 2012-09-06T07:03:59.847 に答える
3

のメンバー関数ではなく、左側のoperator+オーバーロードをフリー関数にします。intMyType

class MyType
{
  ...

  // MyType + int can be a member function because MyType
  // is the type of the sum's left hand side
  MyType operator+(int rhs) const;
};

// int + MyType needs to be a free function because
// int is the type of the sum's left hand side
MyType operator+(int lhs, const MyType &rhs);

もう 1 つの一般的なイディオムは、対象friendのクラスのオーバーロードを作成することです。これで、両方のケースを同じ方法で実装できます。

class MyType
{
  ...

  friend MyType operator+(int lhs, const MyType &rhs)
  {
    // get access to MyType's private members here
    // to implement the sum operation
    ...
  }

  friend MyType operator+(const MyType &lhs, int rhs)
  {
    // you can also implement the symmetric case
    // of int on the right hand side here
    ...
  }
};

operator+オーバーロードは 2 番目の例ではメンバー関数のように見えますが、実際にはfriendのとして宣言されているため、グローバル スコープ内に存在するフリー関数であることに注意してくださいMyType

于 2012-09-06T07:04:31.360 に答える