C++学习第八章 9.22(8.2)

发布于:2022-12-10 ⋅ 阅读:(548) ⋅ 点赞:(0)
  • 8.2.4 将引用用于结构

引用非常适合用于结构和类(自定义类型)。使用结构引用参数的方式和使用基本变量引用相同,只需要在声明结构时使用引用运算符&即可。

先假设有一个自定义的结构:

struct person{
    std::string name;
    int sex;
    int habits;
};

后面可以如下编写函数原型,在函数中将结构指向该结构的引用作为参数:

void setting_name(person & pr);  //简化下结构

 不修改传入的结构则:

void show(const person & pr); //此处不允许更改结构函数

PS:一个程序初始化了多个结构对象,若是指定的初始值比函数成员少,余下的成员将会被设置为0。

 

  1. 程序调用

 若设置一个函数调用:

accumlate(team,one);   //team,one皆为结构参数情况下

函数accumulate()中接收了两个结构参数,并将设置的第二个结构的成员attemps和made的数据添加到第一个结构的相应的成员中。只修改了第一个结构,因此第一个参数为引用,而第二个为const引用:

Free_charge & accumulate(Free_charge & target,const Free_charge &source)

//此处target与source作为Free_charge的引用参数

返回值在上面的函数调用中并没用使用。虽然可以使用返回值声明为void。接着下看:

display(accumulate(team,two)); 

上方代码将结构对象team作为第一个参数传递给了accumulate(),所以可以知道函数accumulate()中,target指向team。函数accumulate()修改team,在返回指向它的引用 。返回语句如下:

return target;   

 虽然单句代码并不能看出来返回引用,但可以观察函数头与原型:

Free_charge & accumulate(Free_charge & target,const Free_charge & source);

如果返回类型是Free_charge而不是Free_charge&,上述语句将返回target(也就是team)的拷贝。但返回类型为引用,这意味着返回的是最开始传递给accumulate()的team对象。

     2.为何返回引用

传统返回机制与按值传递函数参数类似:计算关键字return后面的表达式,并将结果返回给调用函数。概念上来说,这个值被复制到一个临时位置,而调用程序将使用这个值。

如下所示:

        double m=sqrt(16.0);  //4.0

        cout<<sqrt(25.0);   //5.0

第一条语句4.0->临时位置->m;第二条语句5.0->临时位置->cout。

现在看下方语句:

dup=accumulate(team,five);

如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。但在返回值为引用时,直接吧team复制到dup,其效率相对更高。

PS:返回引用的函数实际上是被引用的变量的别名。

       

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

返回引用的时候应当注意避免返回终止时不再存在的内存单元引用。举例:

const Free_charge & clone(Free_charge & fr){
    Free_charge newone;    //错误
    newone=fr;        //拷贝操作
    return newone;   //返回近似于拷贝值
}

  该函数返回一个指向临时变量的(newone)的引用,函数运行完毕后它将不存在。最好的解决办法应当返回一个作为参数传递给函数的引用。作为参数的引用将指向调用函数的引用,因此返回的引用也将指向这些数据。另一种办法便是使用new来分配新的储存空间。

 

<函数引用,引用的注意事项>

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到