C++阻止类被实例化详解
目录
- 抽象类
- 工具类
- 代码实现
- 纯虚函数
- 非public的构造函数
- 参考
- 总结
抽象类 【C++阻止类被实例化详解】实现该类的的就是想成为一个抽象类,抽象类一般只被继承,不能被实例化,例如最基本的例子
1.【动物类】是一个抽象类;
2.【猴子类】【猫类】【狗类】这三个类继承自【动物类】;
3.【猴子类】【猫类】【狗类】可以被实例化;
4.【动物类】不能被实例化;
这种类更多的是用来定义接口,而完全不关心实现。
工具类 这种类提供一些功能但是一般不需要实现成一个实体,感觉上这种类更多的像是发挥了namespace的作用,或者说把一些功能模块化,体现隔离或者解耦思想。例如一个所谓的【计算类】用于计算“加 减 乘 除”四种最简单的计算。只需要提供 add(), sub(),multi(),div()四个方法就可以了,也不需要什么成员变量,也不需要维护什么状态。
代码实现 在代码层面如何做到禁止类被实例化呢,一般是两种办法:
1.为类定义纯虚成员函数;
2.将构造函数声明为protect或者private。
纯虚函数 pure virtual函数会导致抽象class,这是定理,因此只要为类提供一个pure virtual函数就可以达到禁止类被实例化的目的。但是这就是说我们必须要给这个类塞一个pure virtual函数,为了阻止实例化硬塞一个pure virtual似乎不够优雅,有没有别的方法呢。《Effective C++》条款7的表述就非常直接了:为你希望它成为抽象的那个class声明一个pure virtual析构函数。
但是抽象类一般通常是会被继承的,具有多态目的,这导致需要为这个pure virtual析构函数提供一份定义。这好像非常别扭因为Meyers在条款34中又说为pure virtual函数提供实现是“令人意外的”。当然我们可以认为一个有定义的pure virtual析构函数就是“实现抽象类的官方指定权威方法”。
因此,使用有定义的pure virtual析构函数是阻止类被实例化的一个方法,但仅限于抽象类。
非public的构造函数 如果目的是工具类怎么办呢,一般的做法是把构造方法声明为private,自然就没法实例化了,因为外界无法调用这个构造函数。
但是如果这个类同时又提供了一个public静态方法,这个静态方法是可以调用私有
参考 https://www.jb51.net/article/224221.htm
//www.jb51.net/article/224216.htm
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 为什么你的路演总会超时()
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- opencv|opencv C++模板匹配的简单实现
- thinkphp|thinkphp 3.2 如何调用第三方类库
- 使用composer自动加载类文件
- 一个健康的APP和健全的人格大体类似
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- 归乡-序章(世界伊始,人类无所依靠,我的故事就从这里开始...)
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场