c++引用

本文详细解析了C++中变量引用的概念,包括其作为函数参数和返回值的作用,以及常量引用的应用。通过比较不同交换代码,强调了传值与传址的区别。重点讲解了引用的本质——指针常量,并揭示了在函数调用中的注意事项。
摘要由CSDN通过智能技术生成

什么是变量的引用

对一个数据可以建立一个引用,它的作用是为变量起一个别名,这是c++对c的一个主要扩充。
注意

  1. 引用不是一种独立的数据类型,对引用只有声明,没有定义。
  2. 声明一个引用时,必须同时使之初始化。特殊情况,可以不用初始化,如引用作为函数形参时,可以不用初始化,而在函数调用时虚实结合实现的。
  3. 在声明一个引用后,不能使之作为另外一个变量的引用。
  4. 不能建立引用数组
  5. 不能建立引用的引用
  6. 可以取引用的地址
  7. 区别引用声明符&和地址运算符&

引用作为函数参数

c++之所以增加引用机制,主要是把它作为函数形参,以扩充函数传递数据的功能。
分析下列三段交换代码

void swap(int a,int b)//传值
{
int temp=a;a=b;b=temp;
}
void swap(int *a,int *b)//传值
{
int temp=*a;*a=*b;*b=temp;
}
void swap(int &a,int &b)//传地址
{
int temp=a;a=b;b=temp;
}

分析上述三种交换代码,可以发现,前两种方式传递的时实参的值。注意第二个传递的也是变量的值,无非这个值是变量的地址,这个是初学者容易搞错的地方。在方式3中,函数的实参是变量名称,而传递的是变量的地址,这个才是传址方式。
总结起来就是:
函数的实参是变量名称,传递的是变量的地址,这个才是传址方式。其他为传值方式。
最后要注意的是,引用不仅可以引用普通的变量,而且还可以引用类对象。

引用作为函数返回值

注意:1.不要返回局部变量的引用,因为局部变量在函数调用完成后,就被系统自动释放了。

#include <iostream>
using namespace std;
int& fun()
{
	int a = 10;
	return a;
}
int main()
{
	int &p = fun();
	cout << p << endl;//默认保留一次
	cout << p << endl;//已经释放
	return 0;
}

在这里插入图片描述
2.函数作为左值

#include <iostream>
using namespace std;
int& fun()
{
	static int a = 10;//静态变量,保存在全局区
	return a;
}
int main()
{
	int &p = fun();
	cout << p << endl;
	cout << p << endl;
	fun() = 100;//函数作为左值
	cout << p << endl;
	cout << p << endl;
	return 0;
}

在这里插入图片描述

引用的本质

在c++内部,引用的本质是一个指针常量(* const)

int &p=a;//自动转换为int * const p=&a;

常量引用

常量引用主要用于形参,防止在函数内部改变对象的值。
可以参考effective c++条款20:尽量以pass-by-reference-const替换pass-by-value。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@菜鸟一枚

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值