C++-设计一个特殊类


目录

一.设计一个类,不能被拷贝

二.设计一个类只能在堆上创建对象

三.设计一个类只能在栈上创建对象

四. 请设计一个类,不能被继承

五.请设计一个类,只能创建一个对象(单例模式)

        1.单例模式:

       2. 饿汉模式


一.设计一个类,不能被拷贝

        只需要让该类不能在类外调用该类的拷贝构造函数以及赋值重载函数即可。

        C++98:


class CopyBan
{
    // ...
    
private:
    CopyBan(const CopyBan&);
    CopyBan& operator=(const CopyBan&);
    //...
};

        C++11

class CopyBan
{
    // ...
    CopyBan(const CopyBan&)=delete;
    CopyBan& operator=(const CopyBan&)=delete;
    //...
};

二.设计一个类只能在堆上创建对象

        实现方式:

                1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。

                2. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

class HeapOnly    
{     
public:     
    static HeapOnly* CreateObject()  
   {      
        return new HeapOnly;    
   }
private:    
    HeapOnly() {}
    
    // C++98
    // 1.只声明,不实现。因为实现可能会很麻烦,而你本身不需要
 // 2.声明成私有
    HeapOnly(const HeapOnly&);
    
    // or
        
    // C++11    
    HeapOnly(const HeapOnly&) = delete;
};

三.设计一个类只能在栈上创建对象

        

class StackOnly
{
public:
 static StackOnly CreateObj()
 {
 return StackOnly();
 }
    
    // 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉
 // StackOnly obj = StackOnly::CreateObj();
 // StackOnly* ptr3 = new StackOnly(obj);
 void* operator new(size_t size) = delete;
 void operator delete(void* p) = delete;
private:
 StackOnly()  
 :_a(0)
 {}
private:
 int _a;
};

        也可以同第二个中的通过静态方法返回对象,来实现从栈上创建对象。

四. 请设计一个类,不能被继承

// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class NonInherit
{
public:
 static NonInherit GetInstance()
 {
 return NonInherit();
 }
private:
 NonInherit()
 {}
};

//C++11
class A  final
{
    // ....
};

五.请设计一个类,只能创建一个对象(单例模式)

        1.单例模式:
                一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个 访问它的全局访问点,该实例被所有程序模块共享 。比如在某个服务器程序中,该服务器的配置 信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再 通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。
单例模式有两种实现模式:
        
       2. 饿汉模式
                就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
// 饿汉模式
// 优点:简单
// 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。
  class Singleton
 {
  public:
      static Singleton* GetInstance()
     {
          return &m_instance;
     }
private:
     // 构造函数私有
    Singleton(){};
    
    // C++98 防拷贝
    Singleton(Singleton const&); 
    Singleton& operator=(Singleton const&); 
      
    // or
      
    // C++11
    Singleton(Singleton const&) = delete; 
    Singleton& operator=(Singleton const&) = delete; 
  
    static Singleton m_instance;
 };
  
  Singleton Singleton::m_instance;  // 在程序入口之前就完成单例对象的初始化
}

         3.懒汉模式

                用来解决饿汉模式中带来的缺点。

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/207535.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器巡检表

《服务器巡检表》检查项: 1、系统资源 2、K8S集群 3、Nginx 4、JAVA应用 5、RabbitMQ 6、Redis 7、PostgreSQL 8、Elasticsearch 9、ELK日志系统 获取软件开发全套资料进主页。

Python实现FA萤火虫优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

shell编程系列(8)-使用sed处理文本

文章目录 引言sed用法详解在文本中定位打印文本替换文本删除文本新增文本 结语 引言 在日常工作学习中我们都会遇到要编辑文本的场景,例如我们要用vim或者nano等命令去编辑代码,处理文本文件等,这些命令的特点都是需要我们进行交互式的实时处…

Set系列的集合

无序: 存取的顺序不一样 不重复:可以去重 无索引:不能使用普通for进行遍历,也不能通过索引获取元素 Set集合的实现类 HashSet:无序,不重复,无索引 LinkedHashSet:有序&#xff…

【报名】2023产业区块链生态日暨 FISCO BCOS 开源六周年生态大会

作为2023深圳国际金融科技节系列活动之一,由深圳市地方金融监督管理局指导,微众银行、金链盟主办的“2023产业区块链生态日暨FISCO BCOS开源六周年生态大会”将于12月15日下午14:00在深圳举办。 今年的盛会将进一步升级,以“FISCO BCOS和TA的…

自定义函数中的(int*a,int*b)与(int*a,int n)

事实上第一种更安全,不会因越界发生占位,从而导致错误。

三个方法,rar格式转换为zip压缩包

今天和大家分享三个rar压缩包改成zip格式的方法,希望能够帮助到大家! 方法一: 直接修改rar压缩包的后缀名变为zip,就可以修改压缩包文件格式了 方法二: 先将rar压缩包解压出来,然后再将解压出的文件进行…

