[問題] 朋友函式和const參照引數

看板C_and_CPP作者 (大笨羊)時間9年前 (2016/12/27 10:58), 編輯推噓1(1019)
留言20則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 大家好! 小弟是C++的新手 我們都知道 int& q=5; 的寫法是錯誤的 如果要達成上述的目標 必須宣告成 const int& q=5; 如今我要做一個複數類別 並實作運算子多載 例如: Complex operator+(const Complex& x){ ... } 然後宣告三個物件 Complex x,y,z; z=x+y //ok z=x+5.0 //ok z=5.0+x //Wrong 所知道正確寫法會被改為 friend Complex operator+(const Complex& x,const Complex& y){} 才能達成! 我比較好奇的是friend到底真正改變的是甚麼? 我看過了一些網路資料但是 還是有點不太清楚 最後 為什麼一定要把引數宣告成const? 這是預防甚麼情況呢? 我的想法大概是如下: Complex a,b; a=b+5.0 為的是因為5.0是常數 所以一定要宣告成const才能接收 我覺得觀念不是很清楚 有沒有更詳盡的講法@@ 感謝各位 餵入的資料(Input):預期的正確結果(Expected Output):錯誤結果(Wrong Output):程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.199.186 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1482807509.A.2DE.html

12/27 11:55, , 1F
rvalue 不可被修改,所以要加 const
12/27 11:55, 1F

12/27 13:10, , 2F
只寫
12/27 13:10, 2F

12/27 13:10, , 3F
Complex operator+(const Complex& x,const Complex& y)
12/27 13:10, 3F

12/27 13:11, , 4F
也可以。friend是看你有沒有access該class的private
12/27 13:11, 4F

12/27 13:11, , 5F
data member
12/27 13:11, 5F

12/27 15:25, , 6F
friend就你當對方是朋友,把所有私物都給他看XD
12/27 15:25, 6F

12/27 15:32, , 7F
引數加const則是代表你接下來的動作不能更改到它,以
12/27 15:32, 7F

12/27 15:32, , 8F
class來說就只能取member值或透過有宣告const的metho
12/27 15:32, 8F

12/27 15:32, , 9F
d來操作
12/27 15:32, 9F

12/27 15:37, , 10F
a=b+5.0的5.0應該會被轉成一個Complex的暫時物件
12/27 15:37, 10F

12/27 15:37, , 11F
而通常一般人不會想去改動暫時物件,所以會加const在
12/27 15:37, 11F

12/27 15:37, , 12F
引數
12/27 15:37, 12F

12/27 15:39, , 13F
這裡應該要簡單說明一下, 這個 operator + 不會是成員函式
12/27 15:39, 13F

12/27 15:40, , 14F
(也就是名義上不屬於 Complex) 因此為了能存取其私有成員
12/27 15:40, 14F

12/27 15:40, , 15F
才加個 friend 在那裡表示「我的私有成員可以給這人看」
12/27 15:40, 15F

12/27 15:41, , 16F
你原先的寫法的 operator + 是成員函式, 因此 + 左邊僅當
12/27 15:41, 16F

12/27 15:41, , 17F
是 Complex 物件時才會呼叫它, 其他狀況時是不會的
12/27 15:41, 17F

12/28 13:44, , 18F
5.0那個常數會先丟給constructor建成物件 如果你有寫
12/28 13:44, 18F

12/28 13:44, , 19F
的話 const只是表示function不能亂改這個物件
12/28 13:44, 19F

12/29 01:10, , 20F
上面講錯了 我昏頭了
12/29 01:10, 20F
文章代碼(AID): #1OOTZLBU (C_and_CPP)