1.引用是个别名,当建立引用时,程序用另一个变量的名字来初始化它,从那个时候起,引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。
2.引用不是值,不占存储空间,声明引用时,目标的存储状态不会改变,所以既然定义有具体分配空间的含义,引用就是只有声明,没有定义。
3.引用在声明时必须被初始化,否则会造成编译错误。
4.如果程序寻找引用的地址,它返回目标的地址。
5.对void进行引用是不允许的,例如: void &a = 3; //error
6.void只是在语法上是一个类型,但没有任何一个变量或者对象,其类型为void.
7.不能建立引用的数组: 例如: int a[10];
int &ra[10] = a;//error
8.因为数组是某个数据类型元素的集合,数组名表示该元素空间的起始地址,它自己不是一个名副其实的数据类型。
9.引用本身不是一个数据类型,所以没有引用的引用,也没有引用的指针。
10.int &不是类型,定义时不产生内存空间,所以在引用上的引用不存在。
11.引用传递参数:
传递引用给函数和传递指针的效果一样,传递的是原来的变量或对象,而不是在函数作用域内建立的变量或者对象的副本。
引用具有指针的威力,但是调用引用传递的函数时,可读性比指针传递好,引用具有传值方式函数调用语法的简单性与可读性,但是威力却比传值方式强。
12.引用存在的问题:
因为引用隐藏了函数所使用的参数传递类型,所以无法从看到的函数调用判断其是值传递还是引用传递。
13.返回多个值
用引用给函数传递多个值,然后由函数给引用的入参填入正确的值,引用和指针都可以完成这个操作。
14.用引用返回值:
函数返回值时,要生成值的副本,而用引用返回值时,不会生成值的副本。注意函数返回的是不在作用域范围内的变量或者对象的引用,就有问题了,这个与返回一个局部作用域指针性质一样严重。
15.函数调用作为左值
返回一个引用使得一个函数调用表达式成为左值表达式的可能。
16.用const限定引用
传递指针和引用更大的目的是效率,当一个数据类型很大时,因为传值需要复制副本,所以不可取。
程序有时候不允许传递的指针所指向的值被修改或者传递的引用被修改,但传递的地址特征使得所传递的参数随时有被修改的危险。
保护实参不被修改的办法是传递const指针和引用。
15.