17

この構造を定義するとします。

struct Point {
   double x, y;
};

+宣言されたように、演算子をオーバーロードするにはどうすればよいですか

Point a, b, c;
double k;

表現

c = a + b;

収量

c.x = a.x + b.x;
c.y = a.y + b.y;

と式

c = a + k;

収量

c.x = a.x + k;
c.y = a.y + k; // ?

可換性は後者の場合に成り立つでしょうか? つまり、別々に処理する必要がc = a + k;ありますか?c = k + a;

4

4 に答える 4

23

早くやれよ:

Point operator+( Point const& lhs, Point const& rhs );
Point operator+( Point const& lhs, double rhs );
Point operator+( double lhs, Point const& rhs );

あなたの最後の質問に関して、コンパイラは あなたの演算子が何をするかについて何も仮定しません( +演算子 onstd::stringは可換ではないことに注意してください。)したがって、両方のオーバーロードを提供する必要があります。

doubleまたは、 を暗黙的に に変換することもできます Point( に変換コンストラクターを含めることにより Point)。その場合、上記の最初のオーバーロードは 3 つのケースすべてを処理します。

于 2012-11-20T18:59:56.357 に答える
11

これが私がそれを行う方法です。

struct Point {
   double x, y;
   struct Point& operator+=(const Point& rhs) { x += rhs.x; y += rhs.y; return *this; }
   struct Point& operator+=(const double& k) { x += k; y += k; return *this; }
};

Point operator+(Point lhs, const Point& rhs) { return lhs += rhs; }
Point operator+(Point lhs, const double k) { return lhs += k; }
Point operator+(const double k, Point rhs) { return rhs += k; }
于 2012-11-20T19:10:43.573 に答える
6

C++ では、構造体とクラスの違いは 1 つだけです。構造体ではデフォルトの可視性はパブリックですが、クラスではプライベートです。

それ以外は、構造体のクラスで行うことはすべて行うことができ、まったく同じように見えます。

クラスの場合と同様に、演算子のオーバーロードを構造体に記述します。

于 2012-11-20T18:58:42.470 に答える
3

これも機能します:

struct Point{
    double x,y;
    Point& operator+(const Point& rhs){ 
            x += rhs.x;
            y += rhs.y;
            return *this;
    }
}
于 2015-04-10T12:43:26.223 に答える