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# 中一样使用静态运算符吗?据我所知,有一种方法可以做到这一点,使用友元运算符,但是在继承函数时它们会丢失。

4

2 回答 2

3

您可以在 C++ 的全局范围内定义运算符,例如

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

MyType如果操作员应该访问类的私有成员,您可能需要添加一个朋友声明。

于 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);

另一个常见的习惯用法是使重载成为friend感兴趣的类的 a。现在您可以以相同的方式实现这两种情况:

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+重载看起来像第二个示例中的成员函数,但它们实际上是存在于全局范围内的自由函数,因为它们声明为friends of MyType

于 2012-09-06T07:04:31.360 回答