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()
原文链接: https://www.cnblogs.com/ziolo/archive/2013/04/23/3038310.html

欢迎关注

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

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

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

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

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

(0)
上一篇 2023年2月9日 下午10:10
下一篇 2023年2月9日 下午10:11

相关推荐