作者wa007123456 (大笨羊)
看板C_and_CPP
標題[問題] 朋友函式和const參照引數
時間Tue Dec 27 10:58:26 2016
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1482807509.A.2DE.html
1F:→ ggBird: rvalue 不可被修改,所以要加 const 12/27 11:55
2F:→ Caesar08: 只寫 12/27 13:10
3F:→ Caesar08: Complex operator+(const Complex& x,const Complex& y) 12/27 13:10
4F:→ Caesar08: 也可以。friend是看你有沒有access該class的private 12/27 13:11
5F:→ Caesar08: data member 12/27 13:11
6F:→ Frozenmouse: friend就你當對方是朋友,把所有私物都給他看XD 12/27 15:25
7F:→ Frozenmouse: 引數加const則是代表你接下來的動作不能更改到它,以 12/27 15:32
8F:→ Frozenmouse: class來說就只能取member值或透過有宣告const的metho 12/27 15:32
9F:→ Frozenmouse: d來操作 12/27 15:32
10F:→ Frozenmouse: a=b+5.0的5.0應該會被轉成一個Complex的暫時物件 12/27 15:37
11F:→ Frozenmouse: 而通常一般人不會想去改動暫時物件,所以會加const在 12/27 15:37
12F:→ Frozenmouse: 引數 12/27 15:37
13F:推 LPH66: 這裡應該要簡單說明一下, 這個 operator + 不會是成員函式 12/27 15:39
14F:→ LPH66: (也就是名義上不屬於 Complex) 因此為了能存取其私有成員 12/27 15:40
15F:→ LPH66: 才加個 friend 在那裡表示「我的私有成員可以給這人看」 12/27 15:40
16F:→ LPH66: 你原先的寫法的 operator + 是成員函式, 因此 + 左邊僅當 12/27 15:41
17F:→ LPH66: 是 Complex 物件時才會呼叫它, 其他狀況時是不會的 12/27 15:41
18F:→ friends29: 5.0那個常數會先丟給constructor建成物件 如果你有寫 12/28 13:44
19F:→ friends29: 的話 const只是表示function不能亂改這個物件 12/28 13:44
20F:→ friends29: 上面講錯了 我昏頭了 12/29 01:10