[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修饰的
相关推荐
军军君0117 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
青岑CTF18 小时前
攻防世界-Ics-05-胎教版wp
开发语言·安全·web安全·网络安全·php
Li emily18 小时前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股
bylander18 小时前
【AI学习】TM Forum《Autonomous Networks Implementation Guide》快速理解
人工智能·学习·智能体·自动驾驶网络
xxxmine18 小时前
redis学习
数据库·redis·学习
APIshop18 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
血小板要健康18 小时前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
淼淼76319 小时前
安装jdk1.8
java·开发语言
PfCoder19 小时前
WinForm真入门(23)---PictureBox 控件详细用法
开发语言·windows·c#·winform
Yff_world19 小时前
网络通信模型
学习·网络安全