单例模式 & 私有析构函数 & new重载

来源:互联网 发布:汽车销售软件有哪些 编辑:程序博客网 时间:2024/06/03 13:21

单例模式(Singleton)


        对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。从具体实现角度来说,有以下三点:

  • 类只提供私有的构造函数(自行创建这个实例);
  • 类定义中含有一个该类的静态私有对象(只能有一个实例);
  • 类提供一个静态公有函数用于创建或获取它本身的静态私有对象(类自行向整个系统提供这个实例)。

 


私有析构函数


        当类的访问权限为私有时,类对象只能在堆上生成,即通过new生成,且不能调用delete。C++是一个静态绑定语言,在编译过程中,所有的非虚函数调用都必须分析完成(虚函数也要检查可访问性)。因此,当在栈上生成对象时,对象会自动析构,即析构函数必须可以访问。而在堆上生成对象时,析构步骤由程序员控制,不一定需要析构函数。同时,此生成对象不能直接delete删除,析构过程还需要一个专门的成员函数(destory函数)。



 


重载new运算符


        new运算符要做的工作主要是在堆中申请内存存放对象(初始化交给对象的构造函数)。与私有析构函数的做法类似,重载new运算符并将其访问权限设为私有,可使类对象只能在栈上生成,即不能调用new(应同时重载delete并将其访问权限设为私有)。重载new运算符还可以跟踪内存的申请和释放,实现内存分配管理和内存泄漏检测。new的重载可分为全局和局部(类)两种,重载的接口为 

  • 单个对象的new:void* operator new(size_t size, ...)
  • 对象数组的new:void* operator new[](size_t size, ...)

参数size是对象(数组)的字节数,后面可根据需要添加参数(使用__FILE__和__LINE__可跟踪源代码)。调用有额外参数的new的形式为 new(...) Type。注意,在new Type(...) 这个形式中,括号中的参数用于初始化Type这个类型,而不是调用new的重载版本。

0 0
原创粉丝点击