[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修饰的
相关推荐
晓幂1 天前
【2025】HECTF
笔记·学习·web安全
SmartRadio1 天前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
rfidunion1 天前
QT5.7.0编译移植
开发语言·qt
rit84324991 天前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
慕云紫英1 天前
基金申报的一点经验
学习·aigc
微露清风1 天前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
宝贝儿好1 天前
【强化学习】第六章:无模型控制:在轨MC控制、在轨时序差分学习(Sarsa)、离轨学习(Q-learning)
人工智能·python·深度学习·学习·机器学习·机器人
大、男人1 天前
python之asynccontextmanager学习
开发语言·python·学习
hqwest1 天前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit
做cv的小昊1 天前
【TJU】信息检索与分析课程笔记和练习(8)(9)发现系统和全文获取、专利与知识产权基本知识
大数据·笔记·学习·全文检索·信息检索