2013-10-08 61 views
1

我想了解重載操作符,我一直盯着這個比我想承認的時間更長。我相信,除了運營商+成員之外,我理解課上的所有內容。我試圖用大量的可用信息來教自己,但我找不到任何信息向我解釋我在這裏看到的情況 - 而且我堅信如果我明白事情如何,那麼我可以使用它更好。如何在未定義的情況下返回值?

所以,大多數情況下,我的困惑在於編譯器如何知道要選擇哪個溫度變量。 (temp.x或temp.y)我意識到main()是要求c.x和c.y,但是operator +似乎正在返回尚未定義的東西。沒有三元運算符或任何可以使其選擇返回的東西。

#include <iostream> 
using namespace std; 

class CVector { 
public: 
    int x,y; 
    CVector() {}; 
    CVector (int,int); 
    CVector operator + (CVector); 
}; 

CVector::CVector (int a, int b) { 
    x = a; 
    y = b; 
} 

CVector CVector::operator+ (CVector param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); 
} 

int main() { 
    CVector a (3,1); 
    CVector b (1,2); 
    CVector c; 
    c = a + b; 
    cout << c.x << "," << c.y; 
    return 0; 
} 
+1

它沒有返回'temp.x'或'temp.y',它返回'temp'。 –

+0

對,我明白這一點。我會換個話。它如何返回溫度?在我看來,溫度還沒有值得回報。我預計我會看到類似於: return(temp = x?temp.x:temp。Y); – Scott

+0

您認爲它沒有價值嗎? – drescherjm

回答

3

所以,大多數情況下,我的困惑在於編譯器是如何知道臨時的 變量選擇哪個。

我真的不明白你的意思。編譯器沒有選擇要返回的臨時變量。 tempCVector類型的對象。它包含兩個數據成員,xy。當它與該行建立這些成員的temp一部分而存在:

CVector temp; 

然後,當你這樣做:

return temp; 

沒有什麼編譯器來選擇。它將返回整個對象,其中包括xy在一個複合對象中。

在你的主要功能,這一行:

c = a + b; 

呼籲operator+ab。然後將返回值(temp)分配給(operator=)至c。由於您尚未定義自定義賦值運算符,因此默認賦值運算符會進行運算,該賦值運算符只是執行從tempc的成員賦值。因此,temp.x被分配給c.x,而temp.y被分配給c.y

爲您的類,默認的賦值運算符會是什麼樣子(或具有相同的操作語義來)這一點,如果它被寫出來:

CVector & CVector::operator=(const CVector & rhs) 
{ 
    this->x = rhs.x; 
    this->y = rhs.y; 
    return *this; 
} 
+0

這非常有幫助,是否有默認的外觀語法? – Scott

+0

@Scott:你走了。 –

+0

你是男人!非常感謝,我今天花了無數個小時試圖理解這一點。一旦我得到15代表將投票。 – Scott

1

實現運營商(+),本質上只是一個實例方法。

temp.x = x + param.x; 
temp.y = y + param.y; 
return (temp); 

這裏它指定實例值'x'和param.x的總和。 想象它被稱爲:

CVector a (3,1); 
CVector b (1,2); 
CVector c; 
c = a.+(b); 
相關問題