作者dwight90488 (陈佳佳)
看板C_and_CPP
标题[问题] Operator overloading const 一问
时间Wed Oct 4 23:26:51 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
Win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
C++
问题(Question):
在看蚂蚁书的operator overloading的时候, 对这个章节的case study: class Array
有点疑惑:
1.
const Array &operator=( const Array & );
这里return回来设为constant有甚麽意义吗? 避免我们做出(a=b)=c 的动作?
2.
const Array &operator=( const Array & );
想make sure一下, 这里使用传入参数为reference的原因是 若使用pass by value,
会copy一份传进来, 就会呼叫到传入参数的copy constructor. 所以才避免使用pass
by value吗?
3.
int &operator[]( int );
int operator[]( int ) const;
在做[]的operator overloading时, 两个传入参数一样, 只是return回来的一个是value,
一个则是reference, 这样我在做call function时, 怎麽判断是进入哪个function?
抱歉, 小的还对C++刚入门, 对这些基础还不熟, 但却又希望能够把他们确实搞懂
先谢谢各位大大解惑了!!!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.164.90.171
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1507130814.A.FD5.html
1F:→ bluesoul: 1, 是 2, 是 3, 一个是const 一个不是 10/04 23:30
2F:→ notBeing: constant object shall call const member function 10/05 01:03
3F:→ PkmX: 1. 通常copy assignment operator是return T&不是 const T& 10/05 01:06
4F:→ PkmX: 2. 也有一种作法是pass by value然後用copy-ctor + swap 10/05 01:07
5F:→ PkmX: 实做 copy assignment operator 俗称 copy-and-swap idiom 10/05 01:07
6F:推 LPH66: 3. 非常数版回传 reference 的原因是要使得 obj[idx]=val; 10/05 04:03
7F:→ LPH66: 这里的 = 能够真的把值赋给左边那个位置 10/05 04:04
8F:→ LPH66: 这当然需要 obj 不是一个常数物件 10/05 04:04
9F:→ LPH66: 同时回传的是 reference 可以做为左值而得以赋值 10/05 04:05
10F:→ LPH66: 啊, 我似乎看懂你的问题了: 第二个函数的 const 表示这函数 10/05 04:06
11F:→ LPH66: 是常数物件也能够呼叫的函数, 在此函数里 this 有常数性 10/05 04:07
12F:→ LPH66: 而第一个函数的 this 则没有常数性 10/05 04:07
13F:→ LPH66: 这个常数性的有无就跟参数的常数性有无一样 10/05 04:08
14F:→ LPH66: 会对 overload 决议造成影响 10/05 04:08
非常谢谢bluesoul, notBeing, PkmX和LPH66诸位的回答, 还是有想要厘清的地方
1. 由於蚂蚁书上写的是有 const T&, 我自己本身是觉得有没有const好像没有差太多,
除了预防(a=b)=c;的情况产生以外, 好像没有甚麽实质效果和意义, 还是有甚麽情况一定
会使用到return为const的时候呢?
2. 谢谢PkmX大大补充, 我有参阅了
https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom
此篇有谈到copy & swap idiom的优势, 看起来可以善用copy construnctor来制作copy
assignment达到code duplication
只不过突然想到原本题目中 即便我今天不传入reference在 const Array &operator=(
const Array ); 而是传vlaue进去,
那就会呼叫到copy construnctor, 我一样在这个assignment的function结束後也会呼叫
到destructor把这个copy的给解构
程式还是能正常运作才是. 所以我的理解是这样子的动作因为会做到copy & destructor
所以会让程式做无意义的动作, 比较耗时和耗资源
所以才会倾向使用传入reference吗?
3. 谢谢LPH66大大的回覆, 我能理解当宣告常数物件的时候, 我只能对第二个函数做使用
但是若非常数物件时, 对我们今天写 array[i] 时, 他怎麽知道是进入第一个函数还是第
二个函数呢?
谢谢您们的帮忙!
※ 编辑: dwight90488 (60.250.8.18), 10/05/2017 11:13:56
15F:→ a27417332: 其实LPH大大有提到,就是 Overload Resolution 去决定 10/05 16:35
16F:→ a27417332: 而之所以会走 Overload Resolution 就是因爲 this 有没 10/05 16:38
17F:→ a27417332: 有 const 修饰 10/05 16:40
18F:→ a27417332: 可以想像成 this 是 member function 的第零个参数(? 10/05 16:42
19F:→ stucode: 关於2.,一般会传 const reference 是为了消弥不必要的 10/05 16:49
20F:→ stucode: 复制成本。例如用普通方式实作 copy assignment 时,会 10/05 16:49
21F:→ stucode: 确认是否为 self-assignment,假如是的话就可省略复制 10/05 16:49
22F:→ stucode: 步骤。在实作 copy&swap 的情况下,把第一步的复制提前 10/05 16:49
23F:→ stucode: 到参数(即传 value 而非 const reference),反而有助 10/05 16:49
24F:→ stucode: 於编译器做 copy elison 最佳化,减少成本。 10/05 16:49
大概有点了解了^^ 谢谢a27417332 & stucode大大您们的解说!
※ 编辑: dwight90488 (1.164.90.171), 10/06/2017 22:45:36