C++【1】-构造函数私有化作用


前言

在c++编程的单例模式分两种:饿汉式和懒汉式,步骤如下:

  1. 构造方式私有化,防止通过构造创建实例
  2. 需要自身创建一个唯一的一个实例,并提供一个全局访问入口

那么构造函数私有化还有其他作用吗?

  1. C++【2】- C++ explicit关键字详解
  2. C++11/14新特性–强类型枚举
  3. cin.ignore()的用法
  4. C++11中enable_shared_from_this的用法解析

一、构造函数私有化作用

  1. 不能从这个类派生或者创建类的实例
    很多情况下要求当前的程序中只有一个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;  
    }
    
  2. 保证只能在堆上new一个新的类对象
    需要把析构函数定义为私有成员。在编译过程中,所有的非虚函数调用都必须完成分析。即使是虚函数也要检查可访问性。因此,当在栈上生成对象时,对象会自动析构,也就是说析构函数必须可以访问。而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。保证了不能在栈上生成对象后,需要证明能 在堆上生成它。这里OnlyHeapClass与一般对象唯一的区别在于它的析构函数为私有。delete操作会调用析构函数。所以不能编译。
      那么如何释放它呢?答案也很简单,提供一个成员函数,完成delete操作。在成员函数中,析构函数是可以访问的。当然detele操作也是可以编译通过。

    void OnlyHeapClass::Destroy() { 
            delete this; 
    }
    

总结

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值