zoukankan      html  css  js  c++  java
  • 函数返回值是引用(引用当左值)

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

    #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;
    }

    运行结果:

  • 相关阅读:
    js完美拖拽封装及其案例
    js运动框架封装以及两种案例
    js常见的11种兼容
    Lua 学习笔记(五)函数
    Lua 学习笔记(四)语句与控制结构
    Lua 学习笔记(三)表达式
    Lua 学习笔记(二)语法、类型、值
    Lua 学习笔记(一)环境搭建
    Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
    Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据
  • 原文地址:https://www.cnblogs.com/Liu-Jing/p/9646842.html
Copyright © 2011-2022 走看看