【技术分享】远程透传网关-单网口快速实现西门子S7-200 串口PLC程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条,用于实现网络连接一台西门子S7-200 PLC及其编程软件一个9针串口头及连接线,用于连接PLC一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡,WIFI联…

Ascend C 算子开发遇到的问题及解决方法

摘要:在学习Ascend C算子开发进阶课程的时候,进行Ascend C自定义算子工程、算子调用等实验,在开发环境中遇到了一些问题,在这里记录一下。 首先如果在启智社区CANN版本为6.3 ,要进行Ascend C算子开发,需要…

fastadmin列表头部加按钮,点击弹出窗口提交数据保存

index.html <a href="{:url(pattern/piliangadd)}" class="btn btn-success btn-piliangadd btn-dialog {:$auth->check(pattern/piliangadd)?:hide}" title="批量添加" ><i class="fa fa-plus"></i> 批量添加…

ThreadPoolExecutor线程池内部处理浅析

我们知道如果程序中并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束时&#xff0c;会因为频繁创建线程而大大降低系统的效率&#xff0c;因此出现了线程池的使用方式&#xff0c;它可以提前创建好线程来执行任务。本文主要通过java的ThreadPoolEx…

Python自动化办公:PDF文件的分割与合并

我们平时办公中&#xff0c;可能需要对pdf进行合并或者分割&#xff0c;但奈何没有可以白嫖的工具&#xff0c;此时python就是一个万能工具库。 其中PyPDF2是一个用于处理PDF文件的Python库&#xff0c;它提供了分割和合并PDF文件的功能。 在本篇博客中&#xff0c;我们将详细…

Sass 语法详细介绍

文章目录 前言SASS缩进语法SASS的语法差异多线选择器注释import Mixin指令已弃用的语法后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正…

VR全景对旅游业有什么帮助,如何助力旅游业实现新的旅游形式

引言&#xff1a; 旅游业是一个充满机遇的行业&#xff0c;而虚拟现实&#xff08;VR&#xff09;全景技术正逐渐改变着旅游业的面貌&#xff0c;通过提供身临其境的体验&#xff0c;VR全景成为了旅游业的新宠&#xff0c;将旅游带入了一个全新的数字化时代。 一、打破地域限制…

C陷阱与缺陷——第6章 预处理器

在严格意义上的编译过程开始之前&#xff0c;C语言预处理器首先对程序代码做了必要的转换处理。预处理器的主要作用是&#xff1a; 我们有时需要将某个特定数量在程序中出现的所有实例统统加以修改大多数C语言实现在函数调用时都会带来重大的系统开销 1. 不能忽视宏定义中的空…

Elasticsearch:为现代搜索工作流程和生成式人工智能应用程序铺平道路

作者&#xff1a;Matt Riley Elastic 的创新投资支持开放的生态系统和更简单的开发者体验。 在本博客中&#xff0c;我们希望分享 Elastic 为简化你构建 AI 应用程序的体验而进行的投资。 我们知道&#xff0c;开发人员必须在当今快速发展的人工智能环境中保持灵活性。 然而&a…

xilinx系列FPGA基于VIVADO的pin delay列表生成说明

目录 1 概述2 示例平台3 操作说明4 注意事项 xilinx系列FPGA基于VIVADO的pin delay列表生成说明 1 概述 本文用于讲诉xilinx系列FPGA基于VIVADO的pin delay列表生成说明&#xff0c;以及一些注意事项&#xff0c;为FPGA设计人员探明道路。 Pin delay 即FPGA内部die到pin的延时…

爱芯元智AX650N部署yolov8s 自定义模型

爱芯元智AX650N部署yolov8s 自定义模型 本博客将向你展示零基础一步步的部署好自己的yolov8s模型&#xff08;博主展示的是自己训练的手写数字识别模型&#xff09;&#xff0c;本博客教你从训练模型到转化成利于Pulsar2 工具量化部署到开发板上 训练自己的YOLOv8s模型 准备自…

机器视觉新功能上线:同步训练多个模型,智造的脚步又加快了!

“AI视觉”的应用&#xff0c;为当下诸多企业的生产智能化打开了新的想象空间。其中&#xff0c;深度学习作为AI视觉的核心技术&#xff0c;在实际应用中往往需要经历一个耗时较长的阶段——深度学习神经网络模型训练。其目的是通过使用已标注的数据集来训练模型&#xff0c;使…

Inference with C# BERT NLP Deep Learning and ONNX Runtime

目录 效果 测试一 测试二 测试三 模型信息 项目 代码 下载 Inference with C# BERT NLP Deep Learning and ONNX Runtime 效果 测试一 Context &#xff1a;Bob is walking through the woods collecting blueberries and strawberries to make a pie. Question …