【问题标题】:operator Overloading in C#C#中的运算符重载
【发布时间】:2011-08-23 09:50:07
【问题描述】:
class Point
{
    private int m_PointX;
    private int m_PointY;

    public Point(int x, int y)
    {
        m_PointX = x;
        m_PointY = y;
    }

    public static Point operator+(Point point1, Point point2)
    {
        Point P = new Point();
        P.X = point1.X + point2.X;
        P.Y = point1.Y + point2.Y;

        return P;
    }
}

例子:

Point P1 = new Point(10,20);
Point P2 = new Point(30,40)
P1+P2; // operator overloading
  1. 是否必须始终将运算符重载函数声明为静态?这背后的原因是什么?
  2. 如果我想重载+来接受像2+P2这样的表达式,该怎么做?

【问题讨论】:

  • 原因 #1 就是它的本来面目,所以您可以轻松完成 #2。

标签: c# operator-overloading


【解决方案1】:
  1. 是的。因为您并不总是与操作员一起处理实例。
  2. 只需将类型更改为您想要的类型即可。

这是 #2 的示例

public static Point operator+(int value, Point point2)
{
 // logic here.
}

如果您希望P2 + 2 工作,您将不得不对参数执行其他方式。

更多信息请参见http://msdn.microsoft.com/en-us/library/8edha89s.aspx

【讨论】:

    【解决方案2】:

    回答您的问题:

    1. 是的,您需要将它们定义为静态。它们不是实例方法,它们也可以在 nulls 上运行。
    2. 您必须定义一个运算符重载,其中一个参数的类型为int

    【讨论】:

    • 如果你添加的是int + point而不是point + int,它仍然可以正确执行操作吗?
    • 在C++中,如果运算符重载是由成员函数定义的,那么我们需要传递一个参数,或者如果由友元函数定义,我们需要定义两个参数。是否可以将运算符重载方法声明为成员函数?
    • 不行,不能声明为实例成员,需要声明为静态。此外,要处理int + pointpoint + int,您需要声明两个运算符重载。原因是int + point 可能产生与point + int 不同的结果。例如,第一个可能会添加从原点到 int 的距离,作为一个数字,而第二个可能会将该点偏移给定值。 (即一个产生一个新的 int,另一个产生一个新的点。)
    • 是什么原因使运算符重载为静态?
    • 我不知道,您必须 ping Eric Lippert 或编译器人员之一。无论如何,它们静态的,没有办法解决。
    【解决方案3】:

    前面的两个答案都谈到了你的问题,所以我不打算插手,但这里是一个使用 2+P 的例子:

       public static Point operator+(int yourInt, Point point)
        {
            Point P = new Point();
            P.X = point.X + yourInt;
            P.Y = point.Y + yourInt;
    
            return P;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2016-06-16
      • 2011-03-25
      相关资源
      最近更新 更多