C++中的引用

一、变量名回顾

1、变量是一段实际连续的存储空间的别名;
2、程序中通过变量来申请并命名存储空间;
3、通过变量的名字可以使用存储空间;
思考:对于一段连续的存储空间只能有一个别名吗?

二、引用

引用可以看做一个已定义变量的别名;它的语法:Type& name = var;
注意: 普通引用在声明时必须用其他的变量进行初始化。
列如:

int a = 4;
int& b = a;
b = 5;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("&a = %08x\n",&a);
printf("&b = %08x\n",&b);

结果:

a = 5
b = 5
&a = 0022FF48
&b = 0022FF48

**引用的意义:
1、引用作为其他变量的别名尔存在,因此在一些场合可以代替指针;
2、引用相对于指针来说具有更好的可读性和实用性;
注意: 引用作为函数参数声明时不进行初始化。
列如:
swap函数的实现对比:
C++:

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

C语言:

void swap(int *pa, int *pb)
{
    int t = *pa;
    *pa = *pb;
    *pb = t;
}
swap(&a,&b);

const引用
1、在C++中可以声明const引用;
2、语法:const Type &name = var;
3、const引用让变量拥有只读属性;
注意: const引用时,只是引用具有了只读属性,原来的变量还是没有只读属性的;
列如:

int a;
const int &b = a;

这时变量a是没有只读属性的,但引用b是有只读属性的,所以可以通过a修改变量的值,而不能通过b修改变量的值。
4、当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名;使用常量对const引用初始化后将生成一个只读变量;
5、当函数返回值为引用时,若返回栈变量,则不能成为其它引用的初始值,也不能作为左值使用;若返回静态变量或全局变量,则可以成为其它引用的初始值,既可以作为右值使用,也可以作为左值使用;

三、引用的实质

引用在C++中的内部实现是一个常指针Type &name <--> Type *const name
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
从使用的角度,引用会让人误会其只是一个别名,没用自己的存储空间,这是C++为了实用性而做出的细节隐藏。
意思是说:下面的两个是等价的:

void f(int &a)                 void f(int * const a)
{                              {
    a = 5;          <-->           *a = 5;
}                              }

只是引用在使用时更加的方便,在使用它的时候就像在它的左边默认加了一个*似得,在对他进行初始化的时候就像是在其它变量前默认加了一个&一样。以至于使它看起来像是起了一个别名一样。

四、C++对三目运算符做了什么

当三目运算符的可能返回都是变量时,返回的是变量引用;当三目运算符的可能返回中有常量时,返回的是值;

int a = 1;
int b = 2;

(a < b ? a :b) = 3;//正确,返回a或b的引用,可以作为右值使用
(a < b ? 1 :b) = 3;//错误,可能返回中有常量,返回的是值,不能作为右值使用

五、小结

1、C++中的引用可以看做变量的别名来使用;
2、C++中的常引用可以使得一个变量的引用拥有只读属性,变量本身还是没有只读属性的;
3、C++中的常引用可以用常量初始化而得到一个只读变量;
4、C++中引用的本质是一个指针常量;
5、当三目运算符的可能返回都是变量时,返回的是变量引用;当三目运算符的可能返回中有常量时,返回的是值;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值