C++ note------引用

在理解C++中的引用之前,先理清一下变量,变量的本质为一块内存空间的地址以及空间中存放的数

据,而如果利用地址调用变量,稍显繁琐,所以一般都是给变量命名,调用时直接使用变量名即可,

那么,一个变量是否可以有多个名称呢?C++中的引用刚好能够做到。

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int& b = a;
	cout << "a=" << a << endl;
	cout << "a.add=" << &a << endl;
	cout << "b=" << b << endl;
	cout << "b.add=" << &b << endl;
	return 0;
}

执行结果:
a=10
a.add=00AFFD98
b=10
b.add=00AFFD98

定义一个变量a,赋值为10,引用变量b,变量b与变量a代表的是同一块内存空间,并且输出打印a和b

的值与地址,得到的值都是相同的。而引用的本质,就是一个指针常量

理解引用之后,再看看引用所能实现的功能:

1、作为函数的参数

#include <iostream>
using namespace std;
//值传递
void mySwap01(int a,int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
//址传递
void mySwap02(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
//引用传递
void mySwap03(int& a, int& b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	mySwap01(a, b);
	cout << "mySwap01:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	mySwap02(&a, &b);
	cout << "mySwap02:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	mySwap03(a,b);
	cout << "mySwap03:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	return 0;
}

执行结果:
mySwap01:
a=10
b=20
mySwap02:
a=20
b=10
mySwap03:
a=10
b=20

写了三个交换函数,第一个是值传递,不改变(修饰)实参;第二个是址传递,改变(修饰)实参;

第三个是引用传递,改变(修饰)实参;所以第一个函数执行结果是a,b的值没有改变,第二个的结

果是a,b的值进行了交换,第三个的结果是a,b的值又交换回来了。

2、作为函数返回值

#include <iostream>
using namespace std;
//不要返回局部变量的引用
int& test01()
{
	int a = 10;//局部变量存放在栈区
	return a;
}
int main()
{
	int& ret1 = test01();
	cout << "ret=" << ret1 << endl;//第一次正确是编译器做了保留
	cout << "ret=" << ret1 << endl;//出现随机值,a的内存已经释放
}

执行结果
ret1=10
ret1=1375054224

首先在引用作为返回值时,需要注意的是,函数内部返回的如果是局部变量,返回的引用在输出时,

第一次能够正确是编译器做了保留,第二次是局部变量被释放,解决的办法就是在函数内,给需要返

回的变量初始化时加上static

#include <iostream>
using namespace std;
//函数引用可以作左值
int& test02()
{
	static int a = 10;//静态变量在程序结束后进行释放
	return a;
}
int main()
{
	int& ret2 = test02();
	cout << "ret2=" << ret2 << endl;
	cout << "ret2=" << ret2 << endl;
	test02() = 1000;
	cout << "ret2=" << ret2 << endl;
	cout << "ret2=" << ret2 << endl;
}
执行结果
ret2=10
ret2=10
ret2=1000
ret2=1000

返回类型为引用的函数可以作为左值,第一次输出时返回值为10,而第二次为1000,因为test02返回

的是a的引用,其实就相当于返回一个变量,所以可以作为左值,即相当于执行a=1000

#include <iostream>
using namespace std;

void fun1(int& a)
{
	cout << "a=" << a << endl;
}
void fun2(int& a)
{
	a = 100;
	cout << "a=" << a << endl;
}
int main()
{
	int a = 10;
	fun1(a);
	fun2(a);
	return 0;
}
执行结果
a=10
a=100

另外,为了防止误操作,可以在作为函数参数的引用前加上const,防止外部实参的引用传入函数中,

实参的值被修改。

void fun1(const int& a)
{
	cout << "a=" << a << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值