C++引用变量的使用

来源:互联网 发布:js修改parameter 编辑:程序博客网 时间:2024/05/14 07:59

引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。

使用引用参数的主要原因有两个。

1、程序员能够修改调用函数中的数据对象

2、通过传递引用而不是整个数据对象,可以提高程序的运行速度

当数据对象较大时(如结构和类对象),第二个原因最重要。什么时候使用引用、什么时候使用指针?什么时候按值传递?下面是一些指导原则?

对于使用传递的值而不修改的函数。

(1)如果数据对象很小,如内置数据类型或小型结构,则按值传递。

(2)如果对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。

(3)如果数据对象是较大的结构,则使用const指针或const引用,以提高程序效率。这样可以节省复制结构所需的时间和空间。

(4)如果对象是类对象,则使用const引用。类设计的语义常常要走使用引用,这是C++新增这项特性的主要原因。因此,传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:

(1)如果数据对象是内置数据类型,则使用指针。如果看到诸如fixit(&x)这样的代码(其中x是int),则很明显,该函数将修改x。

(2)如果数据对象是数组,则只能使用指针。

(3)如果数据对象是结构,则使用指针或引用。

(4)如果数据类型是类对象,则使用引用。

应用一:用于内置类型int

实现数据交换的功能。

void swapr(int & a, int & b)    // use references{    int temp;    temp = a;       // use a, b for values of variables    a = b;    b = temp;}void swapp(int * p, int * q)    // 使用指针同样可以完成{    int temp;    temp = *p;      // use *p, *q for values of variables    *p = *q;    *q = temp;}引用的调用为:swap(x,y);指针的调用为:swap(&x,&y);
应用二:用于结构体对象和类对象

(1)这里要对结构体内部的内容进行修改,只能使用引用参数或者指针参数,不能按值传递。void set_pc(free_throws & ft){    if (ft.attempts != 0)        ft.percent = 100.0f *float(ft.made)/float(ft.attempts);    else        ft.percent = 0;}(2)由于不修改内部的参数,因此函数使用一个const引用参数。注:使用const使函数能够处理const和非const实参,否则将只能接受非const数据。void display(const free_throws & ft){    using std::cout;    cout << "Name: " << ft.name << '\n';    cout << "  Made: " << ft.made << '\t';    cout << "Attempts: " << ft.attempts << '\t';    cout << "Percent: " << ft.percent << '\n';}(3)如果返回类型被声明为free_throws 而不是free_throws &,上述返回语句将返回target(也就是team)的拷贝。但返回类型为引用,这意味着返回的是最初传递给accumulate()的team对象。效率会更高。free_throws & accumulate(free_throws & target, const free_throws & source){    target.attempts += source.attempts;    target.made += source.made;    set_pc(target);    return target;}

返回引用时需要注意的问题:

应避免返回函数终止时不再存在的内存单元引用。应避免编写下面这样的代码:const free_throws & clone2(free_throws & ft){free_throws newguy;   //first step to big errornewguy=ft;            //copy inforeturn newguy;        //return reference to copy}同样,也应避免返回指向临时变量的指针。返回值为非引用类型或者指针类型的则可以使用上述方法,例如:string version1(const string & s1, const string & s2){  //按值传递也可以,使用引用可以提高效率    string temp;         temp = s2 + s1 + s2;    return temp;}


0 0
原创粉丝点击