关于C++的特殊类定制

特殊类定制

在C++中,一些特殊性质的类如何设计

类禁止拷贝的对象

  • C++11 使用delete关键字赋值给拷贝构造和赋值
  • C++98将拷贝构造和赋值声明在私有里

类只能在堆上创建的对象

  • 将构造函数私有化, 提供一个获取对象堆上创建对象的公有函数
  • 将析构函数私有化, 提供一个释放资源公有函数

类只能在栈上创建的对象

  • 将构造函数私有化, 并提供一个获取栈上创建的对象的公有函数
    然后将operator new函数禁用掉, 但是无法防拷贝(有一定缺陷)

不能被继承的类

  • C++98将父类构造函数私有化
  • C++11使用final关键字修饰父类

单例模式

一个类只能创建一个对象的类(singleton)

即只有唯一的实例对象

  • 饿汉模式: 无论是否使用, 程序创建之前(main函数之前)就构造一个唯一的对象

    1. 先将构造函数私有化
    2. 使用私有的一个静态的、对应类型的实例化对象成员, 在类内声明, 类外初始化
    3. 提供一个静态成员函数获取到该对象
    • 优点: 简单, 无线程安全问题
    • 缺点
      1. 单例模式多可能会导致进程的启动慢
      2. 一个程序中, 有多个单例时, 无法控制其初始化的顺序
  • 懒汉模式: 第一次使用对象时再创建实例对象

    • 设计方式同饿汉基本相同, 但调用静态成员函数时(需要获取实例对象时)再创建实例对象(new 实例对象)

    • 优点对应着饿汉的缺点

      • 可以控制多个单例的初始化顺序
      • 不影响启动顺序
    • 缺点

      • 线程安全问题

        • 需要通过对应加锁, 以及双重判断进行保护
        static ThreadPool<T> *getIntance(int num = g_thread_num){// 双重判断, 减少反复的加锁和解锁操作(因为只有第一次调用该方法时才会有线程安全问题, 之后都不会)// 加多一个判断, 后续再来的线程时, 则不需要再进行加解锁, 只用做一次判断即可(拦截了大量的无用的访问锁的行为->只有第一次访问锁有意义)if (pool == nullptr){LockGuard lock(&_smtx);if (pool == nullptr){pool = new ThreadPool<T>(num);}}return pool;
        }
        
  • 单例对象的释放问题

    • 一般情况下, 单例对象在整个程序运行期间都需要使用, 所以一般都是不释放的
      单例对象在进程结束后也会进行资源释放
    • 一些特殊场景需要释放, 如单例对象析构时, 需要进行一些持久化操作(往文件或者数据库写)
      构建一个内嵌的垃圾回收类, 然后声明一个全局的垃圾回收对象, 当单例对象生命周期到时, 则会自动析构该垃圾对象, 同时释放单例对象资源

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript面向对象编程入门:从0到1的奇幻之旅【含代码示例】

JavaScript面向对象编程入门&#xff1a;从零到英雄的奇幻之旅【含代码示例】 一、OOP&#xff1a;编程界的哈利波特基本概念类与实例 二、挥舞魔杖&#xff1a;创建类与实例基本语法 三、继承与封装&#xff1a;家族的力量继承封装 四、实战与技巧&#xff1a;打造坚固的魔法城…

IT行业的现状与未来发展趋势:从云计算到量子计算的技术变革

随着技术的不断进步&#xff0c;IT行业已经成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将深入探讨当前IT行业的现状&#xff0c;并展望未来发展趋势&#xff0c;旨在为…

vscode当前分支有未提交的修改,但是暂时不想提交,想要切换到另一个分支该怎么办

当前分支有未提交的修改,但是暂时不想提交,想要切换到另一个分支该怎么办? 首先,可以将当前修改暂存起来,以便之后恢复 git stash 然后切换到目标分支,例如需求A所在分支 git checkout feat-a-jie 修改完A需求后,需要先切换回之前的分支,例如需求B所在分支 git checkout feat…

免费插件集-illustrator插件-Ai插件-文本对象分行

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行文本对象分行。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…

通过安全的云开发环境重新发现 DevOps 的心跳

云开发平台如何“提升” DevOps 首先&#xff0c;我来简单介绍一下什么是云开发环境&#xff1a;它通常运行带有应用程序的 Linux 操作系统&#xff0c;提供预配置的环境&#xff0c;允许进行编码、编译和其他类似于本地环境的操作。从实现的角度来看&#xff0c;这样的环境类…

前端 JS 经典:读取文件原始内容

前言&#xff1a;有些时候在工程化开发中&#xff0c;我们需要读取文件里面的原始内容&#xff0c;比如&#xff0c;你有一个文件&#xff0c;后缀名为 .myfile&#xff0c;你需要拿到这个文件里的内容&#xff0c;该怎么处理呢。 在 vue2 中&#xff0c;因为 vue2 使用 vue-c…

【算法】前缀和——寻找数组的中心下标

