2010-07-23 60 views
6

爲什麼流操作員(<,<,>>)的重載應該保持爲朋友而不是讓他們成爲班級的成員?Stream Operator Overloading

+3

當功能與班級的私人成員發生關係時,它使編程變得更加激動人心。 – zneak 2010-07-23 22:08:30

回答

9

當您將二元運算符重載爲類的成員函數時,當第一個操作數屬於類類型時,將使用過載。

對於流操作符,第一個操作數是流而不是(通常)是自定義類。

由於這個原因,被設計爲以傳統方式使用的自定義類的重載流操作符不能是自定義類的成員函數,它們必須是自由函數。 (我假設流類沒有打開改變;如果他們是你可以添加成員函數來流類來處理額外的自定義類型,但從依賴性的角度來看,這通常是不受歡迎的。 )

他們是不是朋友應該取決於他們是否需要接觸非公開的班級成員。

+0

我認爲這有點誤導。它們*可以是成員函數,但是通常使用它們(寫入流),它們需要是成員函數。 – 2010-07-23 22:13:32

+0

@sztomi:我不明白你的意見。不,他們不需要擔任成員職能;它們不能成爲成員函數(除非你正在編寫流類或從世界其他地方向後寫流媒體運算符)。 – 2010-07-23 22:17:03

+0

所以是的,他們可以是成員函數。如果你希望他們像平常一樣工作(就像這個詞的其他部分使用它),你必須將它們定義爲朋友。我正是這個意思。 – 2010-07-23 22:19:46

0

什麼類的成員?什麼是左手操作數的類型?

但是,它們不一定是friend,除非需要訪問其他不可訪問的私人數據。

2

所以,你可以說:

some_stream << my_class; 

注意,成員操作符的定義使得左側的類它的自我。例如:

my_class << some_stream; 

這不是標準流應該如何工作。