C++引用的做用和用法

引用就是某一变量(目标)的一个别名,对引用的操做与对变量直接操做彻底同样。ios

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

例如:函数

int q;
int &ra=a;

说明:spa

  • &在此不是求地址运算,而是标识做用。
  • 类型表示符是指目标变量的类型。
  • 声明引用时,必须同时对其进行初始化。
  • 引用声明完,至关于目标变量名有两个别名,即该目标原名称和应用名,切不能把该引用名做为其余变量名的别名。
  • 声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它自己不是一种数据类型,所以引用自己不占存储单元,系统也不给引用分配存储单元。故:对指针

    引用求地址,就是对目标变量求地址。&ra与&a相等。code

  •  不能创建数组的引用。由于数组是一个由若干个元素所组成的集合,因此没法创建一个数组的别名。对象

引用应用blog

  1. 引用做为参数

引用的一个重要做用就是做为函数的参数。之前的C语言中函数参数传递是值传递,若是有大块数据做为参数传递的时候,采用的方案每每是指针,由于这样能够避免将整块数据所有压栈,内存

能够提升程序的效率。可是如今(C++中)又增长了一种一样有效率的选择(在某些特殊状况下又是必须的选择),就是引用。ci

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

为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量做为实参进行调用便可,而不须要实参变量有任何的特殊要求。

如:对应上面定义的swap函数,相应的主调函数可写为:

main()
{
  int a,b;
  cin>>a>>b;
  swap(a,b);
//直接以a,b做为实参调用swap函数
  cout<<a<<' '<<b;        
}
  1. 传递引用给函数和传递指针给函数的效果是同样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,因此在被调函数中,对形参变量的操做就是对其相应的目标对象的操做。
  2. 使用引用传递函数的参数,在内存中并无产生实参的副本,它是直接对实参操做;而使用通常变量传递函数的参数,当发生函数调用时,须要给形参分配存储单元,形参变量是实参

    变量的副本;若是传递的是对象,还将调用拷贝构造函数。所以,当参数传递的数据较大时,用引用比用通常变量传递参数的效率和所占空间都好。 

  3. 使用指针做为函数的参数虽然也能达到与使用引用的效果,可是,在被调函数中一样要给形参分配存储单元,且须要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序

    的阅读性较差;另外一方面,在主调函数的调用点处,必须用变量的地址做为实参。而引用更容易使用,更清晰。

二、引用做为返回值

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

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

{函数体} 

 说明:

1以引用返回函数值,定义函数时须要在函数名前加

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

 例

#include <iostream.h>
float temp;
float fn1(float r);//声明函数fn1
float &fn2(float r);声明函数fn2
float fn1(float r)//定义函数fn1,它以返回值的方式返回函数值
{
    temp=(float)(r*r*3.14);
    return temp;
}
float &fn2(float r)//定义函数fn2,它以引用方式返回函数值
{
    temp=(float)(r*r*3.14);
    return temp;
}
void main ()//主函数
{
    float a=fn1(10.0)//系统生成要返回值的副本(即临时变量)
    float &b=fn1(10.0)//可能会出错,
//不能从被调函数中返回一个临时变量或局部变量的引用
    float c=fn2(10.0); //第3种状况,系统不生成返回值的副本   
 //能够从被调函数中返回一个全局变量的引用 
   float &d=fn2(10.0); //第4种状况,系统不生成返回值的副本 
   //能够从被调函数中返回一个全局变量的引用 
   cout<<a<<c<<d;
}
相关文章
相关标签/搜索