[问题] 朋友函式和const参照引数

楼主: wa007123456 (大笨羊)   2016-12-27 10:58:26
开发平台(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):
作者: ggBird (ggBird)   2016-12-27 11:55:00
rvalue 不可被修改,所以要加 const
作者: Caesar08 (Caesar)   2016-12-27 13:10:00
只写Complex operator+(const Complex& x,const Complex& y)也可以。friend是看你有没有access该class的privatedata member
作者: Frozenmouse (*冰之鼠*)   2016-12-27 15:25:00
friend就你当对方是朋友,把所有私物都给他看XD引数加const则是代表你接下来的动作不能更改到它,以class来说就只能取member值或透过有宣告const的method来操作a=b+5.0的5.0应该会被转成一个Complex的暂时物件而通常一般人不会想去改动暂时物件,所以会加const在引数
作者: LPH66 (-6.2598534e+18f)   2016-12-27 15:39:00
这里应该要简单说明一下, 这个 operator + 不会是成员函式(也就是名义上不属于 Complex) 因此为了能存取其私有成员才加个 friend 在那里表示“我的私有成员可以给这人看”你原先的写法的 operator + 是成员函式, 因此 + 左边仅当是 Complex 物件时才会呼叫它, 其他状况时是不会的

Links booklink

Contact Us: admin [ a t ] ucptt.com