• 函数返回值是引用(引用当左值)


    如果返回的是局部变量(栈上的) 引用,有可能会有问题

    #include <iostream>
    using namespace std;
    
    int getAA1(void)
    {
        int a;
        a = 10;
        return a;
    }
    
    //返回a的本身  返回a的一个副本 10
    int& getAA2(void)
    {
        int a;  //如果返回的是局部变量(栈上的) 引用,有可能会有问题
        a = 10;
        return a;
    }
    
    int* getAA3(void)
    {
        int a;
        a = 10;
        return &a;
    }
    
    int main(void)
    {
        int a1 = 0;
        int a2 = 0;
    
        a1 = getAA1();
    
        a2 = getAA2();
    
        int &a3 = getAA2();//若返回栈变量 不能成为其它引用的初始值
                            //a3是一个引用,相当于getAA2()函数中a的别名。
        //printf("a1:%d a2:%d a3:%d
    ", a1, a2, a3);
    
        printf("a1:%d 
    ", a1);
        printf("a2:%d 
    ", a2);
        printf("a3:%d 
    ", a3);  //a3引用的是一个局部变量,运行完已经不存在了。
    
        return 0;
    }

    运行结果:

    
    

    int j(void)
    {
        static int a = 10;
        a++;
        return a;
    }
    
    int& j1(void)
    {
        static int a = 10;
        a++;
        return a;
    }
    //若返回静态变量或全局变量
    // 可以成为其他引用的初始值
    // 即可作为右值使用,也可作为左值使用
    int main(void)
    {
        int a1 = 10;
        int a2 = 20;
    
        a1 = j();
        a2 = j1();
        int &a3 = j1();
    
        printf("a1:%d 
    ", a1);
        printf("a2:%d 
    ", a2);
        printf("a3:%d 
    ", a3);  
    
        return 0;
    }

    运行结果:

      函数返回值当左值。

    //函数当左值
    //返回变量的值
    int g1(void)
    {
        static int a = 10;
        a++;
        return a;  //11
    }
    //返回变量自身, 返回变量标识的内存空间
    int& g2(void)
    {
        static int a = 10;
        a++;
        printf("a:%d 
    ", a);
    
        return a; 
    }
    
    int main(void)
    {
        //g1() = 100;  11=100
        g2() = 100; //函数返回值是一个引用,当左值。
        g2();
    
        int c1 = g1();  //函数返回值是一个值,当右值
        int c2 = g2(); //函数返回值是一个引用,当右值。
        
        printf("c1:%d 
    ", c1);
        printf("c2:%d 
    ", c2);
    
        return 0;
    }

    运行结果:

  • 相关阅读:
    初识CC_MVPMatrix
    opengl启动过程
    http协议
    sockt套接字编程
    lua元表
    Codeforces 1203F1 Complete the Projects (easy version)
    CodeForces 1200E Compress Words
    CodeForces 1200D White Lines
    HDU 6656 Kejin Player
    HDU 6651 Final Exam
  • 原文地址:https://www.cnblogs.com/Liu-Jing/p/9646842.html
Copyright © 2020-2023  润新知