您的位置:首页 > 编程语言 > C语言/C++

c++引用极其底层实现

2016-04-13 15:19 323 查看
一、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是不合法,根据这两个指针的性质,第二个指针就是引用的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息