在研究引用的时候,把引用当成一个常指针去研究;
在使用引用的时候,把引用理解成变量的别名就可以了。
一段连续存储空间的别名,是一个标号(门牌号)
通过变量来申请并命名内存空间
通过变量的名字可以使用存储空间
变量名,本身是一段内存的引用,即别名。引用可以看作一个已定义变量的别名
Type &name=var;
//type &是一个整体,说明使用引用数据类型
可以通过指针改变指针指向空间的值,即可以通过解引用改变变量的值
可以通过引用改变变量的值,并且引用没有分配新的内存空间,说白了,就是一个变量两个名字,本质上还是一个变量。
1.引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2.声明的时候必须初始化,一经声明,不可变更。
3.可对引用,再次引用。多次引用的结果,是某一变量有多个别名【想取多少取多少】。
4.&符号前有数据类型时,是引用。其它皆为取地址。
普通引用在声明时必须用其它的变量进行初始化,引用作为函数参数声明时不进行初始化。
将引用作为函数参数传递的时候,编译器会替我们将实参取地址给引用。
int &a = main::&a;
对一个引用操作赋值的时候,编译器替我们隐藏*操作。
1.引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2.引用相对于指针来说具有更好的可读性和实用性
C++中引入引用后,可以用引用解决的问题,避免用指针来解决。
常量需要初始化,引用也需要初始化,引用可能是一个常量;引用所占的大小和指针相等。所以,引用可能是一个常指针。
int *const p = &a;
C++编译器定义引用时,背后做了什么工作?
普通引用有自己的空间吗?没有
1.引用在C++中的内部实现是一个常指针
Type&name
Type* const name
2.C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
3.从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
1.定义两个变量(一个实参,一个形参)
2.建立关联,实参取地址传给形参
3.*p形参去间接的修改实参的值
引用在实现上,只不过是把:间接赋值成立的三个条件的后两步合二为一
当实参传给形参引用的时候,只不过是C++编译器帮我们把程序员手工取了一个实参地址,传给了形参引用(常量指针)
引用作为返回值,不要返回局部变量的引用。因为会释放。
引用如果当函数返回值,函数可以当左值。因为你返回的就是它的别名,它是有内存空间的。
当函数返回值为引用时,若返回栈变量:
不能成为其它引用的初始值(不能作为左值使用)
当函数返回值为引用时,若返回静态变量或全局变量:
可以成为其他引用的初始值(可作为右值使用,也可作为左值使用)
引用作为函数返回值,
如果返回值为引用可以当左值,
如果返回值为普通变量不可以当左值。
???函数 void FreeTeacher(Teacher pT1)的形参是不是错的?是不是应该是Teacher* &pT1?
if(*ttp!=NULL)
free(*ttp);
const引用有较多使用。它可以防止对象的值被随意修改。因而具有一些特性。
1.const对象的引用必须是const的,将普通引用绑定到const对象是不合法的。这个原因比较简单。既然对象是const的,表示不能被修改,引用当然也不能修改,必须使用const引用。实际上,
const int a=1;
int &b=a;
这种写法是不合格的,编译不过。
const int a=1;
const int &b=a;
2.const引用可使用相关类型的对象(常量,非同类型常量或表达式)初始化。这个是const引用与普通引用最大的区别。
const int &a=2;
是合法的
double x=3.14;
const int &b=x;
也是合法的 //将引用的相容性扩大到赋值号的相容性
const int temp=x;
const int &b=temp;
常引用:x可以自己改变,与此同时y也变,但是不可以通过y改变x
为什么const引用和普通引用原理不同?
普通引用只能引用同类型的左值,const引用将引用的相容性扩大到与“=”相容性相同的范围
为什么要扩大?(哥哥理解)
const引用通常用来作为函数的形参,在传参的过程可能参数类型不符,为了在传参的时候不报错、不重载函数,所以这样更加方便
const引用的原理:
int a;
const int &b=a;
原理:间接绑定
const int temp=a;
//赋值操作,将a的值赋给临时变量,赋值操作可以满足的就都可以const引用
const int &b=temp;
//b引用的是临时变量temp
普通引用原理:
int a;
int &b=a;
原理:直接绑定
上图中myt.age
是一个常量,不可修改。
1.const int & e
相当于const int * const e
2.普通引用int &e;
相当于int *const e
3.当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
4.使用字面量对const引用初始化后,将生成一个只读变量