引用做返回值
做返回值的变量最好是在堆上开辟的,谨慎引用做返回值,尤其要注意函数作用域!如果出了作用域对象不在了就不能用做引用返回,否则可以使用。
1. 可以减少拷贝,提高效率
2. 修改返回值 + 获取返回值
c++
// 引用做返回值
// 对于有返回值的函数
// 因为当函数调用结束后会销毁栈帧
// 所以在这里一般编译器会将返回值存储在临时变量中
int count() {
static int n = 0;
n++;
// 还是会生成临时变量
return n;
}
// 1.传引用返回
int& count1() {
// 如果这里如果不是静态变量
// 则栈帧被销毁后,返回值可能是正确可能不正确,是随机值!
// 主要看编译器是否清理栈帧
// 此时可以使用
static int n = 0;
n++;
// 优点1:减少拷贝,提高效率
// 尤其是大对象,深拷贝的对象
return n;
}
int& count2(){
// 错误❌
int n = 0;
n++;
return n;
}
int main() {
int ret = count();
// 返回 n 的别名
int ret1 = count1();
return 0;
}
/*----------------------------------------*/
// 2.重要应用:修改返回值,获取返回值
// 尤其是在设计栈,队列等方法的过程中,因为类已经提前声明了,所以是一直存在的,所以在这里使用引用做返回值很方便
struct SeqList
{
int a[100];
size_t size;
int& at(int pos)
{
assert(pos >= 0 && pos < 100);
return a[pos];
}
// 运算符重载
int& operator[](int pos) {
assert(pos >= 0 && pos < 100);
return a[pos];
}
};
SeqList s;
s.at(2) = 20;
cout <<"s.a[2] = " << s.a[2] << endl; // 这里结果为20
s[2] += 10;
cout << "s.a[2] = " << s.a[2] << endl;// 这里结果为30
/*----------------------------------------*/
// 3.常引用
// 引用过程中,权限不能放大,这里一个是int , 一个是 const int
const int a = 0;
int& b = a; // 不可以
// 但是权限可以平移,可以缩小
// 权限缩小的是 对应引用 的权限
int x = 0;
int& y = x;
const int& z = y; // 可以,权限缩小
x++;
y++;
z++; // 错误,z 是 const修饰的