引用是定义变量的别名:
int rats;
int & rodents = rats;
则rodents是rats的别名,他们的值和地址都相同,操作rodents和操作rats一样。注意在声明引用时必需将其初始化,不能拆开先声明再赋值。以上引用声明实际上时如下代码的伪装表示:
int * const PR = &rats;
引用变量的主要途径时用作函数的形参,函数将使用原始数据,而不是其副本。同指针一样,引用也为函数处理大型结构和类提供方便途径。确实,引入引用主要是为了这些类型的,而不是用于基本的内置类型。
比较以下三个函数头,体会引用作为函数参数的作用:
void swap_1(int & a, int & b);//即用a、b作为参数的引用
void swap_2(int * p, int * q);
void swap_3(int a, int b);
另一种情况,如果意图让程序只是用参数值而不修改,又想用引用作为参数,则应该使用常量引用:
double refcube (const double & ra);
目前,对于形参为const引用的C++函数,如果实参不匹配,其行为将类似于值传递,使用临时变量储存值而确保原始数据不被修改。
总结起来,应尽可能将引用声明为const:
1、避免无意中修改数据;
2、能处理const和非const实参,否则只能接收非const数据;
3、能够正确生成并使用临时变量。
引用主要用于结构和类,虽然有些时候也能使用值传递实现,但与复制原始结构的拷贝相比,使用引用更节省时间和内存。不仅作为参数,还可以作为返回值。返回值,从概念上说,这个值被复制到一个临时位置,然后调用程序使用这个值。相比把整个结构复制到一个临时位置,使用引用作为返回值,效率更高。
返回引用时最重要的一点是hi,避免返回函数终止时不复存在的内存单元引用。如下:
const free_throws & clone ( free_throws & ft)
{
free_throws newguy;
newguy = ft;
return newguy;
}
返回时,相当于free_throws & tmp = newguy;然而函数调用完后,newguy释放,其别名(而不是值拷贝)tmp也没了。避免的最简单方法是,返回一个作为参数传递给函数的引用。
总之,不要返回局部对象的引用;同理,不要返回指向局部变量的指针。
为避免对返回的引用赋值而被修改,因此最好将const应用于返回值。
新闻热点
疑难解答