c++ 左值引用的注意点

2021-04-14 15:27

阅读:662

标签:内存   swap   局部变量   amp   clone   注意   pre   创建   没有   

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在外部释放;

c++ 左值引用的注意点

标签:内存   swap   局部变量   amp   clone   注意   pre   创建   没有   

原文地址:https://www.cnblogs.com/liutianrui1/p/13336625.html


评论


亲,登录后才可以留言!