笔记:C++引用


一、引用的概念

引用是已定义的变量的别名(另一个名称)。例如,如果将b作为a变量的引用,则可以交替使用a和b来表示该变量的使用。如下图所示,a = 10,地址为0x0004,若b为a的引用,则b指向的地址为a的地址,此时当a的值变化为12时,即a=12,b的内容也会改变为12;同理,当b的内容发生改变时,a的值也会发生相应改变。
在这里插入图片描述
示例代码如下:

int main() {
	// 声明b为a的引用
	int a = 20;						
	int &b = a;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	
	// 改变b的内容
	b = 40;
	cout << "a = " << a << endl;
	cout << "b = " << a << endl;

	// 改变a的值
	a = 30;
	cout << "a = " << a << endl;
	cout << "b = " << a << endl;

	// 打印a、b地址
	cout << &a << endl;
	cout << &b << endl;
}

代码结果如下所示:
在这里插入图片描述
从结果可以看出,当引用b发生改变时,a的值也发生改变;当a的值发生改变时,引用b的内容也发生改变,并且a、b的地址相同。


二、引用的使用

1、引用的语法

C++通过&符号用来声明引用,语法为:数据类型 &别名 = 目标变量名
例如要将b声明为int类型a的引用,即b作为a的别名,可以通过以下代码实现:

int main() {
   // 声明b为int类型a的引用
   int a = 20;						
   int &b = a;
   cout << "a = " << a << endl;
   cout << "b = " << b << endl;
}

运行结果如下所示:
在这里插入图片描述

2、引用的注意事项

(1)引用在定义时必须初始化
(2)引用在初始化后,不可再为别的变量作引用
(3)引用不能引用常量值
2.1、对于(1)引用在定义时必须初始化,即不能仅:数据类型 &别名,如int &b;示例代码如下:

int main() {
	// 声明b为a的引用
	int a = 20;						
	int& b;
}

显然,上述代码是有误的,在编译器中会出现需要初始化的提示:
在这里插入图片描述

2.2、对于(2)引用在初始化后,不可再为别的变量作引用,示例代码如下:

int main() {
	// 声明b为a的引用
	int a = 10;						
	int& b = a;
	
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	int c = 15;
	b = c;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	
	// 改变c的值
	c = 0;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	
	// 改变a的值
	a = 25;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	// 改变b的内容
	b = 35;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	// 打印a、b地址
	cout << &a << endl;
	cout << &b << endl;
}

代码运行结果如下所示:
在这里插入图片描述
当b声明为a的引用后,b = c是对b的内容进行赋值,其值与变量c的值相等,并不是将b重新声明为c的引用,后续对c的值进行改变,b的内容并没发生改变,并且,当对a的值更改时,b的内容发生改变,当b的内容发生改变时,a的值也发生相应改变,因此引用在初始化后,不可再为别的变量作引用。

2.3、对于(3)引用不能引用常量值,例如:int &b = 10,该语法是错误的。


三、引用的应用

1、引用做函数参数

引用的主要应用就是将他作为函数的参数,让形参修改实参,扩充了函数传递数据的功能。通过函数的调用,无需重新赋值,即可实现变量的改变,其效果和地址传递一样。下面将对三种常见值传递方法进行对比,示例代码如下:

//1. 值传递
void mySwap01(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}

//2. 地址传递
void mySwap02(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

//3. 引用传递
void mySwap03(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

int main() {

	int a1 = 10;
	int b1 = 20;
	
	int a2 = 10;
	int b2 = 20;

	int a3 = 10;
	int b3 = 20;

	mySwap01(a1, b1);
	cout << "a1:" << a1 << " b1:" << b1 << endl;

	mySwap02(&a2, &b2);
	cout << "a2:" << a2 << " b2:" << b2 << endl;

	mySwap03(a3, b3);
	cout << "a3:" << a3 << " b3:" << b3 << endl;

	system("pause");

	return 0;
}

运行结果如下所示:
在这里插入图片描述
根据运行结果可以发现,地址传递和引用传递改变了实参的值,但是引用的语法却更加简洁和方便。

2、引用做函数返回值

引用是可以作为函数的返回值存在的,用法为:函数调用 = xx。示例代码如下:

int& test02() {
	static int a = 20;
	return a;
}

int main() {
	int& ref2 = test02();
	int& ref3 = test02();
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	cout << "ref3 = " << ref3 << endl;
	cout << "ref3 = " << ref3 << endl;

	test02() = 1000;

	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	cout << "ref3 = " << ref3 << endl;
	cout << "ref3 = " << ref3 << endl;

	ref3 = 50;
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	cout << "ref3 = " << ref3 << endl;
	cout << "ref3 = " << ref3 << endl;
	system("pause");

	return 0;
}

代码运行结果如下:
在这里插入图片描述
上述代码中,函数test02()的返回值即为test02()中的静态变量a的引用,当改变返回值或ref2、ref3时,三者皆会同时发生改变。
注意:不能返回局部变量的引用,如下列代码即为错误示范:

//返回局部变量引用
int& test01() {
	int a = 10; //局部变量
	return a;
}

int main() {

	//不能返回局部变量的引用
	int& ref = test01();
	cout << "ref = " << ref << endl;
	cout << "ref = " << ref << endl;

	system("pause");

	return 0;
}	

三、常量引用

常量引用主要用来修饰形参,防止误操作,通常是为了防止函数的形参对实参进行改变。
通常使用语法:const 数据类型& 名称,通过该语法,将无法对该引用进行修改内容的操作。
示例代码如下:

int main() {

	int ref0 = 10;  
	const int& ref = ref0;

	ref = 100;  //加入const后不可以修改变量
	cout << ref << endl;

	system("pause");

	return 0;
}

通过运行,上述代码出现报错,原因是不能对常量引用ref进行修改。
结合函数使用场景,我们定义一个名为showValue(int& v)的函数,对数据进行打印操作,具体代码如下:

//引用使用的场景,通常用来修饰形参
void showValue(int& v) {
	v += 10;
	cout << v << endl;
}

int main() {

	//函数中利用常量引用防止误操作修改实参
	int a = 10;
	showValue(a);

	system("pause");

	return 0;
}

代码运行结果为:20,将上述的showValue(int& v)函数更改为showValue(const int& v),具体如下:

void showValue(const int& v) {
	v += 10;
	cout << v << endl;
}

int main() {

	//函数中利用常量引用防止误操作修改实参
	int a = 10;
	showValue(a);

	system("pause");

	return 0;
}

运行上述代码,程序出现报错,原因是showValue(const int& v)不允许对v进行更改,以此常量引用修饰形参可以防止误操作。


参考

视频《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》
书籍《C++ Primer Plus》(第六版)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值