文章目录
前言
在c++编程的单例模式分两种:饿汉式和懒汉式,步骤如下:
- 构造方式私有化,防止通过构造创建实例
- 需要自身创建一个唯一的一个实例,并提供一个全局访问入口
那么构造函数私有化还有其他作用吗?
一、构造函数私有化作用
-
不能从这个类派生或者创建类的实例
很多情况下要求当前的程序中只有一个object。例如只有一个鼠标的object.通常我们都是把构造函数
的声明置于public
区段中,假如我们将其放入private
区段中会发生什么后果呢?
当我们在程序中声明一个对象时,编译器
要调用构造函数,而这个调用往往是外部的,也就是它不属于class对象本身的调用,而构造函数是私有的,由于在类的外部不允许访问私有成员,所以这会报错。
然而,对于类本身,可以利用它的static
公有成员.因为他们独立于类对象之外,不必产生对象也可使用他们。
利用类的静态成员函数,访问类的私有构造函数。因为构造函数被class
私有化,所以我们要创建出对象,就必须能够访问到class
的私有域。假如在某个static
函数中创建了该class
的对象,并以引用或者指针的形式将其返回(不能返回对象,因为构造函数是私有的,外部不能创建临时对象),就获得了这个对象的使用权。
以下例程,使用了私有构造函数,GetInstance()
作为OnlyHeapClass
的静态成员函数在内存中创建对象。私有化构造函数的设计保证了其他类不能从这个类派生或者创建类的实例。#include <stdio.h> class OnlyHeapClass { public: static OnlyHeapClass* GetInstance() { // 创建一个OnlyHeapClass对象并返回其指针 return (new OnlyHeapClass); } void Destroy(); private: OnlyHeapClass() { printf("test\n"); } ~OnlyHeapClass() {} }; int main() { OnlyHeapClass *p = OnlyHeapClass::GetInstance(); delete p; return 0; }
-
保证只能在堆上
new
一个新的类对象
需要把析构函数
定义为私有成员。在编译过程中,所有的非虚函数调用都必须完成分析。即使是虚函数也要检查可访问性。因此,当在栈上生成对象时,对象会自动析构,也就是说析构函数必须可以访问。而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。保证了不能在栈上生成对象后,需要证明能 在堆上生成它。这里OnlyHeapClass
与一般对象唯一的区别在于它的析构函数为私有。delete
操作会调用析构函数。所以不能编译。
那么如何释放它呢?答案也很简单,提供一个成员函数,完成delete
操作。在成员函数中,析构函数是可以访问的。当然detele
操作也是可以编译通过。void OnlyHeapClass::Destroy() { delete this; }