• c++ 左值引用的注意点


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

  • 相关阅读:
    路由系统整合
    python操作excel
    Django models ORM基础操作--白话聊Django系列
    Django视图views--白话聊Django系列
    Django分发控制器urls--白话聊Django系列
    HTML页面布局
    一篇搞定SQLAlchemy--关系对象映射
    [LC] 538. Convert BST to Greater Tree
    [LintCode] 535. House Robber III
    [Algo] Rotate String
  • 原文地址:https://www.cnblogs.com/liutianrui1/p/13336625.html
Copyright © 2020-2023  润新知