[c++语法学习]Day10:c++引用
引用做返回值
做返回值的变量最好是在堆上开辟的,谨慎引用做返回值,尤其要注意函数作用域!如果出了作用域对象不在了就不能用做引用返回,否则可以使用。
1. 可以减少拷贝,提高效率
2. 修改返回值 + 获取返回值
// 引用做返回值
// 对于有返回值的函数
// 因为当函数调用结束后会销毁栈帧
// 所以在这里一般编译器会将返回值存储在临时变量中
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; // 这里结果为20s[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修饰的