[问题] Operator overloading const 一问

楼主: dwight90488 (陈佳佳)   2017-10-04 23:26:51
开发平台(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++刚入门, 对这些基础还不熟, 但却又希望能够把他们确实搞懂
先谢谢各位大大解惑了!!!
作者: bluesoul (忙死你老爸)   2017-10-04 23:30:00
1, 是 2, 是 3, 一个是const 一个不是
作者: notBeing (read and be read)   2017-10-05 01:03:00
constant object shall call const member function
作者: PkmX (阿猫)   2017-10-05 01:06:00
1. 通常copy assignment operator是return T&不是 const T&2. 也有一种作法是pass by value然后用copy-ctor + swap实做 copy assignment operator 俗称 copy-and-swap idiom
作者: LPH66 (-6.2598534e+18f)   2017-10-05 04:03:00
3. 非常数版回传 reference 的原因是要使得 obj[idx]=val;这里的 = 能够真的把值赋给左边那个位置这当然需要 obj 不是一个常数物件同时回传的是 reference 可以做为左值而得以赋值啊, 我似乎看懂你的问题了: 第二个函数的 const 表示这函数是常数物件也能够呼叫的函数, 在此函数里 this 有常数性而第一个函数的 this 则没有常数性这个常数性的有无就跟参数的常数性有无一样会对 overload 决议造成影响
作者: a27417332 (等号卡比)   2017-10-05 16:35:00
其实LPH大大有提到,就是 Overload Resolution 去决定而之所以会走 Overload Resolution 就是因为 this 有没有 const 修饰可以想像成 this 是 member function 的第零个参数(?
作者: stucode   2017-10-05 16:49:00
关于2.,一般会传 const reference 是为了消弥不必要的复制成本。例如用普通方式实作 copy assignment 时,会确认是否为 self-assignment,假如是的话就可省略复制步骤。在实作 copy&swap 的情况下,把第一步的复制提前到参数(即传 value 而非 const reference),反而有助于编译器做 copy elison 最佳化,减少成本。

Links booklink

Contact Us: admin [ a t ] ucptt.com