C++ 引用

在研究引用的时候,把引用当成一个常指针去研究;

在使用引用的时候,把引用理解成变量的别名就可以了。

变量名

实质

一段连续存储空间的别名,是一个标号(门牌号)

通过变量来申请并命名内存空间

通过变量的名字可以使用存储空间

引用的概念

变量名,本身是一段内存的引用,即别名。引用可以看作一个已定义变量的别名

语法

Type &name=var;//type &是一个整体,说明使用引用数据类型

C++ 引用_第1张图片

可以通过指针改变指针指向空间的值,即可以通过解引用改变变量的值

可以通过引用改变变量的值,并且引用没有分配新的内存空间,说白了,就是一个变量两个名字,本质上还是一个变量。

规则

1.引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。

2.声明的时候必须初始化,一经声明,不可变更。

3.可对引用,再次引用。多次引用的结果,是某一变量有多个别名【想取多少取多少】。

4.&符号前有数据类型时,是引用。其它皆为取地址。

C++ 引用_第2张图片

引用作为函数参数

普通引用在声明时必须用其它的变量进行初始化,引用作为函数参数声明时不进行初始化。

C++ 引用_第3张图片

将引用作为函数参数传递的时候,编译器会替我们将实参取地址给引用。

int &a = main::&a;

对一个引用操作赋值的时候,编译器替我们隐藏*操作。

意义——某些情况下可代替指针 重要

1.引用作为其它变量的别名而存在,因此在一些场合可以代替指针

2.引用相对于指针来说具有更好的可读性和实用性

C++ 引用_第4张图片

C++中引入引用后,可以用引用解决的问题,避免用指针来解决。

本质

常量需要初始化,引用也需要初始化,引用可能是一个常量;引用所占的大小和指针相等。所以,引用可能是一个常指针。

int *const p = &a;

引用不开辟新的内存空间

C++ 引用_第5张图片

引用所占用的大小和指针相等(字节长度)

C++ 引用_第6张图片

C++编译器定义引用时,背后做了什么工作?

普通引用有自己的空间吗?没有

1.引用在C++中的内部实现是一个常指针

Type&name Type* const name

2.C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同

3.从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏

C++ 引用_第7张图片

间接赋值的3个必要条件

1.定义两个变量(一个实参,一个形参)

2.建立关联,实参取地址传给形参

3.*p形参去间接的修改实参的值

引用在实现上,只不过是把:间接赋值成立的三个条件的后两步合二为一

当实参传给形参引用的时候,只不过是C++编译器帮我们把程序员手工取了一个实参地址,传给了形参引用(常量指针)

引用作为函数的返回值(引用当左值)

引用作为返回值,不要返回局部变量的引用。因为会释放。

引用如果当函数返回值,函数可以当左值。因为你返回的就是它的别名,它是有内存空间的。

一、

当函数返回值为引用时,若返回栈变量:

不能成为其它引用的初始值(不能作为左值使用)

C++ 引用_第8张图片

二、

当函数返回值为引用时,若返回静态变量或全局变量:

可以成为其他引用的初始值(可作为右值使用,也可作为左值使用)

C++ 引用_第9张图片

总结

引用作为函数返回值,

如果返回值为引用可以当左值,

如果返回值为普通变量不可以当左值。

C++ 引用_第10张图片

指针引用

C++ 引用_第11张图片

C++ 引用_第12张图片

???函数 void FreeTeacher(Teacher pT1)的形参是不是错的?是不是应该是Teacher* &pT1?

if(*ttp!=NULL)

free(*ttp);

const引用

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;

C++ 引用_第13张图片

常引用: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;

原理:直接绑定

C++ 引用_第14张图片

C++ 引用_第15张图片

上图中myt.age是一个常量,不可修改。

总结

1.const int & e相当于const int * const e

2.普通引用int &e;相当于int *const e

3.当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

4.使用字面量对const引用初始化后,将生成一个只读变量

你可能感兴趣的:(C++,c++)