1、C++的&引用符介绍

(1)&符号在C语言中表示取地址运算;
(2)C++对&符号进行拓展,&符号新增了引用的用法;
(3)声明引用时,必须同时对其进行初始化;
(4)引用声明完毕后,相当于目标变量有两个名称,引用名就相当于变量的别名,操作引号名就相当于操作变量本身;

2、引用和指针的对比

(1)指针在C和C++中都有,且使用方法和实现本质完全相同;但是引用只有C++才有;
(2)引用的定义和识别的关键符号是&,注意和指针取地址的含义进行区分;
(3)引用可以理解成功能弱化、安全性增、受限的指针;
(4)引用型变量在定义时必须初始化,而指针变量可以不初始化;
(5)引用型变量初始化后就不能再修改,而指针变量可以;
(6)引用主要用在函数传参和返回值;

3、&引用符实战

3.1、示例代码

#include using namespace std;//C语言用指针实现两个int型数的交换void swap1(int *pa, int *pb){int tmp;tmp = *pa;*pa = *pb;*pb = tmp;}//C++用引用符&实现两个int型数的交换//传入的是变量名的引用名,操作引用名就相当于操作变量本身void swap2(int &ra, int &rb){int tmp;tmp = ra;ra = rb;rb = tmp;}int main(){int a = 1, b = 2;int c = 3, d = 4;//传入变量的指针swap1(&a, &b);//直接传变量名,相当于是传的引用名swap2(c, d);cout<< "a=" << a <<";"<< "b=" << b << endl;cout<<"c=" << c <<";"<< "d=" << d << endl;return 0;}

3.2、代码分析

//程序输出结果[root#]$ a=2;b=1[root#]$ c=4;d=3

(1)上面的代码用指针和引用两种方式,实现了交换两个int型变量数值的函数;
(2)重点关注&符号在指针和引用两种方式是如何使用的;

4、引用的本质分析

4.1、用const修饰引用

int a;const int &b = a;//下面的代码在编译的时候会报错//因为用const去修饰引用就表示引用是只读的,不能修改void swap2(const int &ra, const int &rb){int tmp;tmp = ra;ra = rb;rb = tmp;}//报错信息In function ‘void swap2(const int&, const int&):error: assignment of read-only reference ‘ra’error: assignment of read-only reference ‘rb’

(1)b是变量a的引用名,const修饰后,无法通过b来修改a;
(2)const修饰引用主要是用在函数传参中,当传入的引用只需要读而不需要改时,就可以用const去修饰引用,防止函数中误操作去进行修改,这个C语言的函数用const去修饰传参的思路是一样的;

4.2、引用和sizeof运算符

4.2.1、示例代码

#include using namespace std;int main(){int a = 1;char b;long long c;int &ra = a;char &rb = b;long long &rc = c;cout << "sizeof(ra)=" << sizeof(ra)<<endl;cout << "sizeof(rb)=" << sizeof(rb)<<endl;cout << "sizeof(rc)=" << sizeof(rc)<<endl;return 0;}

4.2.2、结果分析

[root#]$ ./a.out sizeof(ra)=4sizeof(rb)=1sizeof(rc)=8

(1)sizeof得到的不是引用本身的大小,而是引用指向的目标变量的大小;
(2)可以这样理解,引用名就是一个别名而已,本身没有大小,对引用名做sizeof操作,就是对引用指向的变量做sizeof操作;
(3)sizeof操作体现了指针和引用的区别,对指针变量做sizeof操作,得到的确定的字节,4字节(32位操作系统)或者8字节(64位操作系统);

4.3、引用的本质是const指针

(1)int &b = a; 类似于 int * const b = &a;
(2)C++标准并没有规定引用是否占用内存空间,但是大多数编译器都把引用实现为const指针,所以大部分编译器中引用也是要占内存空间的;
(3)引用是天然const的,所以定义时必须初始化指向变量,否则就没意义了;
(4)引用本质是指针,是地址,所以才能实现传址调用的效果;
总结:功能上来说,引用是受限制的指针,相当于用const修饰的指针变量类型;