本节博客是用前缀和算法图解“寻找数组的中心下标”&#xff0c;有需要借鉴即可。 目录 1.题目2.题意3.前缀和求解4.示例代码5.细节6.总结 1.题目 题目链接&#xff1a;LINK 2.题意 我们以示例1为例来图解一下题意&#xff1a; 3.前缀和求解 根据已有经验&#xff0c;我…

Java 读取 xml 文件的五种方式

在编写与 XML 数据交互的现代软件应用时&#xff0c;有效地读取和解析 XML 文件是至关重要的。XML&#xff08;可扩展标记语言&#xff09;因其灵活性和自我描述性&#xff0c;已成为数据存储和传输的一种普遍格式。对于 Java 开发者来说&#xff0c;Java 提供了多种工具和库来…

数据库索引相关的知识点总结

目录 1. 索引的概念 2. 索引的作用 3. 索引的类型 4. 索引的缺点 5. 索引的使用场景 6. 索引的设计原则 7. 索引的实现技术 8. 索引的优化技巧&#xff1a; 数据库表的索引是一个非常重要的概念&#xff0c;它类似于一本书的目录&#xff0c;可以帮助我们快速找到所需的…

Idea工具的使用技巧与常见问题解决方案

一、使用技巧 1、启动微服务配置 如上图&#xff0c;在编辑配置选项&#xff0c;将对应的启动入口类加进去&#xff0c; 增加jvm启动参数&#xff0c; 比如&#xff1a; -Denvuat 或者 -Denvuat -Dfile.encodingUTF-8 启动配置可能不是-Denvuat&#xff0c;这个自己看代…

Android 11 Audio音频系统配置文件解析

在AudioPolicyService的启动过程中&#xff0c;会去创建AudioPolicyManager对象&#xff0c;进而去解析配置文件 //frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientIn…

MySQL目录和文件

MySQL目录和文件 bin目录 存储一些mysql脚本比如mysqld、mysqld-self等等&#xff0c;用于执行mysql一些操作 数据目录 show variables like datadir;--查看数据目录位置每一个数据库都有一个和数据库名相同的文件夹&#xff1b;MySQL5.7开始每创建一个表&#xff0c;在Innod…

Python机器学习 Tensorflow + keras 实现CNN

一、实验目的 1. 了解SkLearn Tensorlow使用方法 2. 了解SkLearn keras使用方法 二、实验工具&#xff1a; 1. SkLearn 三、实验内容 &#xff08;贴上源码及结果&#xff09; 使用Tensorflow对半环形数据集分 #encoding:utf-8import numpy as npfrom sklearn.datasets i…

Dynadot API调整一览

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

AI Agent教育行业落地案例

【AI赋能教育】揭秘Duolingo背后的AI Agent&#xff0c;让学习更高效、更有趣&#xff01; ©作者|Blaze 来源|神州问学 引言 随着科技的迅猛发展&#xff0c;人工智能技术已经逐步渗透到我们生活的各个方面。而随着AI技术的广泛应用&#xff0c;教育培训正引领着一场新的…

149.二叉树:二叉树的前序遍历(力扣)

代码解决 这段代码实现了二叉树的前序遍历&#xff0c;前序遍历的顺序是&#xff1a;访问根节点 -> 递归遍历左子树 -> 递归遍历右子树。以下是详细解释&#xff0c;包括各个部分的注释&#xff1a; // 二叉树节点的定义 struct TreeNode {int val; // 节…

php -v在cmd中正常显示 在vscode中却报错

效果展示 原因 在vscode中 终端是 PowerShell PowerShell 默认情况下它不会继承系统的PATH环境变量 解决方案 使用CMD作为终端 打开VSCode设置&#xff08;File > Preferences > Settings 或 Ctrl,&#xff09;。搜索 terminal.integrated.shell.windows。更改其值…

springboot集成nacos

springboot集成nacos 1.版本2. POM依赖3. nacos服务3.1 下载nacos压缩包3.2 启动nacos 4. yaml配置5.Demo5.1 配置中心简单格式获取方式普通方式还可以再启动类上添加注解完成5.2 获取json格式的demo5.2 自动注册根据yaml配置 1.版本 nacos版本:2.3.2 springboot版本&#xff…

【已解决】使用StringUtils.hasLength参数输入空格仍然添加成功定价为负数仍然添加成功

Bug情景 今天在做功能测试时&#xff0c;发现使用使用StringUtils.hasLength&#xff08;&#xff09;方法以及定价为负数时&#xff0c;添加图书仍然成功 思考过程 0.1 当时在做参数检验时用了spring提供的StringUtils工具包&#xff0c;百度/大数据模型说&#xff1a; 0.2…

Redis:redis基础

Redis Remote Dictionary Service即远程字典服务 一个基于内存的key-value结构数据库,在开发中常常作为缓存存储不经常被改变的数据 基于内存存储,读写性能高 在企业中应用广泛 Redis介绍 用C语言开发的开源高性能键值对数据库,可以达到10w的qps,可以存储丰富的value类型…