深入探讨C++中的引用(zz)

引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。

  引用简介

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

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

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

  说明:

  (1)&在此不是求地址运算,而是起标识作用。

  (2)类型标识符是指目标变量的类型。

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

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

   ra=1; 等价于 a=1;

  (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

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

  引用应用

  1、引用作为参数

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

  【例2】:

void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用 
{ int p; p=p1; p1=p2; p2=p; }

  为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:

main( )

int a,b;
cin>>a>>b; //输入a,b两变量的值
swap(a,b); //直接以变量a和b作为实参调用swap函数 
cout<<a<< ' ' <<b; //输出结果 
}

  上述程序运行时,如果输入数据10 20并回车后,则输出结果为20 10。

  由【例2】可看出:

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

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

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

  如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

  2、常引用

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

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

  【例3】:

int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确

  这不光是让代码更健壮,也有些其它方面的需要。

  【例4】:假设有如下函数声明:

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

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

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

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

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

时间: 2024-09-08 05:10:41

深入探讨C++中的引用(zz)的相关文章

block使用小结、在arc中使用block、如何防止循环引用(zz)

标签:  __block   __weak   arc   self   cfgetretaincount 分类: iOS zz from http://www.cnbluebox.com/?p=255 引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代

对象-java中的引用和new的用法

问题描述 java中的引用和new的用法 初学java,有些问题很幼稚,还望各位大神能多扶持 首先,说说引用的问题, 我定义了一个A类.其中初始化属性name为A, 接下来: A a = new A://创建一个对象 A a1 = a://这里好像是一个引用,有点不懂,我把他理解为指针, a = new A; // 这是第二个问题,在创建对象的时候,一般不都是类 对象 = new 类吗?为什么这里可以直接new呢,而且看教程上是说又新分配了一个空间,我想问的是只要是new,都是分配存储空间吗,及

c cpp-error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用

问题描述 error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用 如果把所有的.cpp文件改成.c,程序正常运行.我认为加上extern "C"应该可以正常运行了,但是不行,求解 原理. student.h struct Student { char name[30]; int score; struct Student *next; }; typedef struct Student Stu; typedef struct Student *

图片-在一篇文章中添加引用。。。。

问题描述 在一篇文章中添加引用.... 想图片中一样,添加引用,不使用手动添加,可以用代码实现引用的效果吗,我想在页面中添加引用,请问有谁知道怎么编写,有急用!!! 解决方案 WordPress文章中添加上一篇.下一篇链接专题研究Wordpress文章中添加上一篇.下一篇链接专题研究

理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. >>基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型的变量保存引用值,"引用值"指向内存空间

使ecshop模板中可引用常量的实现方法

比如$smarty.const.'常量',这个就不能用. 其实模板引擎原理上并不复杂,只是把一些模板标签替换为php中的函数,变量,语法结构罢了. 这次要在ecshop模板中加入引用常量的功能,只需在函数make_var()中加入两行代码 复制代码 代码如下: function make_var($val) { if (strrpos($val, '.') === false) { if (isset($this->_var[$val]) && isset($this->_pa

Excel中循环引用的用法

  Excel中循环引用的用法          提到循环引用,恐怕很多同学都不会陌生,而且会敬而远之.在Excel中输入公式时,经常会遇到下面的提示框,这就是因为公式中有循环引用的问题导致的. 通常情况下,如果公式中包含对其他单元格或者运算结果的引用,无论是直接还是间接,都不能包含对自身取值的引用.

EXCEL中数据引用的方法

  EXCEL中数据引用的方法          第一步,观察需要引用的数据中,目标名称是否有重复,无重复名称,可以使用VLOOKUP函数,有重复名称,可以使用SUMIF函数.如下图所示: VLOOKUP=(名称A,数据范围A,第A列数据,0或者1),函数意义表示为在"数据范围A内"将与"名称A"所对应的"第A列数据"引用出来,最后的0表示准确引用,1表示模糊引用,基本默认为0; 注意:数列数的时候,一定是从数据范围内的第一列开始数,名称A所在的

excel中绝对引用,相对引用,与快捷键相对引用图文教程

  我们在用excel处理数据的过程中,经常要用到拖拽单元格以进行公式复制,引用的数据是已有单元格中的数据,我们可能需要: 1)绝对引用,就是指引用某一单元格的数值,不随着拖拽而变成引用了其他数值 2)也可能需要相对引用,只引用行数据或列数据 3)还有这几种引用的方便快捷键 此方法应用广泛,上班的白领,理工科的专家,准备论文的毕业生,你们都会用的到哦 方法/步骤 1.看这个表格里的I2单元格,公式是"=1.2*(C2+D2+E2)/F2"其中1.2是一个系数,但是,我们在这个表格中,1