zoukankan      html  css  js  c++  java
  • 再谈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;

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/kundij/p/1805114.html
Copyright © 2011-2022 走看看