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的内容。