为什么要阻止实例化
一个类不想被实例化通常有两种情况:一种是抽象类,一种是工具类。
抽象类
比如现在需要计算图形的面积,可以是正方形、长方形、圆形等等。
于是抽象出了基类,叫图形。
Sharp作为抽象基类,也不好计算其面积,所以没有实例化的必要。 工具类 比如我们在QT中经常遇到的代码:class Sharp
{
};
classCircle:public Sharp
{
};
class Rectangle : public Sharp
{
};
QFileDialog::getOpenFileName(this,"选择一个文件", QCoreApplication::applicationFilePath(),"*.cpp");
很多情况下我们只是需要通过函数 getOpenFileName 来获得当前文件的路径,没必要去创建对象。当然这里只是举个例子,并不是说 QFileDialog 是工具类。
还有这样一种情况,我们需要一个类来封装加、减、乘、除。
class Calculate
{
public:
static int add(int x, int y);
static intsub(intx,inty);
static intmul(int x, int y);
static int div(int x, int y);
};
上面这个类就是一个典型的工具类,用它创建对象没有意义,可以直接通过类名调用静态成员函数。 如何阻止 方法一:类中包含纯虚函数。 还是上面的Sharp类。
classSharp
{
public:
virtual void get_s() = 0; //纯虚函数
};
纯虚函数没有函数体。 含有纯虚函数的类叫抽象类。 抽象类不好创建对象,因为就算是创建了对象,调用纯虚函数的时候,也不知道如何执行。 方法二:构造函数私有 还是上面的计算类。
class Calculate
{
private:
Calculate();
public:
static int add(int x, int y);
static int sub(int x, int y);
static int mul(int x, int y);
static int div(int x, int y);
};
把构造函数设置成私有,就不能在类的外部创建对象,相当于间接的阻止了该类实例化对象。
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
函数
+关注
关注
3文章
3868浏览量
61308 -
C++
+关注
关注
21文章
2066浏览量
72900
原文标题:面试题:C++如何阻止类被实例化?
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
鸿蒙OS开发实例:【Native C++】
使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平方根。在输入框中输入两个数字,点击计算结果按钮显示计算后的数值。
C++程序设计精简版
总 目 录第 1 篇 基 本 知 识 第 1 章 C++的初步知识第 2 章 数据类型与表达式 第 2 篇 面向过程的程序设计第 3 章 程序设计初步第 4 章 函数与预处理第 5 章 数组第 6
发表于 10-09 07:26
嵌入式C/C++语言精华文章集锦
/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组中,通过
发表于 09-25 08:00
Arm C/C++编译器22.1版开发人员和参考指南
提供帮助您使用ARM®编译器Linux版的ARM®C/C++编译器组件的信息。
ARM®C/C++编译器是一款自动矢量化的Linux空间C和
发表于 08-11 07:46
Arm C/C++编译器开发人员和参考指南
提供帮助您使用Arm®编译器Linux版的Arm®C/C++编译器组件的信息。Arm®C/C++编译器是一款自动向量化的Linux空间C和
发表于 08-10 06:17
如何为Arm编译C和c++代码
编写C或C++应用程序时,需要使用编译器工具链将其编译为机器代码。然后,您可以在基于Arm的处理器上运行此编译的可执行代码,或者使用模型对其进行模拟。
裸机编译编译器工具链包括以下组件:
•将C
发表于 08-02 17:28
用OpenVINO™ C++ API编写YOLOv8-Seg实例分割模型推理程序
本文章将介绍使用 OpenVINO 2023.0 C++ API 开发YOLOv8-Seg 实例分割(Instance Segmentation)模型的 AI 推理程序。本文 C++ 范例程序的开发环境是 Windows + V
如何为xtensa编译C++?
我想为 xtensa 编译简单的 C++ 代码,但我不能。
代码:全选#include \"ets_sys.h\"
#include \"osapi.h\"
发表于 06-09 07:02
Java调用C/C++动态库dll操作串口实例
大家好,今天分享的是使用C/C++编写一个读取串口数据的代码,然后将其编译成Windows下的动态链接库(.dll文件),然后写一个简单的java demo来调用C/C++接口。
评论