• C++中函数的返回值


    原文

    [ 函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是 临时对象。temporary object ]

    --就是说,当你需要使用函数的返回值时,编译器会创建一个 临时对象

    --只有非引用返回才会创建临时对象!!!

    C++中函数的返回值有三种类型:void非引用引用

    -- 非引用,返回的是实参对象或者局部对象的副本

    -- 引用,返回的是引用,而非副本。

    上面这么说很教科书,需要和实际代码联系起来理解。

     

    问题

    怎么验证非引用返回的就是副本?又怎么验证引用返回的就是引用?

    在这里不得不说指针是个好东西,完全可以通过输出对象的地址(指针)来判断是否副本。

    如下面代码部分,定义了三个函数,分别返回非引用、引用(实参)、引用(局部对象)。

    代码

    #include <iostream>
    using namespace std;
    
    //返回非引用
    int myno(int &v1){
        return v1;
    }
    //返回引用 
    int &myno2(int &v1){
        return v1;
    } 
    //返回局部引用 Never ever ever do this
    int &myno3(int &v1){
        int v2=v1; //副本
        return v2;//Don't do this
    } 
    
    //判断传入的和返回的是否同一个 
    int main(){
        
        int v1=1;
        cout<<&v1<<endl;
        
        const int &no1 = myno(v1); //为毛必须要const? 
        cout<<&no1<<endl; //和&v1不同,因为返回的是副本 
        
        int &no2=myno2(v1);
        cout<<&no2<<endl; // 和&v1相同 
        
        int &no3=myno3(v1);
        cout<<&no3<<endl;//被释放的内存 
        cout<<no3<<endl;//无效值 
        
        return 0;
    }

    由此可验证,非引用返回的的确是副本,而引用则返回引用。

    只是,务必注意,不要返回局部对象的引用!

    为什么使用 非引用返回 来赋值时需要const?

    原因:不允许非const引用指向需要临时对象(见本文开头部分)的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!

    就是说,返回引用时,没有临时对象?

    20160617修改:c++11已经去掉了该限制(引用必须const的限制)。

    --补充:使用字面值常量初始化引用时,也会创建临时对象,所以也必须const

    参考:

      C++ const引用详解

  • 相关阅读:
    opencv学习笔记(五)镜像对称
    opencv学习笔记(四)投影
    C++文件读写详解(ofstream,ifstream,fstream)
    C++ 提取字符串中的数字
    opencv学习笔记(三)基本数据类型
    opencv学习笔记(二)寻找轮廓
    分别心
    关于bonecp和QuerRunner
    关于AutoCommit
    一个detect问题引发的一系列思考
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5587330.html
Copyright © 2020-2023  润新知