在进入正题之前,先来对引用变量做一些简要的概述以助于我们更好的理解
首先在c++中增加了一种复合类型——引用变量,通常被程序员运用在函数的形参中以此来使用传入数据的本身而不是使用的副本
一、创建引用变量
在c与c++中有“&”常被认为是“取地址符号”,但了解了引用变量之后它便有了一个新的功能——声明引用。
如代码所示:
int rats;
int &rodents = rats;
其中的rats与rodents均指向相同的值与内存单元,且都可以对这段内存进行操作!!
也可以理解为rats的另一个别名叫做“rodents”
回到之前的指针
int a=10;
int *p = &a;
看上去与引用十分类似,但其化石有一定的差别:
指针是可以在定义之后再指向地址,而引用只能在声明的同时进行初始化。
二、引用用作函数参数(结构)
用一个例子来帮助我们更好的理解
代码如下:
void swap1(int a,int b){
int temp = a;
a = b;
b = temp;
}
void swap2(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
对于这两个函数应该一眼就能看出是交换吧?
虽然他们只有一点区别——引用,但是结果是完全不同的。
若调用的是swap1,那么则是将主函数中的两个值copy到了a与b的内存单元上,对于a与b进行交换
倘若调用的是swap2,那么是将主函数中的两个值的地址传给了a与b,a与b可以操控主函数中的两个值,完成互换的结果!!
在使用引用时候还是会存在一些小问题,例如:
以下函数是返回一个值的三次方
double cube1(double a){
a=a*a*a;
return a;
}
double cube2(double &a){
a=a*a*a;
return a;
}
int main(){
int b =3;
cout<<a<<"的三次方为"<<cube1<<endl;
cout<<a<<"的三次方为"<<cube2<<endl;
}
当传入3时候
输出结果为:
3的三次方为2727的三次方为27
如果程序员的意图是让函数使用传递给他的信息,但是不对其进行修改,同时又想引用,那么应该使用常量引用。如下:
double cube2(const double &a){
a=a*a*a;
return a;
}
在编写代码时应尽可能地使用const:
1、可以避免无意中修改数据导致的编程错误
2、使函数能够处理const与非const的实参,否则将只能够接受非const数据
3、使函数能够正确生成并使用临时变量
我们常见的返回值函数为int double等,除此之外还可以返回“引用”
句式结构为:
free_throw & accumulate(free_throw &target,const free_throw &source)
当该函数中出现 return target;
那么返回的则是指向它的引用!!!
1、那么为什么要返回引用呢?
倘若accumulate函数返回的是值,那么返回的值将会复制到一个临时的位置之后,再将这个拷贝赋值给目标位置。
若是返回的是引用,那么会直接把返回的那个值复制到目标位置
综上!返回引用的效率会更高。
返回引用时候需要注意的问题:
因为在函数返回一个指向临时变量的引用后,函数运行完毕后它将不复存在。为了解决这种情况
第一种办法:
也是最简单的——返回一个作为参数传递给函数的引用。如上方所示的代码中的
return target;
第二种办法:
通过new为字符串分配内存空间,并返回指向该内存空间的指针。
const free_throw & clone(free_throw & ft){ free_throw *pt; *pt = ft; return *pt; }
先创建了无名的free_throw结构,并让pt指针指向该结构,因此*pt便是该结构了。
三、对象、继承和引用
四、何时使用引用参数
1、使用原因:
程序员能够修改调用函数中的数据对象
通过传递引用而不是整个数据对象,可以提高程序的运行速度
当数据对象较大时候,后者尤为重要
2、对于使用传递的值而不作为修改的函数
数据对象很小(内置数据类型或小型结构,值传递)
数据对象是数组(使用指针,唯一选择,且为指向const的指针)
数据对象是较大的结构(使用const指针或者const引用,以提高程序的效率,可以节省复制结构所需的时间和空间)
数据对象是类对象(const引用)
3、对于修改调用函数中的数据的函数
数据对象是内置数据类型(使用指针)
数据对象是数组(只能用指针)
数据对象为结构(指针和引用都可以用)
数据对象是类对象(使用引用)
并不全面,只能成为一些指导原则