1. 左值引用在下列情况下会产生临时变量,函数中的引用则是临时变量的引用,并不是原变量的引用
double refcube(const double &ra){ return ra*ra*ra; } //case 1. double c1=refcube(7.0); //case2 long edge=5L; double c2=refcube(edge); //case 3. double side=3.0; double c2=refcube(side+5.0);
以上三种情况下,会产生临时变量,并让引用指向临时变量,但必须注意,要在函数引用出加上const才可以允许临时变量的产生;
再看下面这个例子:
void swapr(int &a ,int &b){ int temp; temp=a; a=b; b=temp; } long a=3,b=5; swapr(a,b);
由于类型不同,这种情况下由于创建了临时变量引用,导致是在临时变量上做的swap,相当于按值传递了!
(*以上代码引用处没有const也可以的原因是早期编译器是可以允许没有const的情况下产生临时变量的,但是现在的编译器必须指定const引用)
2. 传统函数返回值是先创建临时变量,再复制给被调用函数中的接收变量,这种机制效率很慢;
而返回引用的话,不会创建临时变量,直接将引用变量复制给接收变量,效率高。
3. 返回引用类型的函数,返回的变量值不能是局部变量,函数终止时局部变量的内存不复存在。如下:
const free_throws & clone2(free_throws & ft){ free_throws newguy=ft; return newguy; }
为了解决这个问题,可以:① 外部定义引用,把引用传给函数再返回;②用new来分配新的内存空间,并返回指针的*ptr,但是需要注意的是用delete在外部释放;