个人总结和理解
引用(reference)的定义:
int a;
int &b = a;
C++中的引用即是给变量起别名。变量在编译的时候用内存地址替换,相同的变量名用相同的地址替换,变量名只是给这个内存地址单元起了一个我们方便编程的一个名字。那么引用的定义便是给这个内存空间在原有的名字基础上,再次起了一个别名,而不是重新分配内存空间。编译器在编译的时候,这两个不同的名字就用相同的地址替换。那么上边的定义中,变量a,b便是同一个地址单元的不同的两个名字。
1、引用是一种关系型声明,声明的时候必须初始化,一经声明,不可变更。
2、可对引用再次引用,多次引用的结果是某一变量具有多个别名。
C++中的引用,让很多需要上级指针才能完成的事情变成可在平级内进行。
例如:
//在C语言中想要实现两个数据的交换(int a,int b)
void swap(int m,int n)
{
int temp;
temp = n;
n = m;
m = temp
}
//显然无法实现。需要用到指针
void swap(int* p,int* q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
//函数调用时需要写成 swap(&a,&b);
//在C++中,引用作为函数的参数
void swap(int& m ,int& n)
{
int temp;
temp = n;
n = m;
m = temp
}
//可完成,函数调用时直接写成swap(a,b);
我的理解为,在函数调用的时候,给变量a起了别名m,b起了别名n,所对应的内存空间一致,那么对于m,n的操作,a,b的值也会改变,实现交换。一句话就是:引用是对变量作用域的一种扩展。
定义指针的引用 :
int* p = &a;
int*& q = p;
//但不能对引用再次引用,也不能定义引用的指针定义数组的引用
int arr[3] = {1,2,3};
int(&arrr)[3] = arr;
(&)是取地址还是定义引用需要根据具体的语境决定,c++中对其进行了重载。
4月3日补充:
常引用
1、const对象的引用必须是const的,将普通的引用绑定到const对象是不合法的。
const int a = 1;
int &b = a; //这种写法是不合法的,编译不过。
2、const引用可使用相关类型的对象(常量、非同类型的变量和表达式)初始化。这个是const引用于普通引用的最大区别。
const int &a = 2; //合法
double x = 3.14;
const int &b = a; //合法
const引用的目的是,禁止通过修改引用的值来改变被引用的对象
const引用使用相关类型对象初始化时发生了如下过程:
int temp = val;
const int &ref = temp;
//建立了一个无名的临时空间,引用是对无名的临时空间变量的引用。
举例说明:
double val = 3.14;
const int &ref = val;
double &ref2 = val;
cout<<ref<<" "<<ref2<<endl;
val = 4.14;
cout<<ref<<" "<<ref2<<endl;
上述输出的结果是3 3.14和3 4.14。 因为ref是const的,在初始化的过程中已经给了定值,不允许修改(建立无名的临时变量空间),而被引用的对象是val是非const的,所以val的修改并未影响到ref的值。而ref2的值发生了相应的变化。