Effective C++ 读书笔记 条款10:令operator=返回一个reference to *this

Core List

1. 函数返回值和引用的区别

int val;

int GetValue() { return val; }    

int GetReference() {return val;}

int result = GetValue();    // 系统产生返回值副本temp, temp = GetValue(); result = temp; 

int &result = GetReference();    // 系统不产生返回值副本,直接返回全部变量 val 的引用

注:

函数返回值和返回引用的区别在于系统是否产生一个返回值的副本


2. a=(b=c) 实例分析 (a.operate=(b.opeare=(c)))

(1) operate= 返回值

     b=c;    //  返回一个临时变量temp1,temp1 通过 copy 构造函数被初始化(拷贝构造函数调用第一次)

     a=temp1;    //  返回一个临时变量temp2,temp2 通过 copy 构造函数被初始化(拷贝构造函数调用第二次)

(2) operate= 返回引用

    b=c;    //  返回对象 b 的引用 ref_b, 不产生返回值副本,不调用拷贝构造函数

    a = ref_b;    //  返回对象 a 的引用 ref_a, 不生成返回值副本,不调用拷贝构造函数

注:使用引用作为返回值的效率优于使用值。


3. (a=b)=c 实例分析

1) operate= 返回值

     a=b;    //  返回一个临时变量temp1,temp1 通过 copy 构造函数被初始化(拷贝构造函数调用第一次)

     temp1=c;    //  返回一个临时变量temp2,temp2 通过 copy 构造函数被初始化(拷贝构造函数调用第二次)

     注:这里最终只是给 temp1 进行了赋值,而 a 并未如愿成为 c 的值得,即表达式的初衷并未实现。

(2) operate= 返回引用

    a=b;    //  返回对象 a 的引用 ref_a, 不产生返回值副本,不调用拷贝构造函数

    ref_a = c;    //  返回对象 a 的引用 ref_a1, 不生成返回值副本,不调用拷贝构造函数

    注:引用是不可再被赋值的,最后一句ref_a 不是成为了 c 的引用, 而是通过ref_a 的这个引用,是 a 的值修改为c的值,改变的是a的内容。






你可能感兴趣的:(Effective C++ 读书笔记 条款10:令operator=返回一个reference to *this)