您现在的位置是:首页 > 正文

2022.5.13 C++基础入门——引用和inline函数

2024-04-01 01:03:15阅读 1

1.引用

1.1引用定义

用我们通俗的话说,引用就是别名,即就是a=10,c引用a,那么c也就是;引用的符号用&来表示,例如上句话可以用c++编写为:
int a = 10 ;
int &c = a ;
那么c就是a,但是有人会说这不就是直接把c替换成a就是了,其实并不只是这么简单的意思,通过如下的图来理解引用的含义:
在这里插入图片描述
分析:
假设图中A的地址为100,B的地址为200;如果执行int B=A,只是将A的值给B,其B的地址不会是A的地址,而是重新开辟一个区域,即就是上述图中的地址200;但是如果执行int &C=A,这就相当于给A取了个别名叫做C,而且C的地址也是100。
代码解释:
在这里插入图片描述
图中红色框标注的就是引用的意思,看ABC的值一样,但是地址是不同的,因此引用的意思就是两个变量完全相等,即值和地址(开辟的空间)。
概括:&和类型结合就是引用符号,不是取地址符号,代表别名的意思!!!
在C++中主要注意两个符号的含义:* 和 &

1.2 引用的特点

例1:int &x ;
在这里插入图片描述
这说明定义引用必须初始化
例2:int& y = NULL
在这里插入图片描述
这说明没有空引用
例3:int A = 10; int&& C = A;
在这里插入图片描述
这说明在引用中,没有引用的引用,所谓的二级引用。

1.3 const 引用

例4:

    int a = 10;
	const int b = 20;
	int& c = b;
	const int& x = b;
	const int& y = a;
	const int& z = 10;

分析:在例4中,可以看出变量a初始化为10,变量b的值为20,由于前面有const修饰,那么在后面的操作中b的权限只有读,不能写,因此,如果将b的值用c来引用,那么c的类型为int ,这就是不合理的,因为变量c的权限不仅可读也可修改,即,
在这里插入图片描述
在这里插入图片描述
但是,下面这几行代码是可以执行的,为什么呢?
在这里插入图片描述
总结:const引用是一个万能引用,不仅可以引用常变量,普通变量,还可以引用字面常量。但是在引用字面常量时,分两步来走,比如:const int &z = 10;,那么执行的程序其实是 int tmp = 10; const int &z = tmp;

1.4 引用作为形参替代指针

例5:写一个交换函数,交换a和b的值。
在这里插入图片描述
在这个代码中,可以看出,我们在函数中传递形参时,必须传递指针类型的a和b,但是在c中学过,要是传递指针,必须第一步对指针进行判空操作,也就是图中红色框。因此,将引用引入函数中,因为没有空引用,就不需要判空。
在这里插入图片描述
总结:在函数中传递形参时,我们可以将引用替代指针作为形参进行传递,因为没有空引用,在代码实现之前,不用进行判空操作,可以说明,引用比指针传递安全,同时,也可以说明,引用其实就是一种指针。

1.5 其他引用形式

int main()
{
	int a = 10, b = 20;
	int ar[5] = { 1,2,3,4,5 };
	int* p = &a;
	int*& rp = p;  //引用指针
	int& x = ar[0];
	int(&br)[5] = ar;//引用数组

	return 0;
}

1.6 总结指针与引用的区别

(1)从语法上讲,指针变量存储某个实例(变量或者对象)的地址,而引用是某个实例的别名;
(2)程序为指针变量分配内存区域,而不为引用分配内存区域;
(3)解引用是指针使用时要在前面加“*”,引用可以直接使用;
(4)指针变量的值可以发生改变,存储不同实例的地址,而引用在定义时就被初始化,之后无法改变(不能是其他实例的引用);
(5)指针变量的值可以为NULL或者nullptr,而引用没有空引用;
(6)指针变量作为形参时需要测试它的合法性(即就是加入assert函数或者if判空),而引用不需要判空;
(7)对指针变量使用“sizeof”得到的是指针变量的大小,但对引用变量使用“sizeof”得到的是变量的大小;
(8)理论上指针的级数没有限制,即一级指针、二级指针等,但是引用只有一级,没有引用的引用(二级引用),但有指针的指针;
(9)++引用与++指针的效果不一样;
例如,就++操作而言:
对指针变量的操作,会使指针变量指向下一个实体(变量或者对象)的地址,而不是改变所指实体(变量或者对象)的内容;
对引用的操作直接反应到所引用的实体(变量或者对象);
(10)不可以对函数中的局部变量或对象以引用或指针的方式返回;
(11)不可以对函数中的局部变量或对象以引用或指针方式返回。

2.inline函数

2.1 为什么要用inline函数

当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销,我们想解决这些问题,在函数调用时就需要引入inline函数。

2.2 inline函数要注意的点

①inline是一种以空间换时间的做法,省去调用函数的开销,但是当函数体的代码过长或者是递归函数,即便给代码加上inline关键字,也不会在调用点以内联展开该函数;
②inline对于编译器而言只是一个建议,编译器会自动优化;
③inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到。

2.3 什么情况下使用inline合适

如果函数的执行开销小于开栈清栈开销(函数体较小),使用inline处理效率高,如果函数的执行开销大于开栈清栈开销,使用普通函数方式处理。

网站文章