引用

一  基本概念

所谓引用就是两个变量都可以去操作同一个内存,感觉是int a = 10;这句话为a分配了地址和值;于是&a可看作是a的钥匙,而引用就是配了一把钥匙,和a一模一样,都可以操作这片内存,可以修改值。如下例子中,引用后,修改a或者b的值都可以改变同一片内存的值。简单的说,引用就是配钥匙。

#include "iostream"
using namespace std;
int main()
{
	int a = 10;
	
	int &b = a;//创建引用
	cout << a << endl;
	cout << b << endl;

	a = 100;
	cout << a << endl;
	cout << b << endl;

	b = 200;
	cout << a << endl;
	cout << b << endl;

	system("pause");
	return  0;
}

 二 注意事项

  • 引用必须初始化 ,如int &b;这样写是错的。因为不知道b分配的是已有的哪个内存。
  • 一旦引用后不能修改引用,如int a =10; int &b = a;  int c = 10; int &b = c;是错的。b先引用a,然后又引用c这是不行的。

三 引用做函数参数

以下三种传入形参的方法:变量swap0(),指针swap1(),引用swap2()。引用就是没有地址和指针概念的人写代码的思考模式。三种方法都值得好好体会。

#include "iostream"

using namespace std;

void swap0(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

void swap1(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
	cout << "a = " << *a << endl;
	cout << "b = " << b << endl;
}

void swap2(int &a1, int &b1) //传入的形参为引用型的变量,于是在main分配的&a和&a1共用一个内存
{
	int temp = a1;
	a1 = b1;
	b1 = temp;//所以修改实数值可以改变main中的a的值 
	cout << "a1 = " << a1 << endl;
	cout << "b1 = " << b1 << endl;
}
int main()
{
	int a = 10;
	int b = 20;

	swap0(a, b);   
	swap1(&a, &b); 
	swap2(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return  0;
}

四 引用做函数返回值

  • 引用作为函数返回值,必须要用局部静态变量(全局区)以提高程序可靠性。因为函数返回的数据不会失效。如果用局部变量(栈区)可能导致内存访问非法。
  • 函数的引用本质可以看做指向同一片内存的两个变量值;而在写法上:{   int &ref2 = test2();   *ref2 = 100;    }与  { test2() = 100;  } 是等效的。
#include "iostream"

using namespace std;

//返回局部变量引用
int& test1()
{
	int a = 10;
	return a; //局部栈区变量
}
//返回静态变量引用
int& test2()
{
	static int a = 10; //全局区的静态变量。
	return a; 
}

int main()
{
	int &ref = test1(); //收到的局部栈区变量a在test()执行结束之后,a的内存被释放。
						//所以指向a的ref指针访问释放的a的内存会被认定为非法,或者失效。
	cout << "ref = " << ref << endl;//但编译器做了保护,所以第一次可打印。之后就不行了。

	int &ref2 = test2(); //收到的全局区的静态变量在test()执行结束之后,内存不会释放。
						//所以指向a的ref2指针访问释放的a的内存有效。
	cout << "ref2 = " << ref2 << endl;//可一直使用

	test2() = 100;  //函数的调用可作为左值,相当于*ref2 = 100;
	cout << "ref2 = " << ref2 << endl;

	system("pause");
	return  0;
}

五 引用的本质

int a =10;

int& ref = a;         //引用的CPP表达方式
int* const ref = &a;  //引用的C表达方式

ref = 20;  //发现ref为引用 自动转为 *ref = 20;也可写作 *ref = 20;

 引用的本质放到C里面来看就是定义了一个指针常量(int* const),这个指针指向了一个地址(&a),因为是常量指针,所以一旦引用后不能修改引用,因为他是const类型的指针。用的时候把ref当做一个变量直接用就行了。

(说到这儿,讲个题外话:int const * m, const int * n这两个是等价的,代表*m和*n不可变,;m,n可变。而int* const a;表明a不可变, *a可变。)

六 常量引用

一般用于传入函数的形参,防止传入的数据被修改。

//函数形参

int& ref = 10; //错误的,因为10的地址不知道,无法引用。
//但编译器规定了一种简单的写法;
const int& ref = 10;  //代表给ref分配一片地址,且值不可修改。
                      //等价于 int temp = 10; const int& ref = temp; 但只能访问ref.看不到也不能访问"temp"
                      //这种形式往往用于函数的传入参数
void show(const int & val); //所以传入的Val的值在show()中不可被修改



 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值