返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++阻止类被实例化详解
  • 702
分享到

C++阻止类被实例化详解

2024-04-02 19:04:59 702人浏览 泡泡鱼
摘要

目录抽象类工具类代码实现纯虚函数非public的构造函数参考总结不想一个类被实例化通常有两个目的:抽象类和工具类 抽象类 实现该类的的就是想成为一个抽象类,抽象类一般只被继承,不能被

不想一个类被实例化通常有两个目的:抽象类和工具类

抽象类

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

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++阻止类被实例化详解

本文链接: https://lsjlt.com/news/136977.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++阻止类被实例化详解
    目录抽象类工具类代码实现纯虚函数非public的构造函数参考总结不想一个类被实例化通常有两个目的:抽象类和工具类 抽象类 实现该类的的就是想成为一个抽象类,抽象类一般只被继承,不能被...
    99+
    2024-04-02
  • 在C++中如何阻止类被继承详解
    这个话题是源自于一个面试题,我在网上查了一下有不少这方面的解说!我自己整理了一下,选择了一个自认为是最优方案! 我们从最简单的开始: 首先,大家都知道要阻止类被实例化,可以通过使...
    99+
    2024-04-02
  • C++Stack栈类模版实例详解
    目录1.栈的介绍2.栈实现3.代码测试总结1.栈的介绍 栈的实现方式分为3种 基于静态数组实现,内部预设一个很大的数组对象, 实现简单,缺点是空间受限。基于动态数组实现,内部预设一个...
    99+
    2024-04-02
  • python抽象类可以被实例化吗
    不可以。抽象类是一种特殊的类,不能直接被实例化。抽象类的主要作用是为其子类提供一个共同的接口,并定义一些通用的方法。抽象类定义了一些...
    99+
    2023-10-25
    python
  • C# MemoryStream类案例详解
    MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。 MemoryStream类封装一个字节数组,在...
    99+
    2024-04-02
  • C++ QgraphicsScene类案例详解
    概述 QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或...
    99+
    2024-04-02
  • C# CultureInfo类案例详解
    c#中的CultureInfo类 CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的...
    99+
    2024-04-02
  • C# PropertyInfo类案例详解
    对一个对象进行属性分析,并得到相应的属性值,并判断属性的默认值以及空值 public class People { public string name...
    99+
    2024-04-02
  • c#怎么把类实例化
    在c#中,实例化一个类是创建一个类的对象,使用new关键字,如:类名 对象名 = new 类名()。构造函数是实例化类时调用的特殊方法,用于初始化属性,如:public person(s...
    99+
    2024-05-14
    c#
  • C++ Queue队列类模版实例详解
    目录1.队列的介绍2.代码实现3.测试运行总结1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO, First-I...
    99+
    2024-04-02
  • C++实现日期类的示例详解
    目录一、获取某年某月的天数二、Date的默认成员函数(全缺省的默认构造)三、运算符重载1.+ =、+、- =、-2.==、!=、>、>=、<、<=3.前置++...
    99+
    2023-02-07
    C++实现日期类 C++常见日期类 C++日期类
  • C# Random类随机函数实例详解
    目录引言一、创建界面二、效果展示三、Random类方法四、代码逻辑总结:引言 Random类是非常值得学习的一个类,所以我们今天一起学习一下Random这个类,对于模拟数据这个是随机...
    99+
    2024-04-02
  • c++类的实例化怎么实现
    在C++中,可以使用关键字new来实例化一个类。下面是一个简单的示例: #include <iostream> cla...
    99+
    2024-04-09
    c++
  • Objective-C之Category实现分类示例详解
    目录引言编译时运行时引言 在写 Objective-C 代码的时候,如果想给没法获得源码的类增加一些方法,Category 即分类是一种很好的方法,本文将带你了解分类是如何实现为类添...
    99+
    2022-11-13
    Objective-C分类 Category分类
  • java 中 阻塞队列BlockingQueue详解及实例
    java 中 阻塞队列BlockingQueue详解及实例BlockingQueue很好的解决了多线程中数据的传输,首先BlockingQueue是一个接口,它大致有四个实现类,这是一个很特殊的队列,如果BlockQueue是空的,从Blo...
    99+
    2023-05-31
    java 阻塞队列 blockingqueue
  • Android Service服务不被停止详解及实现
    Android Service服务一直运行:            ...
    99+
    2022-06-06
    android service service Android
  • C++20中的结构化绑定类型示例详解
    目录C++20中新增了一个非常有用的特性结构化绑定概念结构化绑定类型数组Pair结构体实现一个可以被结构化绑定的类元组类型C++20中新增了一个非常有用的特性 结构化绑定(Struc...
    99+
    2023-05-17
    C++ 结构化绑定 C++ 20
  • C++动态数组模版类Vector实例详解
    目录1.实现机制2.代码实现3.测试运行总结1.实现机制 内部主要通过m_capacity数组容量成员和m_length数组有效长度成员来维护一个T* data数组空间. 内部默认分...
    99+
    2024-04-02
  • C#实现HTTP访问类HttpHelper的示例详解
    在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了。示例中的HttpHelper类使用Lo...
    99+
    2024-04-02
  • C++ 双向循环链表类模版实例详解
    目录1.插入某个节点流程2.构造函数修改3.重新实现append和prepend函数4.修改迭代器类5.LinkedList.h代码如下6.测试运行总结在上章C++图解单向链表类模板...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作