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这句话立马就是合理的了。
上面的代码如果用引用来接,则输出的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是不合法,根据这两个指针的性质,第二个指针就是引用的实现。
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++引用的自我见解
- const指针(转载+整理)
- C++引用
- C++随笔(指针和引用的使用注意事项)
- 【C++】基础知识—引用和指针引用
- 【C++】基础知识—内联(置)函数及register关键字
- 关于const指针和指向const对象的指针的初始化问题
- 指针的疑难解释
- 13.C++ 指针和引用
- 正确使用C++引用做返回值和参数
- 函数返回值:引用类型和非引用类型
- const 指针与指向const的指针
- 指针知识点总结
- C++的引用与const指针的关系以及各种传递方式
- C++ Primer 学习笔记_12_指针(续)
- 【C++再学习】【03】函数形参实参与值传递引用传递新解
- C++之引用
- C++中有关const的一点心得
- 关于引用的那些事
- C++左值和右值引用