作者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/cn.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