c++引用极其底层实现

Posted uestclr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++引用极其底层实现相关的知识,希望对你有一定的参考价值。

一、c++中引用的语法是这样的:

int x = 100;

int& _x = x;

它的意思就是是给变量x起了一个别名,在以后的代码中,_x其实就是x,这两个是等价的。举个例子,在《唐伯虎点秋香》中,唐伯虎叫做华安,又叫做9527,其实这三个名字都是同一个人,引用就是这个意思。


注意事项:

引用初始化的时候一定要绑定一个变量;

引用一旦初始化,则终身为这个变量服务;

不能返回局部变量的引用,就像指针一样,不能返回局部变量的指针;


二、引用的几处应用

1、普通的引用

int x = 100;

int& _x = x;

这里还有一个问题,就是int& x = 100;如果写成这样,编译器会报错,对常数的引用必须加const修饰,const int& x = 100;

2、作为函数的形参

int max(int& x,int& y),这样做的好处是没有对实参进行复制拷贝,提高了效率。


3、引用作为函数的返回值

对于这样一个函数int max(int& x,int& y),我们可以这样用int z = max(1,2),这很正常,我们都这样用,但是你绝对不能这样用max(1,2) = 100;也就是说,函数的返回值不能作为左值。但是如果写成这样int& max(jint& x,int& y)之后,max(1,2) = 100这句话立马就是合理的了。

#include <iostream>
using namespace std;
int& getmax(int& x1,int& y1)
	return x1 > y1 ? x1 : y1;

void main()
	int x = 10;
	int y = 123;
	//int z = getmax(x,y);
	int& z = getmax(x,y);//用引用来接,和不用引用来接
	//int z = getmax(x, y);//对比一下,用引用来接返回值,和不用引用来接有什么区别
	getmax(x,y) = 1000;//把z和y全部绑到一起
	cout << z << endl;
	cout << y <<endl;


 
上面的代码如果用引用来接,则输出的z和y都是1000,如果注释掉引用来接这一行,换成没有用引用来接,则输出的z和y是123,1000. 


三、引用的实现

引用的特点就是:一个引用一旦引用了一个变量,就不能再去引用其他的变量了,但是引用的变量可以重新被赋值。基于上面的特点,我们来看两个指针:

int x = 100;

1:int const * pi = &x;

2:int  * const pi = &x;


第一个指针表示这个指针pi还可以解除当前绑定,然后绑定到其他指针上,但是所绑定对象的值不能被重新赋进去。就是说如果有int y = 100的话,pi = &y是合法的,但是*pi = 200就是不合法的。


第二个指针和第一个相反,*pi = 200是合法的,但是pi = &y是不合法,根据这两个指针的性质,第二个指针就是引用的实现。

以上是关于c++引用极其底层实现的主要内容,如果未能解决你的问题,请参考以下文章

C++ 初阶List底层框架模拟实现

C++ 初阶List底层框架模拟实现

信息前沿C++ 引用的本质是什么?

C++:STL——List的模拟实现

C++指针与引用的区别

C++指针与引用的区别