C++引用


引用就是给已存在的变量取一个别名 

类型&引用变量名=引用实体

使用时要注意以下几点要求

(1)引用必须在定义时初始化;

(2)一个变量可以有多个引用

(3)应用一旦引用了一个实体,就不能再引用其他实体


引用作参数

在最开始学习C语言的时候容易出现下面这种错误,形参x,y的改变不会改变实参a,b,所以并没有实现想要的交换。

在C语言阶段,想通过形参改变实参,我们必须传实参的地址,通过地址来改变实参

void Swap(int* x, int* y)
{
	int tmp=*x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 5;
	int b = 9;
	Swap(&a, &b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

}

在C++下,可以使用引用作为形参,int&x=a、int&y=b,x和a都是描述的同一块空间,y和b描述的同一块空间,修改x,y就相当于修改了a,b的值,所以代码是可以实现交换功能的。

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 5;
	int b = 9;
	Swap(a, b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

}

引用作返回值

为什么下面这个代码当Add销毁后,main函数中仍可以打印ret的值,3.这里的ret应该被销毁无法得到返回值才对?

因为在返回的时候,并不是ret的值直接返回给主调函数,而是在Add函数还没有销毁时,先把ret的值传给一个临时变量,一般是寄存器,寄存器保存值后,Add函数销毁,临时变量把值再传给主调函数。

int Add(int x, int y)
{
	int ret = x + y;
	return ret;
}
int main()
{
	cout << "Add的返回值为:" << Add(1, 2) << endl;
}

下面count1打印结果为乱码,count2打印正确,Count 1和Count 2返回的是各自n的别名,因为Count1销毁时,原ret的内存还给了系统,类似野指针,所以它其实返回了一个不属于被访问内存的别名,所以打印为乱码

而Count2中的n是static修饰过的,n的作用域是函数内部,但生命周期是全局的,所以Count2销毁,n还存在的,没有还给操作系统,调用Count2时,返回n的别名,所以可以正确打印返回值

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。


通过上面引用作为参数或者返回值,可以实现一个函数拥有不同的用途。下面的Func函数返回的是x的别名,而x又是a的别名,所以在这里很有意思的是,函数可以作为等号左边被赋值(其实就是赋值Func函数的返回值),赋值5,x为5,a为5。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值