C++中的引用
来源:互联网 发布:网络风险有哪些 编辑:程序博客网 时间:2024/06/03 09:52
1.什么是函数的引用
对一个数据可以使用“引用”,这是C++对C的一个重要扩充,引用的作用是为变量起一个别名。假如有一个变量a,想给它起一个别名b,可以这样写:
int a; //定义a是整型变量int &b=a; //声明b是a的引用
以上语句声明了b是a的引用,即b是a的一个别名。经过这样的声明后,a和b的作用相同,都代表同一变量。
引用特性:
1. 在上述声明中,&是引用声明符,并不代表地址;
2. 将b声明为a的引用,并不需要为b另外开辟内存单元;
3. b和a占内存中的同一个存储单元,它们具有同一地址;
4. 引用一旦绑定了一个实体,就不能再改变为其他变量的引用 ;
5. 声明一个引用时,必须同时使之初始化。
2.引用作为函数参数
C++中用引用作为函数参数有以下两个原因:
1.在函数内部可以对此参数进行修改;
2.提高函数调用和运行效率。
下面对这两点原因进行详述:
对于第一点:
void swap(int x,int y) { int tmp; tmp=x; x=y; y=tmp; } int main() { a=3; b=4; swap(a,b); printf("a=%d,b=%d",a,b) return 0; }
上述swap函数的功能是交换a,b的值,但是值传递的方式显然并不能达到效果。 x,y为形参,如果只是传值,根据函数特性,函数在调用完成后就会销毁,并不能达到交换的效果。
void swap(int &x,int &y) { int tmp; tmp=x; x=y; y=tmp; } int main() { a=3; b=4; swap(a,b); printf("a=%d,b=%d",a,b) return 0; }
由上述引用特性可知,引用是变量的别名。在swap函数的形参列表中声明a和b是整型变量的引用。当main函数调用swap函数时,由实参把变量名传给形参。a的名字传给引用变量x,b的名字传给引用变量y,这样x,y成为a,b的别名。a和x代表同一变量,b和y代表同一变量。在swap函数内部使x,y进行对换,显然a,b的值同时改变了,这样就达到交换的目的。
对于第二点,可以结合第一点分析,x和y是实参的引用,不用经过值的传递机制,已经有了实参值的信息。所以没有了传值和生成副本的时间和空间消耗。当程序对效率要求比较高时,这是非常必要的。
3.引用作为返回值
引用作为返回值的几点说明:
1.以引用返回函数值,定义函数时需要在函数名前加&
2.用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
int& Add (int d1, int d2)// int Add ( int d1 , int d2){ int ret = d1 + d2; return ret ;}void test(){ int a = 3, b = 4; int c = Add( a, b ); cout<<"c:" <<c<< endl;}
下面我们通过汇编来看一下传值返回和传引⽤返回
int Add (int d1, int d2){ int ret = d1 + d2;008242DE mov eax,dword ptr [d1] 008242E1 add eax,dword ptr [d2] 008242E4 mov dword ptr [ret],eax return ret;008242E7 mov eax,dword ptr [ret]}
传值返回时,是将ret的值放到eax寄存器中。
int Add& (int d1, int d2){ int ret = d1 + d2;002242E8 mov eax,dword ptr [d1] 002242EB add eax,dword ptr [d2] 002242EE mov dword ptr [ret],eax return ret;002242F1 lea eax,[ret] }
传引用返回时,是取ret的地址到eax寄存器中。
引用作为返回值,应该遵守以下规则:
1.不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。
2.如果返回对象出了当前函数的作⽤域依旧存在,则最好使⽤引⽤返回,因为这样更⾼效。
4.const引用
语法如下:
const int &b=a;
const引用变量,使得变量具有只读属性,
int a = 5;const int& b = a; //这样声明使得b具有只读属性b = 2; //error,b具有只读属性,不可更改a = 5; //ok
当不希望函数内改变参数x的值时,尽量使⽤常引⽤传参。
常引用特性:
1.const引用可以用同类型的变量初始化;
2.可用同类型的常量来初始化,c++编译器会为常量分配空间,并将引用名作为这段空间的别名;
3.可用不同类型的变量来初始化。
5.指针和引用
引用和指针的区别和联系
1.引⽤只能在定义时初始化⼀次,之后不能改变指向其它变量(从⼀⽽终);指针变量的值可变。
2.一旦一个引用被初始化为指向一个对象,就不能再指向其他对象,而指针可以在任何时候指向任何一个同类型对象 ;
3.没有NULL引用,但有NULL指针;
4.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数;
5.引用自加改变变量的内容,指针自加改变了指针指向 ;
6.有多级指针,但是没有多级引用 ;
7.引用比指针使用起来相对更安全。
- c语言中的引用
- 【C++】:C++中的引用
- 深入探讨C 中的引用
- 深入探讨C 中的引用
- C++/CLI中的引用类型
- 深入探讨C 中的引用
- C++中的引用
- [C++]C++中的引用(转)
- 【引用】C中的类型转换
- C语言中的引用调用
- 深入探讨c++中的引用
- C/C++中的指针、引用和JAVA中的引用
- C/C++中的引用和指针
- c语言形参中的引用变量
- C/C++中的引用和指针
- C/C++中的引用和指针
- c语言实现cpp中的引用传递
- C和C++中的引用和指针
- php分页
- #8 通过Actions触发变化
- Jquery的ajax默认的ContentType和数据格式
- poj 3253 Fence Repair(优先队列+贪心)
- csu1329 一个盒子
- C++中的引用
- jdbc测试mysql数据库sql预解析(绑定变量)
- 常用linux命令(20个)
- React && Redux 学习笔记(一)
- Android Input Method Sample Code Analysis
- 由Sophix引发的安卓热更新底层原理探索
- 内容解析者获取手机通讯录信息
- SpringMvc的@RequestBody注解
- Android音频系统之AudioFlinger(二)