[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修饰的
相关推荐
g***B7384 分钟前
JavaScript在Node.js中的模块系统
开发语言·javascript·node.js
烤麻辣烫19 分钟前
黑马程序员大事件后端概览(表现效果升级版)
java·开发语言·学习·spring·intellij-idea
思密吗喽23 分钟前
宠物商城系统
java·开发语言·vue·毕业设计·springboot·课程设计·宠物
csbysj202027 分钟前
Lua 函数
开发语言
头发还在的女程序员28 分钟前
三天搞定招聘系统!附完整源码
开发语言·python
温轻舟34 分钟前
Python自动办公工具06-设置Word文档中表格的格式
开发语言·python·word·自动化工具·温轻舟
p***c94934 分钟前
PHP在电商中的电商系统
开发语言·php
Z***258041 分钟前
JavaScript在Node.js中的Deno
开发语言·javascript·node.js
a***56061 小时前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
San30.1 小时前
ES6+ 新特性解析:让 JavaScript 开发更优雅高效
开发语言·javascript·es6