[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修饰的
相关推荐
FQNmxDG4S1 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
Slow菜鸟1 小时前
AI学习篇(五) | awesome-design-md 使用说明
人工智能·学习
前端老石人2 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang2 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
狐狐生风2 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
狐狐生风2 小时前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
axng pmje2 小时前
Java语法进阶
java·开发语言·jvm
汉克老师3 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
老前端的功夫3 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python