[c++语法学习]Day10:c++引用

引用做返回值

​ 做返回值的变量最好是在堆上开辟的,谨慎引用做返回值,尤其要注意函数作用域!如果出了作用域对象不在了就不能用做引用返回,否则可以使用。

复制代码
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修饰的
相关推荐
hy.z_7771 分钟前
【C++】13. 继承
c++
汉字萌萌哒29 分钟前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院35 分钟前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙1 小时前
C语言:变量三属性——存储类型
c语言·开发语言
2401_890603401 小时前
C++ 继承
c++
小O的算法实验室1 小时前
IEEE TII,学习为多目标深度学习生成偏好
人工智能·深度学习·学习
果果燕2 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++
江畔柳前堤2 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
2601_949950632 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
老洋葱Mr_Onion2 小时前
【C++】信息学奥赛CSP通关之路——CSP-J/S第一轮原创全真模拟试卷集(2026)卷四全卷解析
开发语言·c++