再谈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;

 

原文链接: https://www.cnblogs.com/kundij/archive/2010/08/21/1805114.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    再谈C++引用与指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14162

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午1:39
下一篇 2023年2月7日 下午1:40

相关推荐