【C++】阻止类被实例化

本文探讨了为何要禁止一个类被实例化,主要分为抽象类和工具类两种情况。抽象类主要用于定义接口,不关注具体实现,通过声明纯虚函数来实现抽象。工具类则提供静态方法,通常不需要实例化,可通过将构造函数设为private来防止实例化。此外,文章还讨论了《Effective C++》中关于纯虚析构函数的策略,并提醒在使用非public构造函数时要注意避免静态方法调用构造函数。
摘要由CSDN通过智能技术生成

不想一个类被实例化通常有两个目的:抽象类和工具类 ,下面分别简单解释下抽象类和工具类的使用场景。

一. 抽象类

实现该类的的就是想成为一个抽象类,抽象类一般只被继承,不能被实例化,例如最基本的例子

  1. 【动物类】是一个抽象类;
  2. 【猴子类】【猫类】【狗类】这三个类继承自【动物类】;
  3. 【猴子类】【猫类】【狗类】可以被实例化;
  4. 【动物类】不能被实例化;
    这种类更多的是用来定义接口,而完全不关心实现。

二. 工具类

这种类提供一些功能但是一般不需要实现成一个实体,感觉上这种类更多的像是发挥了namespace的作用,或者说把一些功能模块化,体现隔离或者解耦思想。例如一个所谓的【计算类】用于计算“加 减 乘 除”四种最简单的计算。只需要提供 add(), sub(),multi(),div()四个方法就可以了,也不需要什么成员变量,也不需要维护什么状态。

三. 代码实现

在代码层面如何做到禁止类被实例化呢,一般是两种办法:

  1. 为类定义纯虚成员函数;
  2. 将构造函数声明为protect或者private。
    下面我们来看看这两种方法怎么选择。

3.1 纯虚函数

pure virtual函数会导致抽象class,这是定理,因此只要为类提供一个pure virtual函数就可以达到禁止类被实例化的目的。但是这就是说我们必须要给这个类塞一个pure virtual函数,为了阻止实例化硬塞一个pure virtual似乎不够优雅,有没有别的方法呢,《Effective C++》条款7就提出了一个多少有点鸡贼的方法:为你希望它成为抽象的那个class声明一个pure virtual析构函数
条款7看似是个不错的主意,但是如果我们再深入思考一下,抽象类一般通常是会被继承的,抽象类具有发挥多态特性目的,这导致需要为这个pure virtual析构函数提供一份定义。这好像又非常别扭因为Meyers在条款34中又说为pure virtual函数提供实现是“令人意外的”。当然如果不要太钻牛角尖把这种需求当成一个特例的话也可以认为一个被定义的pure virtual析构函数就是“实现抽象类的官方指定权威方法”。
因此,使用有定义的pure virtual析构函数是阻止类被实例化的一个方法,但仅限于抽象类。

3.2 非public的构造函数

如果目的是工具类怎么办呢,一般的做法是把构造方法声明为private,自然就没法实例化了,因为外界无法调用这个构造函数。
但是如果这个类同时又提供了一个public静态方法,这个静态方法是可以调用私有的构造函数的。
所以,非public构造函数+静态方法调用构造函数一般是用于单例输出的场景。如果仅仅是为了实现【工具类】,就需要确保不会有静态方法调用构造函数。

参考

https://www.cnblogs.com/moonz-wu/archive/2008/05/07/1186065.html
https://blog.csdn.net/qq_38755753/article/details/103298444?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值