[英]Operator overloading '+' operator in C++
我在下面的代碼在Visual Studio 2008上運行時遇到問題。當您有如下語句要重載時,如何為operator +
編寫函數定義?
class Distance
{
private:
int feet,inches;
};
main......
Distance Obj, Obj1(2, 2);
Obj = 3 + Obj1; // This line here
Obj1+3
很簡單,但是這個編譯器如何知道它必須進行重載呢?
假設我必須將值3添加到Obj1
的數據成員feet
。
現在有幾個答案建議使用非成員operator+
重載來允許Distance
和int
對象的“加法”。 這實際上沒有任何意義:將一個具有單位的Distance
添加到一個int
,這沒有意義嗎?
但是,將兩個Distance
對象添加在一起確實很有意義。 如果您有一個兩英尺的距離,而又加上了三英尺的距離,那么您將得到五英尺的距離。 這是有道理的。
您可以通過在兩個Distance
對象之間重載operator+
來完成此operator+
(為簡單起見,我假設您的Distance
只有一個包含inch的字段。在實際應用中,您不希望為inch和feet分別設置字段您可能希望使用SI單位(例如儀表),但這取決於應用程序,完全取決於您):
Distance operator+(const Distance& lhs, const Distance& rhs)
{
return Distance(lhs.inches + rhs.inches);
}
但是,如果您希望能夠執行以下操作,這對您沒有幫助
Distance d;
d = d + 42; // assume 42 has the same units as a Distance object has
為了使之有意義,可以使用轉換構造函數:
struct Distance
{
Distance(int in = 0) : inches(in) { }
private:
int inches;
};
這里的構造函數是一個轉換構造函數,因為它不是explicit
,可以用單個參數調用。 它允許將單個int
(或可隱式轉換為int
)轉換為Distance
對象。 這可以讓你寫
Distance d;
d = d + 42;
為什么這與使用帶有Distance
和int
參數的operator+
重載不同? 簡單:它強制從int
到Distance
的轉換在加法之前進行,因此實際加法不必關心其操作數:它僅將兩個距離加在一起,並讓Distance
構造函數處理需要進行的任何轉換地點。
您需要編寫一個自由函數(在class
外部):
Distance operator+(int lhs, const Distance& rhs)
{
return ...;
}
如果...
需要使用Distance
私人成員,則使其成為Distance
的朋友。
class Distance
{
...
friend Distance operator+(int lhs, const Distance& rhs);
};
最后,如果您希望能夠在左側使用Distance
+
,只需定義上述另一個operator+
重載,但將Distance
作為第一個參數。
綜上所述,我將避免做您似乎正在做的事情。 作為Distance
課程的用戶,我不知道您在做什么會增加3英尺,3英寸或3米。 如果您不打算使用SI單位(米),那么您不應該允許添加非Distance
值。
除了要重載+
兩個Distance
對象的+
運算符外,還應避免其他答案中指出的重載operator+(const Distance &, int)
。 最好定義一些常量,例如:
const Distance feet(1,0);
const Distance inch(0,1);
並重載運operator*(int, const Distance &)
以便您可以編寫:
Distance dist = 3 * feet + 5 * inch;
Distance dist2 = dist + 2 * feet;
更具可讀性。
通常,將這種形式的運算符聲明為:
Distance operator+(int lhs, const Distance& rhs) {
// Assuming the int value represents feet
return Distance(rhs.feet + lhs, rhs.inches);
}
您可能還想定義對稱:
Distance operator+(const Distance& lhs, int rhs) {
// Assuming the int value represents feet
return Distance(lhs.feet + rhs, lhs.inches);
}
另外,我建議您聽取James McNellis的建議-如果您只有一個成員代表一個單位的長度,那么您的工作將得到簡化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.