• C++引用与变量名的区别


    1.

    string Fun1()

    {
          string num="ly";
      return num;
    }
    //在程序中使用此方法不会报错,因为方法执行完毕以后虽然num被释放,但是num的值会被保存到一个临时存储单元,然后从临时存储单元复制到调用此方法给其赋值的变量中去(如:在main方法中:string mynum=Fun1(),num的值就会被保存到mynum)

    2.

    string& Fun2()

    {
      string num="ly";
      return num;
    }

    //在程序中使用此方法会报错,因为返回的是对num的引用,而Fun2()方法执行完毕以后num被释放了,所以返回的引用试图引用已经被释放的内存会报错

    后来研究发现,将以上两个例子中的string类型换做int类型,都不会报错。既:

    #include <iostream>
    #include <string>
    using namespace std;

    int& Fun1()
    {
    int num=123;
    return num;
    }
    int main()
    {
      int mynum=Fun1();//运行到这一句居然不报错,为什么?难道Fun1中的局部变量num没有被释放?
      cout<<mynum<<endl;  
      return 0;

    如果将int类型换为int指针类型,又会报错:

    #include <iostream>
    #include <string>
    using namespace std;

    int*& Fun1()
    {
        int num=456;
        int *p=&num;
        return p;
    }
    int main()
    {
        int* p=Fun1();//运行到这一句居然不报错,为什么?难道Fun1中的局部变量num没有被释放?
        cout << "result:\n";//在对指针p取值之前,必须任意调用一个方法,以产生参数压栈或局部变量申请内存操作,好覆盖Fun1方法中的具备变量num
        cout<<*p<<endl;  //输出一个错误的值
        return 0;
    }

     

  • 相关阅读:
    BZOJ2456: mode 众数卡空间
    BZOJ4128: Matrix 矩阵BSGS
    [SDOI2011]计算器 BSGS
    前台中文搜索到后台乱码
    批量删除实现js+springmvc
    基于Jquery+Ajax+Json实现分页显示
    分页条的制作
    input text中不能显示空格后的内容
    mysql存入中文乱码问题
    WEBROOT根目录 <%=request.getContextPath()%>
  • 原文地址:https://www.cnblogs.com/mxw09/p/1863062.html
Copyright © 2020-2023  润新知