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.引用比指针使用起来相对更安全。

原创粉丝点击