当前位置:  编程技术>c/c++/嵌入式

c++基础语法:构造函数与析构函数

    来源: 互联网  发布时间:2014-10-20

    本文导语:  说实话c++还是以前在学校的时候用过的,从毕业到现在一直用c嵌入式编程,现在重新搬出C++语法 ,如果理解上有错误的地方,还请路过的朋友多指正~~~ 构造函数用来构造一个对象,主要完成一些初始化工作,如果类中...

说实话c++还是以前在学校的时候用过的,从毕业到现在一直用c嵌入式编程,现在重新搬出C++语法 ,如果理解上有错误的地方,还请路过的朋友多指正~~~

构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构造函数) ;析构函数是隐式调用的,delete对象时候会自动调用完成对象的清理工作。

现在主要看看继承中的构造函数和析构函数的调用:

代码如下:

class  A {} ;
class  B : public A
{};
class  C : public B
{};

c * ptr = new C() ;
delete ptr ;


一般来说,上面的代码构造函数是先调用最根父类的构造函数,然后是次一级父类构造函数,依次而来直到派生类本身的构造函数,而且对父类构造函数的调用都是父类的默认构造函数(当然也可以显示地调用父类的非默认构造函数),也就是说派生类在构造本身之前会首先把继承来的父类成分先构造好;

对析构函数的调用是先调用派生类本身的析构函数,然后是上一层父类析构函数,直到根父类析构函数 ,当没有多态的时候,析构函数是这样调用的。

改一下上面的代码:
A * ptr = new C() ;
delete ptr ;
在多态的情况下,如果基类A中的析构函数不是虚构造函数,则当delete ptr的时候只会调用A的析构函数,不会调用B和C中的析构函数;如果A中的析构函数是虚构造函数就会调用所有的析构函数,调用顺序和一般情况一样。

再改一下上面的代码:
B *prt = new C();
delete ptr ;
在多态的情况下,如果A,B中的析构函数都不是虚析构函数,则当delete ptr的时候先调用B的析构函数,再调A的析构函数,不会调用C中的析构函数,如果A或者B中至少有一个是虚析构函数,则析构函数调用和一般情况一样。

因此总结一下规律:
CA * ptr = new CB() ;
delete ptr ;
CB是CA的子类,构造函数的调用一直是一样的,当具备多态的时候:
如果CA及其父类都不具备虚析构函数,则首先调用A的析构函数,然后调用A的父类析构函数直到根父类析构函数,不会调用A以下直到派生类的析构函数 ;如果如果CA及其父类只要有一个具备虚析构函数,则析构函数调用跟一般情况一样。

因此:带有多态性质的基类应该声明虚析构函数 ,这样的基类一般还有其他虚函数;
如果类的设计不是用于基类,而且不具备多态性,则析构函数不应该声明为虚析构函数

小测试代码:

代码如下:

#include
using namespace std ;

class A
{
public:
A(){cout


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java基础问题:如何构造类
  • Java基础教程之构造器与方法重载
  • Python异常处理基础知识
  • UNIX基础、基础、再基础问题
  • docker和VM虚拟机的区别以及如何用docker搭建基础设施
  • 请教一个很基础基础的问题,请进。。。
  • HTML 基础知识教程及代码实例
  • 强烈反对分成基础版、jsp等分法。
  • Docker 基础用法和常用命令及选项介绍
  • 偷个懒,请教各位几个很基础的基础问题。。。
  • 业务基础软件平台 JXstar
  • 轻量的OA开发基础框架 OAer
  • 云服务软件基础平台 CloudStack
  • 请问大侠学java要有c语言基础吗?
  • 基础应用平台 JFaker
  • 手拉手业务基础平台
  • C实现的基础库 cfan
  • 健康信息基础平台 openMEDIS
  • 一道考验基础的JAVA语法题
  • Linux基础书籍推荐
  • 移动开发 iis7站长之家
  • 请问,要有哪些java基础才能开始学习EJB???谢谢!!!(急!!!)
  • 学JAVA之前要不要先学一些基础的东西?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3