• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c++基础语法:构造函数与析构函数

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++析构函数,c++中析构函数,c++析构函数的用法,c++析构函数怎么写,析构函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

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

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

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

改一下上面的代码:
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及其父类只要有一个具备虚析构函数,则析构函数调用跟一般情况一样。

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

小测试代码:

class A
{
public:
A(){cout<<"A constructor"<<endl;}
A(char * arp) { cout <<"not default " ;}

~CA(){cout<<"A desstructor"<<endl;}

};

class B:public A
{
public:
B(){cout<<"B constructor"<<endl;}

~B(){cout<<"B desstructor"<<endl;}
};

class C:public B
{
public:
C(char * arp){cout<<"C constructor"<<endl;}

~C(){cout<<"C desstructor"<<endl;}
};
int main()
{
C * ptr = new C("hello world") ;
delete ptr ;
}
</div>
另外effective C++中提到的:
1、
析构函数不能吐出异常,如果析构函数掉用的函数可能产生异常,要在析构函数内部进行捕获进行处理,因为如果析构函数抛出异常的话,比如说vector,当调用各个对象的析构函数进行删除的时候可能导致抛出多个异常,从而使程序进入不确定状态。

2、如果用户需要对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个普通函数执行这个操作。

3、在构造函数和析构函数中都不应该调用虚函数,这是因为当调用构造函数构造对象的时候,首先会调用父类的构造函数,此时对象的类型在编译器看来就是一个父类对象(实际此时子类成员还处于不确定状态),会调用父类的虚函数,而不会调用子类的虚函数。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++构造函数和析构函数的调用顺序
  • C++中构造函数与析构函数的调用顺序详解
  • C++中的friend函数详细解析
  • 简单解读C++中的虚函数
  • 详解C++中如何将构造函数或析构函数的访问权限定为private
  • 浅谈C++基类的析构函数为虚函数
  • 简单介绍C++编程中派生类的析构函数
  • 详解C++编程中的析构函数
  • C++中函数的用法小结
  • C++类成员构造函数和析构函数顺序示例详细讲解

相关文章

  • 2017-05-28深入学习C语言中的函数指针和左右法则
  • 2017-05-28C++常用字符串分割方法实例汇总
  • 2017-05-28使用C语言提取子字符串及判断对称子字符串最大长度
  • 2017-05-28显示任何进程加载的DLL文件的代码
  • 2017-09-12c语言 time.h 详细介绍
  • 2017-05-28进程间通信之深入消息队列的详解
  • 2017-05-28八皇后问题的相关C++代码解答示例
  • 2017-05-28黑客帝国数字雨效果VC6源代码分享
  • 2017-05-28C语言堆栈入门指南
  • 2017-05-28对C语言中指针的理解与其基础使用实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++语言实现线性表之链表实例
    • 深入理解C预处理器
    • 获取一个文件行数的方法
    • C++中简单读写文本文件的实现方法
    • C语言之单链表的插入、删除与查找
    • 牛顿迭代法求多项式在1.5附近的值2*x的3次幂--4x平方+3*x-6=0的实现代码
    • 数据结构之AVL树详解
    • C语言程序中递归算法的使用实例教程
    • C语言putenv()函数和getenv()函数的使用详解
    • C 语言基础教程(我的C之旅开始了)[二]

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有