• 再谈C++引用与指针


      大多数对引用的认识就是,引用只是实际存在的变量的一个别名,引用一开始必须初始化为实际存在的变量名,而且只要一初始化,就不能再改变,以后对这个别名的操作,也就等于实际存在的变量的操作。

         有一点比较特殊的是,引用可以延长临时变量的生命周期,而且指针不具备这个能力。以下举例做一下分析:

     代码1:

    #include <iostream>
    using namespace std;

    class CA
    {
      private:
         int nMember;  
      public:
            CA(int i)
         {
            nMember = i;
         }

        ~CA()
         {
            nMember = 0;
         }
         int GetMember()
         {
            return nMember;
         }
    };

    CA &Func()  //返回的是ca对象的引用
    {
       CA ca(10);
       return ca;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
       CA &Ref = Func();
       cout<<Ref.GetMember()<<endl;
       return 0;
    }

    结果输出: -858993460

    分析:Func函数返回是 ca对象的引用,Func函数退出时,ca对象也就销毁了,所以Ref就引用一个不存在的对象。结果输出一个随机数,笔者采用vs2003编译,输出 -858993460。

    代码2:

    #include <iostream>
    using namespace std;

    class CA
    {
      private:
         int nMember;  
      public:
            CA(int i)
         {
            nMember = i;
         }

        ~CA()
         {
            nMember = 0;
         }
         int GetMember()
         {
            return nMember;
         }
    };

    CA Func()  //返回的是临时对象

    {
       CA ca(10);
       return ca;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
       CA &Ref = Func();
       cout<<Ref.GetMember()<<endl;
       return 0;
    }

    结果输出: 10

    分析:在这个代码中,把Func前面的&去掉,Func就会直接返回临时对象(ca对象的拷贝),Ref将成为这个临时对象的引用,由于上面提到,引用可以延长临时变量的生命周期,即临时对象的生命周期不会小于引用的生命周期,所以输出10。

    代码3:

    #include <iostream>
    using namespace std;

    class CA
    {
      private:
         int nMember;  
      public:
            CA(int i)
         {
            nMember = i;
         }

        ~CA()
         {
            nMember = 0;
         }
         int GetMember()
         {
            return nMember;
         }
    };

    CA Func()  //返回的是临时对象
    {
       CA ca(10);
       return ca;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
       CA *pCa = &Func();
       cout<<pCa->GetMember()<<endl;
       return 0;
    }

    输出 0

    分析:指针pCa指向的是临时对象的地址,由于指针不具备延长临时变量的生命周期,所以临时变量在Func结束后,就析构了,成员变量nMember被置为0,所以输出0;

  • 相关阅读:
    Azure 媒体服务的 RTMP 支持和实时编码器
    在_Linux_中如何使用_gdb_调试_C_程序
    你刚吃的兰州牛肉面,背后就藏着大数据
    《C++覆辙录》——1.9:使用糟糕的语言
    老司机带你用MaxCompute和表格存储玩转车联网数据
    快速部署rabbitMQ教程
    《第一本Docker书(修订版)》——1.3 能用Docker做什么
    《第一本Docker书(修订版)》——第1章_简介_1.1Docker简介
    【DockerCon2017最新技术解读】Docker最新特性介绍
    【DockerCon2017最新技术解读】如何在阿里云一键部署高可用的Kubernetes集群
  • 原文地址:https://www.cnblogs.com/kundij/p/1805114.html
Copyright © 2020-2023  润新知