新疆软件开发

本站首页 软件开发 成功案例 公司新闻 公司简介 客服中心 软件技术 网站建设
  您现在的位置: 新疆二域软件开发公司 >> 开发语言 >> 文章正文

C++类析构函数学习

1.前言
        大部分对象在使用之之后没有正确的从内存清理完毕,造成内存泄露也是C++出错的主要领域
引入类的析构是正确的从内存中清量类的对象
一般什么时候触发并调用类的析构函数呢?
答案是:当类实例对象超出它的有效作用域时,也就是撤消类对象时,自动调用析构函数来清理对象
构造函数用来初始化成员,析造函数则是用来清理对象
如我们删除一个类的指针对象,则自动调用析构函数:
sales_item是一个类
sales_item *p = new sales_item //建立并分配一个类的指针p
delete p;//这就是撤消类的对象,随后它自动调用析构函数
2.定义
构造函数名和类名完全一样,并在名字前面加"~"符号
每个类只有一个析构函数
2.1定义格式
~析构函数名称(){}    //一般析构函数:
virtual ~析构函数名称(){} //虚析构函数:
代码如下
class item{
public:
~item(){}
};
3 基类与派生类
3.1一般基类是不用写出析构函数,编译器自动添加一个
类aa可以正常的工作就是编译器自动添加了四个函数
如代码
class aa{
public:
   //构造,析构,复制构造,赋值操作符四个函数由编译器自动添加
   int getx(){return x;}
   void set(int a){x=a;}
private:
 int x;
};

3.2析构函数"三法则",如果类中有复制构造函数和赋值操作符重载,则析构函数必须要,三者缺一不可
class bb{
public:
 bb(const bb& rhs){...}    //复制构造函数
 bb& operator=(const bb& rhs){...} //赋值操作符
 ~bb(){清理函数}                   //析构函数       
private:
 int x
};
以上三个函数三者必须同时出现,以免出现有的对象清除不了,有的出现"浅复制错误"

3.3如果类中有指针成员,则必须专门写一个析构函数来清理指针成员,编译器默认添加的析构函数不会去清理指针对象
如果类中有指针成员,如链表结构实现等,
指针成员是基本单位,在方便使用指针的同时,如何管理好它们的工作就是C++中最困难的部分

这个析构函数最好特别定制,做法是析构函数加一个清理函数,析构函数直接调用它就OK

3.4派生类
虚成员函数和虚析构函数通常是成对出现
当基类有虚函数时,派生类会发生动态调用,也就是动态绑定,
当不知道是调用基类对象还是调用派生类对象时,还要正确的清理它们就更加困难啦,在基类引入虚析构函数后,
它也能发生动态绑定,正确的清理对象,这些都要到程序运行后才能知道调用对象,在编译前是无法知道对象是谁的
代码:
//基类
class base{
public:
 virtual draw(){}; //虚方法
 virtual ~base(){};//虚析构函数
};

//派生类
class dev : public base{
public:
   draw(){}//draw方法的实现
   ~dev(){}//析构函数
};

4.设计指导
4.1一般的类我们不需要设计出它的析构函数,编译器自动为我们构建一个析构函数
4.2析构函数"三法则",如果类中有复制构造函数和赋值操作符重载,则析构函数必须要,三者缺一不可
4.3如果类中有指针成员,则必须专门写一个析构函数来清理指针成员,编译器默认添加的析构函数不会去清理指针对象
4.4"虚函数和虚析构函数成对实现",
当类中有虚成员时,定制虚析构函数,让派生类实行动态绑定方式来清除基类对象或者派生类对象

作者:未知 | 文章来源:未知 | 更新时间:2008-1-15 16:43:08

  • 上一篇文章:

  • 下一篇文章:

  • 相关文章:
    C++基础知识:结构体数据的指针变量
    如何实现C与C++程序的相互调用
    在C++中成员函数如何实现操作符重载?
    基础学习:C++非成员函数实现操作符重载
    基础学习:C++重载输入输出符
    基础学习:C++重载下标结算符
    基础学习:C++中重载调用操作符
    基础学习:C++重载转换操作符operator (type)
    C++类复制控制学习
    C++类构造函数学习
    软件技术
    · 开发语言
    · Java技术
    · .Net技术
    · 数据库开发
    最新文章  
    ·搜集整理的asp.net的验证方
    ·各种FOR循环结构的整理
    ·软件项目开发中应该考虑那
    ·搜集整理的javascript sel
    ·软件开发中项目经理有那些
    ·学习如何在Lambda表达式进
    ·C++基础知识:结构体数据的
    ·C#实现短信发送程序的例子
    ·sun最近修补了一部分java的
    ·rss定制的另外一种实现方式
    ·delphi实现利用arp欺骗来实
    ·基础学习:基于WF的流程框
    ·网络编程中怎样得知一次数
    ·如何逆序输出单链表?
    ·软件开发过程中的性能设计
    关于我们 | 软件开发 | 下载试用 | 客服中心 | 联系我们 | 友情链接 | 网站地图 | 新疆电子地图 | RSS订阅
    版权所有 © 2016 新疆二域软件开发网 www.k8w.net All Rights Reserved 新ICP备14003571号
    新疆软件开发总机:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆乌鲁木齐北京中路华联大厦A-5C 邮编:830000