• C++中构造函数、析构函数、拷贝构造函数详解


    本篇文章主要讲解了C++中构造函数、析构函数、拷贝构造函数的容易产生理解上错误的地方。大家也可以作为检验对知识点掌握的情况!

    首先代码如下:

    class CStudent  
    {
    public:
      CStudent()
      {
      }
      CStudent(CStudent& stu)
      {
      }
      ~CStudent()
      {
      }
    };
    
    int main()
    {
      CStudent stu1;
    
      CStudent stu2(stu1);
      // 这行代码如何解释?
      CStudent stu3();
    
      return 0; 
    } 

     以上注释的那行代码该怎么解释?

    实例化了一个对象并显示的调用了默认的构造函数?

    如果真这么理解,那就大错特错了。其实这是一个函数声明,表示声明了一个返回值为CStudent、函数名为stu3的函数。

    编译器在编译的过程中,因为是函数声明,并不产生实质性的代码!

    继续来看代码。源码如下:

    #include <iostream.h>
    
    
    class CStudent  
    {
    public:
      CStudent()
      {
        m_iNum = 0;
        cout << "CStudent()" << endl;
      }
      CStudent(int iNum)
      {
        m_iNum = iNum;
        cout << "CStudent(int iNum)" << endl;
      }
      CStudent(CStudent& stu)
      {
        m_iNum = stu.m_iNum;
        cout << "CStudent(CStudent& stu)" << endl;
      }
      ~CStudent()
      {
        cout << "~CStudent()" << endl;
      }
    
      int m_iNum;
    };
    
    CStudent GetObject(CStudent obj)
    {
      return obj.m_iNum;
    }
    
    int main()
    {
      CStudent stu1;
    
      // 此处这行代码如何执行?
      GetObject(stu1);
    
      return 0; 
    } 

    首先,由于C++默认的是 __cdecl,也就是C调用约定。栈的平衡由调用方平衡

    stu1是一个对象,GetObject的形参也是一个CStudent的对象,那么必然发生值的拷贝,换言之,会先调用obj对象的拷贝构造函数,然后在压入参数,保存返回地址。

    在跳转到函数代码处执行,函数执行到return obj.m_iNum的时候,因为返回值是一个对象.所以。重载拷贝函数CStudent(int iNum)被调用,产生新(我们给它随便取个名字:“NewObj”对象,方便后面的讲解,继续往下执行,函数即将出作用域。此时,obj的析构函数被调用,然后程序返回出作用域。这时,继续往下执行,由于此行代码“;”为当前代码行作用域结束,NewObj对象的析构函数被调用!词条语句则执行完毕,如果在VC6.0中调试.以上这条语句执行后输出如下:

    CStudent()

    // 上面这行是实例化stu1对象的输

    CStudent(CStudent& stu)
    CStudent(int iNum)
    ~CStudent()
    ~CStudent()

  • 相关阅读:
    034.Python的__str__,__repr__,__bool__ ,__add__和__len__魔术方法
    033.Python的__del__析构方法he__call__方法
    032.Python魔术方法__new__和单态模式
    python3使用tabulate漂亮的打印数据
    在Linux真正有效的调节鼠标速度!
    RouterOS上实现内网DNS劫持
    使用grease monkey强力清除搜索结果页的广告
    centos 6.5 apache下配置python cgi 并解决中文乱码
    python的缩进语法不是一种好的设计
    让npm默认使用taobao镜像源
  • 原文地址:https://www.cnblogs.com/ziolo/p/3038310.html
Copyright © 2020-2023  润新知