<C++>5.如何全方位理解C++中的“引用”?

C++引用
一、概述
在C++中,变量的“引用”就是对变量起别名,因此引用也称为别名。与C语言中的typedef有很大区别,不要混淆:
1、typedef是对变量类型起别名,如整型,结构体类型等。例:typedef int datatype;---datatype就等于int。
2、引用则是对变量起别名。比如int a; ----引用是对变量a起别名,而不是对int。

二、引用格式
类型 &引用名 = 已定义的变量名
例:int a=1; int &b = a;
这里对a起了个别名叫b,b就是a。&在这里不代表取址符,而应该叫引用符。
举个生活中的例子,我们给王明取了个绰号叫小明,那么小明就是王明,是同一个人。
注意:引用变量的类型必须与已定义的变量的类型一致。不能int a=1; char &b=a;

三、说明
1、引用不是一种独立的数据类型,它必须与某一种数据类型的变量相联系。在声明引用的同时,必须对其初始化。
如:int i=1; int &j; j = i;这样是错误的。
2、 引用变量与被引用变量具有相同的地址,也可以理解为共用一块内存。因此其中一个值发生改变,都将改变。比如王明长高了1cm,那么我们不能说小明没有长高。
3、可以多重引用,也就是说可以给别名起别名。
如:int i=1; int &j=i; int &k=j;  这样,j和k都是i的别名,当然也可以说k是j的别名。
4、可以对指针起别名。
如:int *p; 实际上可以将变量p看成是“int *”类型的,那么,对其引用也必须使用int *型的别名。 例:int *&q=p;

四、引用的应用
1、引用作为函数参数
C++调用函数时,传递函数参数一共有三种情况:
(1)将变量名作为函数参数:传递给形参的是实参变量的值,即“传值调用”。因为形参和实参占用不同的内存空间,所以传值调用在函数执行期间形参值发生变化并不会影响实参的值。即传值调用是单向的。

例:

void swap(int a, int b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
} 

调用:swap(a, b);并不能交换a与b的值。


(2)指针变量作为函数参数:传给形参的是实参的地址,即“传址调用”。这种雕鹰方式,形参和实参共用一个内存单元,所以是能够实现函数内部对实参的值产生影响。即传址调用是双向的。

例:

void swap(int *a, int *b)
{
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
} 

调用:swap(&a, &b);能够交换a与b的值。


(3)引用作为函数参数:把变量的引用作为函数参数,传送变量的别名。这时,传给形参的也是实参的地址,也属于“传址调用”。

例:

void swap(int &a, int &b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}

调用:swap(a, b);能够交换a与b的值。

2、使用引用返回函数值
一般情况下,我们调用有返回值的函数通常是放在赋值运算符的右边,即函数返回值作为右值。使用引用返回函数的值,可将函数调用作为左值。
例:
/* test1.cpp */
#include <iostream>
using namespace std;

int a[5] = {1, 2, 3, 4, 5};
int &arr(int i)
{
	return a[i];
}

int main(void)
{
	cout<<arr(3)<<endl;	// 输出a[4]的值
	arr(3) = 10;	// 相当于将a[4]赋值为10。
	cout<<arr(3)<<endl;
	
	return 0;
}
输出结果:
4

10


五、扩展说明
1、不允许使用void型的引用。
如:void &b = a;是错误的。
2、不能对整个数组引用,可以对数组中的某个元素进行引用。

例:

int a[3]={1, 2, 3};

int &b[4]=a;

错误!数组名a只代表数组a首元素的地址,其本身不是一个占有内存空间的变量。
3、不能对引用进行引用。

例:

int a=1;

int &&b=a;
错误!
4、不能建立引用类型的指针,但是可以对指针进行引用。

例:

int a=1; int &*p=a;// 错误!

int *p; int *&q=p; // 正确!
5、可以将引用的地址赋给指针。

例:

int a=1;

int &b=a; // 这里的“&”是引用符
int *p=&b; // 这里的“&”是取址符
注意区分两个“&”不同的含义。
6、可以使用const对引用加以限定,不允许修改该引用的值。

例:

int a=1;

const int &b=a;
b=2; // 错误!被const修饰的变量不允许改变。
但是!但是!我们可以通过修改a的值来间接地修改b的值,也就是说,若a=3;此时a与b的值都是3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值