2011-05-11 4 views
10
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; 
    } 
} 

例:演算子をオーバーロードでのC#

Point P1 = new Point(10,20); 
Point P2 = new Point(30,40) 
P1+P2; // operator overloading 
  1. それはいつものように、静的演算子のオーバーロード関数を宣言する必要があるのでしょうか?これの背後にある理由は何ですか?
  2. 2 + P2のような式を受け入れるために+をオーバーロードしたい場合は、どうすればよいですか?
+2

理由は#1がそのままですので、#2を簡単に達成できます。 –

答えて

10
  1. はい。なぜなら、あなたは常に演算子でインスタンスを扱っていないからです。
  2. タイプを希望のタイプに変更するだけです。ここで

あなたはP2 + 2が仕事をしたい場合は、パラメータを使用して他の方法を行う必要があります#2

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

ための一例です。

詳細については、http://msdn.microsoft.com/en-us/library/8edha89s.aspxを参照してください。

4

のご質問にお答えするには:

  1. はい、あなたはstaticとしてそれらを定義する必要があります。それらはインスタンスメソッドではなく、nullで操作することもできます。
  2. あなたはパラメータの一つは、タイプ、前の回答の両方があなたの質問について話int
+0

point + intの代わりにint + pointを追加しても、それでも正しく動作しますか? – smelch

+0

C++では、オペレータのオーバーロードがメンバ関数によって定義されている場合、1つのパラメータを渡す必要があります。または、friend関数によって定義されている場合、2つのパラメータを定義する必要があります。 memeber関数として演算子のオーバーロードメソッドを宣言することは可能ですか? – Raghav55

+0

いいえ、インスタンスメンバーとして宣言することはできません。インスタンスメンバーとして宣言する必要があります。また、 'int + point'と' point + int'を処理するには、2つの演算子オーバーロードを宣言する必要があります。その理由は 'int + point'は' point + int'とは異なる結果を生み出すことができるからです。例えば、最初のものは、原点からintまでの距離を数値として追加しますが、2番目の値は指定された値だけポイントをオフセットすることがあります。 (つまり、1つは新しいintを生成し、もう1つは新しい点を生成します) –

0

である演算子オーバーロードを定義する必要がありますので、私はそれらを侵害するつもりはないが、ここで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; 
    }