C++引用(笔记)

来源:互联网 发布:未来软件的发展趋势 编辑:程序博客网 时间:2024/05/18 12:33

引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;

eg.int rat = 100;int & rodent = rat;  //rodent是rat的引用

引用的几个特点:
1、引用和原变量具有相同的值,地址也是相同的。可以说,rat相当于一个人的名字,rodent是他的小名。无论怎么称呼,都是指这个人。所以,rat的值变,rodent值变;rodent值变,rat的值也变。
2、这里的&并不是取地址符。
3、在使用引用变量时,必须在声明时初始化。而且一旦初始化便无法再改变值。即是说,引用也可称作指针常量。

eg.int & rodent = rat; //valid//invalidint & bat;bat = rat;int buttly = 50;rodent = buttly;    //这里只是赋值给rodent,无法使rodent变为buttly的引用。//通过以下指针的方法也无法改变int *pt = rat;int & mouse = *pt;int bun = 50;pt = &bun;//此时mouse仍是rat的引用

作为函数参数传递的引用:
在 c/c++ 中,访问一个变量只能通过两种方式被访问,传递,或者查询。这两种方式是:
1. 通过值 访问 / 传递变量
2. 通过地址 访问 / 传递变量 – 这种方法就是指针
使用引用传递可使传递的变量在函数中被修改。
当然,如果你只是想让函数使用传递的信息,而不是对信息进行修改,而又使用引用,那么你可以使用常量引用。

eg. double cube(const double &ra);//如果ra在函数中被修改则会生成错误信息。

使用引用传递会对实参要求更加严格,如以下调用会生成错误。

double recube(double &ra);double x = 7.0;recube(x + 3.0);long edge = 5L;recube(edge);recube(7.0);

以上都是会生成错误的,因为函数要求传的是一个double变量,能使其别名为ra的。而上面的会使函数找不到变量。
但是,只需在double &ra前加上const即可调用。因为此时会生成一个临时的匿名变量,使用后可随意删除(临时变量不可修改)。

double recube(const double &ra);

尽可能多的使用const引用参数:
1、可以避免数据修改。
2、使用const能处理const和非const实参,否则只能接受非const数据。
3、能正确生成使用临时变量。

为什么会有引用,引用的最大优点体现在返回结果或者类上。

struct person{    string name;    int number};person & getnum(person & target, const person & source){    target.number = source.number++;}person a ={"a",10};person b;b=getnum(b,a);

这段代码有几点要说明的,首先看参数,可以直接修改target来修改传入的值,而我只想要source的信息,所以用const不能修改source的信息。
然后看b=getnum这里。一般的返回结构,是将结构复制至一个临时位置,然后在将拷贝给b。但是如果返回引用,则直接将返回值复制给b,剩下了复制给临时变量的一步,提高了效率。

注意:避免返回函数终止时不再存在的内存引用,如下。

eg. const free_throws & clone(free_throws & ft){    free_throws newguy;    newguy = ft;    return newguy;}

至于为何使用引用参数:
1、能修改调用函数中的数据对象。
2、通过传递引用而不是整个数据对象,可以提高程序运行速度。(特别当数据对象较大时,如结构和类对象)

什么时候该使用引用:
对于使用传递值而不作修改的函数:
1、如果数据对象很小,如内置数据类型或小型结构,按值传递。
2、如果数据对象是数组,则只能使用指针,并将指针声明为指向const的指针。
3、如果数据对象是较大的结构,则用const引用或const指针,节省复制结构所需的时间及空间。
4、如果数据对象是类对象,则用const引用。
对于修改调用函数中数据的函数:
1、如果数据对象是内置数据类型或数组,则用指针。
2、如果数据对象是结构,则用指针或引用。
3、如果数据对象是类对象,则用引用。

拓展阅读:

http://blog.csdn.net/webscaler/article/details/6577429

0 0