引用

简介:

一、引用简介


 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。


 引用的声明方法:类型标识符 &引用名=目标变量名;


【例】int a; int &ra = a;//定义引用ra,他是变量a的引用,即别名

1.&在这里起标识作用,不是址职运算

2.类型标识符是指目标变量的类型

3.声明引用时,必须同时对其进行初始化

4.引用完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名做为其他变量名的别名。

ra = 1;等价于a = 1;

5.声明一个引用,不是定义了一个新的变量,他只是表示该尹永明是目标变量名的一个别名,他本身不是一种数据类型,因此引用本身不占用高存储单元,系统也不给引用分配存储单元。故引用求地址,是对目标变量求地址。

6.不能建立数组的引用。因为数组是一个由若干个元素组成的集合,所以无法建立一个数组的别名。


二、应用


1.引用做为参数

  引用的一个重要作用就是作为函数的参数,以前的C语言中函数参数传递是值传递,若有大块数据(数组,字符串)作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须选择)就是引用。

  a、传递引用给函数与传递指针的效果是一样的。这时,被调用函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(主调函数中)的操作。

  b、使用引用传递函数的参数,在内存中并没有产生实参的副本,他是直接对实参进行操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参的变量的副本;若传递的是对象,还将调用拷贝构造函数。因此当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

  c、使用指针作为函数的参数虽然也能达到与使用引用相同的效果,但是在被调函数中同样要给形参分配存储单元,且需要重复使用“指针变量名”的形式进行计算,这很容易产生错误且程序的阅读性差;另一个方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更加清晰。


2.常引用

  常引用声明方式:const类型标识符&引用名=目标变量名;

  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。


  引用型参数应该再能被定义为const的情况下,尽量定义为const。

 【例】 

1
2
string foo( );
void  bar(string & s);


 那么下面的表达式将是非法的:   

1
2
bar(foo( ));
bar( "hello world" );


  原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。


3.引用作为返回值

  要以引用返回函数值,则函数定义时要按以下格式

  类型标识符 &函数名(形参列表及类型说明){函数体}

  引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

  

  引用做为返回值,必须遵守以下规则:

  a、不能返回局部变量的引用。原因:局部变量会在函数返回后被销毁,被返回的引用就成了“无所谓的引用”,进程进入位置状态

  b、不能返回函数内部new分配的内存的引用。原因:例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(new分配)就无法释放,造成memory leak。

  c、可以返回类成员的引用,最好是const。原因:主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。


4.引用与一些操作符的重载


5.在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用。


三、引用和多态

  引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

 

1
2
3
4
class  Base;
class  A: public  Base{};
Base b;
A &Ref = b;

  Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。


四、总结


  (1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。


  (2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。


  (3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。


  (4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。




本文转自 七十七快 51CTO博客,原文链接:http://blog.51cto.com/10324228/1866843
相关文章
|
6月前
|
存储 前端开发 rax
【C++】C++引用(上)
【C++】C++引用(上)
|
1月前
|
安全 程序员 C++
c++引用
c++引用
13 0
|
2月前
|
存储 安全 编译器
【c++】引用
【c++】引用
【c++】引用
|
8月前
|
人工智能 安全 编译器
[C++: 引用】(二)
[C++: 引用】(二)
73 0
|
10月前
|
编译器 C++
C++之引用(上)
C++之引用(上)
54 0
|
10月前
|
存储 安全 编译器
|
10月前
|
存储 安全 编译器
C++之引用的介绍
相信大家都看过水浒传,里面的英雄人物除了自己的名字外都有自己的称号,比如:花和尚——鲁智深,豹子头——林冲……,这里我们发现我们人都有自己的别名,那么变量呢,其实变量也有给自己取别名的功能,那么小编今天就给大家介绍一下这个功能。
104 0
|
10月前
|
C语言 C++
C++引用上
用不是新定义一个变量,而是给已存在的变量取一个别名,译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
53 0
|
11月前
|
存储 安全 编译器
C++中的引用&
本文将讲述,C++中的引用&
83 0
|
存储 编译器 C++
【C++】引用(上)
【C++】引用(上)
【C++】引用(上)