簡體   English   中英

運算符在C ++中重載'+'運算符

[英]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+重載來允許Distanceint對象的“加法”。 這實際上沒有任何意義:將一個具有單位的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;

為什么這與使用帶有Distanceint參數的operator+重載不同? 簡單:它強制從intDistance的轉換在加法之前進行,因此實際加法不必關心其操作數:它僅將兩個距離加在一起,並讓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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM