c++中引用变量的使用

c++中引用是已定义的变量的别名,例如,如果把b作为a变量的引用,则可以交替使用a和b来表示该变量。引用的主要用途是作为函数的形参,通过将引用变量作为参数,函数将使用原始数据,而不是副本(把变量之间传入函数使用的是变量的副本),因此引用为处理大型数据参数的函数提供了一种很好的办法。

  • 一、创建引用变量
引用变量用&符号表示(&还可以表示取地址符),例如:把b作为a变量的引用变量:

int a;

int & b = a;

注意:

1.引用变量b和其引用的变量a它们指向相同的值和内存单元,因此改变任意一个值,另一个变量也会跟随一起改变。

2.声明引用的同时必须将其初始化,而不能像指针那样,可以先声明后赋值。(int a; int & b ; b = a;这样是错误的)

3.引用初始化后,就不能被改变。

  • 二、将引用作为函数参数
引用常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法称为应用传递。在下面的例子中比较了函数参数传递的三种方式:按值传递、指针传递、按引用传递。


#include 
void swapr(int & a,int & b);
void swapp(int * p, int *q);
void swapv(int a, int b);

int main(int argc, const char * argv[]) {
    using namespace std;
    int wallet1 = 300;
    int wallet2 = 500;
    cout << "wallet1 = $" << wallet1;
    cout << " wallet2 = $" << wallet2 << endl;

    cout << "Using references to swap contents:\n";
    swapr(wallet1,wallet2);
    cout << "wallet1 = $" << wallet1;
    cout << " wallet2 = $" << wallet2 << endl;

    cout << "Using pointers to swap contents again:\n";
    swapp(&wallet1,&wallet2);
    cout << "wallet1 = $" << wallet1;
    cout << " wallet2 = $" << wallet2 << endl;
    
    cout << "Trying to use passing by value:\n";
    swapv(wallet1, wallet2);   // pass values of variables
    cout << "wallet1 = $" << wallet1;
    cout << " wallet2 = $" << wallet2 << endl;
    return 0;
}

void swapr(int & a,int & b){
    int temp;
    temp = a;
    a= b;
    b=temp;
}

void swapp(int * p,int * q){
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}

void swapv(int  a,int  b){
    int temp;
    temp = a;
    a = b;
    b =temp;
}

输出结果:

wallet1 = $300 wallet2 = $500

Using references to swap contents:

wallet1 = $500 wallet2 = $300

Using pointers to swap contents again:

wallet1 = $300 wallet2 = $500

Trying to use passing by value:

wallet1 = $300 wallet2 = $500


由结果可知,只有引用和指针成功地交换了变量的值,而按值传递的方法不能,那是因为函数按值传递时,传入的只是变量的一个副本,所以在函数中数值被改变后,不影响原变量的值,而应用和指针传入函数时,会同时改变原变量。为防止引用修改了变量,我们可以用const,double a(const double &b),当代码修改了b时,就会报错。

  • 三、将引用用于结构
引用非常适合于结构,使用结构引用参数和变量相同,例如:

struct a

{

int data1;

int data2;

float data3;

};

那么可以编写函数原型:

void set_pc(a & ft);

同样,如果不希望改变传入的结构,可以用const:

void set_pc(const a & ft);

要注意的问题:

1. 避免返回函数终止时不再存在的内存单元引用,比如:

struct free_throws
{
   int made;
   int attempts;
   float percent;
};
const free_throws & clone2(free_throws & ft)
{
   free_throws newguy;
   newguy = ft;
   return newguy;
}
在函数返回一个临时变量(newguy)的引用,在函数运行结束后它将不复存在。

为避免这种问题,可以返回一个座位参数传递给函数的引用:

const free_throws & clone2(free_throws & newguy,free_throws & ft)
{
   newguy = ft;
   return newguy;
}
或者采用new来分配新的储存空间:(当不使用时,要用delete释放)

const free_throws & clone2(free_throws & ft)
{
   free_throws * newguy;
   *newguy = ft;
   return *newguy;
}


  • 四、何时使用引用参数
使用引用参数的主要原因有两个:

  • 程序员能够在函数中修改调用的数据对象
  • 通过传递引用而不是整个数据对象,这可以提高程序的运行速度
使用引用、指针、按值传递的原则:

对于使用传递的值不作修改的函数:

  • 如果数据对象很小,如内置数据类型或者小型结构,用按值传递
  • 如果数据对象是数组,使用指针,这是唯一选择,并将指针声明为指向const指针
  • 如果数据对象是较大的结构,则使用const指针或const引用,可以提高效率
  • 如果数据对象是类对象,则使用cosnt引用。
对与修改调用函数中数据的函数:

  • 如果数据对象是内置数据类型,则使用指针
  • 如果数据对象是数组。则只能用指针
  • 如果数据对象是结构,则使用指针或者引用
  • 如果数据对象是类对象,则使用引用



你可能感兴趣的:(c++)