C++的operator overloading和&之問

以下的程式碼除非註明,全部都是出自於 C++ How to program 5d, DEITEL ------------------------------------------------------------------------ 首先很奇怪的是這兩行 friend ostream &operator<<( ostream &, const Array & ); friend istream &operator>>( istream &, Array &... show more 以下的程式碼除非註明,全部都是出自於
C++ How to program 5d, DEITEL
--------------------------------------...

首先很奇怪的是這兩行

friend ostream &operator<<( ostream &, const Array & );
friend istream &operator>>( istream &, Array & );

我不懂的是,為甚麼ostream和istream不論傳入或傳回,都一定要是用... by reference的方式

我有自己竄改過這段碼,把&都拿掉,然後compile之後就跟我說一個ios_...
所以很明顯的是原本就不允許pass by value,不過為甚麼呢?

我爬了一下知識正裡的文,有人說用&只是方便debug...很顯然的好像不只是...

--------------------------------------...

第二

HugeInt &HugeInt::operator=(const HugeInt &op2){//=
for(int i = 0;i <= 29;i++)
integer[i] = op2.integer[i];
numsign = op2.numsign;
return *this;
}

這是一段我很久以前自己寫的碼
是在為一個名叫HugeInt的class作=的overloading
應該很容易看得出來

只是奇怪的有三點
第一點,如果我把HugeInt &HugeInt::operator=(const HugeInt &op2)裡,const HugeInt &op2的const給拿掉,就會出問題,程式中任何一個會作assign的第方都會...
為甚麼傳入的部分會規定一定要寫const@@?

第二點,我當初其實忘了寫 return *this;這一行,但是居然都沒有出錯...其實函數就算在不是void的情況下也...
不過如果我要做a = b = c這種casecading的把戲的時候就會掛掉...

所以感覺起來,單純的a = b,其實是用copy constructor去做的嗎?

第三點,我又手癢把HugeInt &HugeInt::operator=(const HugeInt &op2)裡中的const HugeInt &op2的&給拿掉了,結果就變成link error?「 [Linker error] undefined reference to `HugeInt::operator=(HugeInt const&)' 」
可是我在definition那裡的&也拿掉了啊@@怎麼會link error...

還有,如果沒有link error的話,pass by value的參數傳入是合法的沒錯吧?
--------------------------------------...

第三問:

const Array &operator=( const Array & );

為甚麼他這麼喜歡回傳用&??
幾乎全部這本書中的operator overloading都用&
這樣如果回傳的不是*this的話,不就會被砍掉了嗎囧
是為了效率問題嗎...?


--------------------------------------...

我知道問題有點多
不過都是圍繞同一個主題的
希望有強者可以詳細的幫我解說
因為以前的強者好像都不太仔細講這裡
知識正以前好像也沒有人這麼喜歡問這裡
但是這個部分(&,const...)真的是這裡很玄妙的地方
很難決定甚麼時候用pass by value甚麼時候pass by reference
甚麼時候回傳要const,甚麼時候不需要const = =


順便小抱怨一下
知識正的標題可以容納的太短了吧
這樣很難把問題描述清楚
然後知識正對於有相似的問題又不準問
!@#$%^&*...
要嘛就可以讓我把標題打長一點來增加辨識度啊
不然就不要做這麼煩人的擋問設計嘛...
希望我的抱怨有人會聽到...
但是請不要為了這個砍我帳號...我只是給個建議而已
Update: 回答novus大的問題:
pass by reference是用一個reference去指向傳來的變數,也就是說,這個變數...

pass by value 是建立一個新的變數去複製一個傳來的變數,所以其實原來的變數並沒有真的被傳過去。


是這樣嗎?
Update 2: 我是很肯定原本忘了寫*this;沒錯
因為這是我很久以前寫的作業
最近抓出來看的時候才發現當時寫錯了XD

compile後還真的沒有糾正這種錯呢...

至於link error,有可能兩位大師說的沒錯吧
不過我是直接"編譯並執行"的,我記得好像DevC++會自動先存檔?

剛剛又重試了一次,還是一樣不行呢...

會出問題的應該就只有針對=的overloading的部分吧?
因為我只有改那裡啊@@
3 answers 3