2012-11-20 43 views
8

假設我定義這個結構:運算符重載在結構

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;必須分開處理嗎?

回答

13

只要做到這一點:

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

至於你的最後一個問題,編譯器可以進行沒有 假設關於您的運營商做什麼。 (請記住,std::string上的 +運算符是而不是可交換。)因此,您的 必須同時提供重載。

或者,可以(通過具有 Point一轉換構造函數)提供的 doublePoint的隱式轉換。在這種情況下,上述第一次超載將處理 所有三種情況。

+3

+1對於耐克的態度 – fredoverflow

+0

爲什麼我們必須將Point參數聲明爲常量? – Raptor

+1

@JosuéMolina所以你可以通過臨時工給他們;你不能用臨時的初始化非const引用。鑑於'Point'的簡單性,通過值直接傳遞它們沒有問題,而不是通過引用(在這種情況下,它們是否是'const'或不是無關緊要的)。但是無處不在的約定是通過引用const來傳遞類的類型,當約定真正無處不在時,並且不會導致其他問題時,最好遵守它們,如果只是爲了讓人們不要問你爲什麼要這樣做不同。 –

4

在C++中,結構和類之間只有一個區別:在結構中,默認可見性是公共的,而在類中是私有的。

除此之外,你可以在結構中的類中做任何事情,它看起來完全一樣。

將運算符重載在結構體中,就像在類中一樣。

+1

我不認爲提問者知道如何將一個類來完成。 –

4

這是我該怎麼做的。

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; } 
3

這也將工作:

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