2011-06-24 60 views
4

我懷疑我們是否可以執行以下操作。運算符在C++中重載

假設我已經創建類的兩個實例Aobj1obj2和類A具有成員函數show()

我可以使用以下嗎?

(obj1+obj2).show() 

如果是,如何?如果不是,爲什麼不可能?

+0

,你會從該期待什麼行爲碼? – sharptooth

+0

你問你是否可以對前一個操作的結果調用一個成員函數(可能沒有意識到'op +'有一個函數調用)? –

+0

我只想使用show方法顯示總值(即obj1.x + obj2.x),而不改變使用上述技術的兩個實例的值... – Abhineet

回答

8

是的,它是可能的,只是實現operator + A和有它返回一個類A類:

#include <iostream> 

class A 
{ 
public: 
    explicit A(int v) : value(v) {} 

    void show() const { std::cout << value << '\n'; } 

    int value; 
}; 

A operator+(const A& lhs, const A& rhs) 
{ 
    A result(lhs.value + rhs.value); 
    return result; 
} 

int main() 
{ 
    A a(1); 
    A b(1); 

    (a+b).show(); // prints 2! 

    return 0; 
} 
+0

感謝您的建議。 :) – Abhineet

2

如果您以+運算符的方式重載運算符,並使用A類型的兩個參數併產生一個名爲show的對象,則可以這樣做。

2

如果obj1 + obj2返回一個具有show()函數成員的對象,那麼是的,這是可能的。如果不是,那不是。

因此,它取決於這裏使用的operator +函數,它依賴於obj1和obj2兩種類型。

obj1 + obj2是一個表達式,它有一個類型,該操作返回的對象的類型,就像任何表達式一樣。現在,一旦表達式被執行,你就擁有了這個對象。但是,因爲這裏你沒有將它與名稱聯繫起來(例如使用賦值),所以它是一個「臨時」的,意味着它將在完整表達式的末尾被銷燬。

因此,如果生成的臨時對象的類型確實提供了show()函數,那麼您可以像調用它一樣調用它。

如果它沒有提供show()函數,那麼你試圖調用一個不存在的函數。

所以無論如何,編譯器會阻止你,它不會是一個運行時錯誤。

我會是你,我會設置一個最小的測試項目,只是爲了玩這些原則。

+0

爲什麼它需要是'const'?臨時是**不**''const'。 [看看這個](http://www.ideone.com/u4Z1t)。也許你會感到困惑,因爲你不能將臨時對象綁定到'refs-to-non-const'(這是一個完全不同的問題)。 –

+0

「如果[+]返回一個對象[有]常量show()」 - 這個限制只有當操作符+'返回一個const對象時纔是真的,這通常是合理的(符合C++通常不允許臨時對象爲左值)但可選。 –

+0

有趣,AFAIK它不應該...或者也許是因爲優化(內聯)?正如+運算符所指定的那樣,返回對象是一個臨時對象,所以它不應該是可修改的。 show不是const,所以它不應該在那裏被調用... – Klaim

0

取決於obj1+obj2的結果類型是什麼以及.show()是否是一個常數方法。

+1

['show()'不需要是'const'。](http://stackoverflow.com/questions/6466253/if-temporaries-are-implicitly-const-how -does-this-work/6466316#6466316) –

1

爲+運算符寫一個運算符重載並定義你想要的操作。

在爲+運算符的運算符重載只更新你要像添加各個成員變量或串聯的名稱等有意義根據您的使用情況下,邏輯

然後你就可以調用新object.Show()函數就像對象調用成員函數一樣。

2

是的,你可以使用它,如果你已經超載了運算符class A返回class A obect。

-2

不! (obj1 + obj2)的結果不是對象。您可能超載「=」 及用途:

obj3 = obj1 + obj2; 
obj3.show(); 
+1

爲什麼不呢?如果你可以寫'obj3 = obj1 + obj2',然後用'obj3'做東西,那麼你絕對可以寫'(obj1 + obj2).show()'。 –