- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
构造函数和析构函数的调用顺序
构造函数
先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下:
1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。
2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。
3.派生类构造函数。
析构函数
析构函数的调用顺序与构造函数的调用顺序正好相反,将上面3个点反过来用就可以了,首先调用派生类的析构函数;其次再调用成员类对象的析构函数;最后调用基类的析构函数。
析构函数在下边3种情况时被调用:
1.对象生命周期结束,被销毁时(一般类成员的指针变量与引用都i不自动调用析构函数);
2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;
3.对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
下面用例子来说说构造函数的的调用顺序:
#include stdafx.h
#include iostream
using namespace std;
class Base
{
public:
Base(){ std::coutBase::Base()std::endl; }
~Base(){ std::coutBase::~Base()std::endl; }
};
class Base1:public Base
{
public:
Base1(){ std::coutBase1::Base1()std::endl; }
~Base1(){ std::coutBase1::~Base1()std::endl; }
};
class Derive
{
public:
Derive(){ std::coutDerive::Derive()std::endl; }
~Derive(){ std::coutDerive::~Derive()std::endl; }
};
class Derive1:public Base1
{
private:
Derive m_derive;
public:
Derive1(){ std::coutDerive1::Derive1()std::endl; }
~Derive1(){ std::coutDerive1::~Derive1()std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
Derive1 derive;
return 0;
}
运行结果是:
Base::Base()
Base1::Base1()
Derive::Derive()
Derive1::Derive1()
Derive1::~Derive1()
Derive::~Derive()
Base1::~Base1()
Base::~Base()
那么根据上面的输出结果,笔者稍微进行一下讲解,构造函数的调用顺序是;首先,如果存在基类,那么先调用基类的构造函数,如果基类的构造函数中仍然存在基类,那么程序会继续进行向上查找,直到找到它最早的基类进行初始化;如上例中类Derive1,继承于类Base与Base1;其次,如果所调用的类中定义的时候存在着对象被声明,那么在基类的构造函数调用完成以后,再调用对象的构造函数,如上例中在类Derive1中声明的对象Derive m_derive;最后,将调用派生类的构造函数,如上例最后调用的是Derive1类的构造函数。
virtual析构函数
下面来说一说为多态基类声明virtual析构函数:
在C++中,构造函数不能声时为虚函数,这是因为编译器在构造对象时,必须知道确切类型,才能正确的生成对象,因此,不允许使用动态束定;其次,在构造函数执行之前,对象并不存在,无法使用指向此此对象的指针来调用构造函数,然而,析构函数是可以声明为虚函数;C++明白指出,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义---实际执行时通常发生的是对象的derived成分没被销毁掉。
看下面的例子:
class Base
{
public:
Base(){ std::coutBase::Base()std::endl; }
~Base(){ std::coutBase::~Base()std::endl; }
};
class Deri
您可能关注的文档
最近下载
- 金刚砂地面施工方案全套.docx VIP
- GB50913-2013:医药工艺用水系统设计规范.pdf VIP
- 东阿阿胶股份有限公司营销策略研究.docx VIP
- 火灾自动报警控制器更换(增加)施工方案 .pdf VIP
- 深圳市2019年度人才引进立户登记服务指南(简明版).pdf VIP
- 金属非金属地下矿山监测监控系统建设规范.pdf VIP
- 2020年学而思-大升一七大能力活动测试(在线场).pdf VIP
- 2024年法考商经小金句-重点归纳.doc VIP
- 建筑工程图集 SG111-1~2:建筑结构加固施工图设计表示方法建筑结构加固施工图设计深度图样(2008合订本).pdf VIP
- 2025年河南电信招聘笔试模拟试题及答案解析.docx VIP
文档评论(0)