c++学习(特殊类设计)[30]

只能在堆上创建对象的类

如果你想要确保对象只能在堆上创建,可以通过将析构函数声明为私有,并提供一个静态成员函数来创建对象。这样,类的实例化只能通过调用静态成员函数来完成,而无法直接在栈上创建对象。

以下是一个示例:

class HeapOnlyClass {
private:HeapOnlyClass() {} // 私有的构造函数,防止在栈上创建对象~HeapOnlyClass() {} // 私有的析构函数public:static HeapOnlyClass* createInstance() {return new HeapOnlyClass();}
};int main() {// 无法在栈上创建对象// HeapOnlyClass obj;// 只能通过静态成员函数创建对象HeapOnlyClass* obj = HeapOnlyClass::createInstance();// 使用对象...delete obj; // 释放堆上的对象return 0;
}

在上面的示例中,HeapOnlyClass 类的构造函数和析构函数都被声明为私有。这意味着在类的外部无法直接创建对象或销毁对象。

通过提供一个静态成员函数 createInstance(),我们可以在堆上创建对象。静态成员函数返回一个指向 HeapOnlyClass 对象的指针。在 main() 函数中,我们使用 createInstance() 函数来创建对象,并在使用完对象后通过 delete 关键字释放对象。

这样,我们就可以确保对象只能在堆上创建,而无法在栈上创建。

只能在栈上创建对象的类

如果你想要确保对象只能在栈上创建,可以将类的构造函数声明为私有,并提供一个静态成员函数来创建对象。这样,类的实例化只能通过调用静态成员函数来完成,而无法直接在堆上创建对象。

以下是一个示例:

class StackOnlyClass {
private:StackOnlyClass() {} // 私有的构造函数,防止在堆上创建对象public:static StackOnlyClass createInstance() {return StackOnlyClass();}
};int main() {// 无法在堆上创建对象// StackOnlyClass* obj = new StackOnlyClass();// 只能通过静态成员函数创建对象StackOnlyClass obj = StackOnlyClass::createInstance();// 使用对象...return 0;
}

在上面的示例中,StackOnlyClass 类的构造函数被声明为私有。这意味着在类的外部无法直接创建对象。

通过提供一个静态成员函数 createInstance(),我们可以在栈上创建对象。静态成员函数返回一个 StackOnlyClass 对象。在 main() 函数中,我们使用 createInstance() 函数来创建对象,并在使用完对象后,对象会自动被销毁。

这样,我们就可以确保对象只能在栈上创建,而无法在堆上创建。

单例模式(一个类之只能创建一个对象)

在这里插入图片描述
在这里插入图片描述
单例模式可以通过懒汉模式和饿汉模式来实现。下面我将为你解释这两种方式的实现。

  1. 懒汉模式:
    懒汉模式是指在需要获取实例时才会创建对象。实现懒汉模式的关键是延迟实例化,即在第一次调用获取实例的方法时才创建对象。
class LazySingleton {
private:static LazySingleton* instance;LazySingleton() {} // 私有构造函数public:static LazySingleton* getInstance() {if (instance == nullptr) {instance = new LazySingleton();}return instance;}
};LazySingleton* LazySingleton::instance = nullptr;

在上面的示例中,LazySingleton 类的构造函数被声明为私有,无法直接实例化对象。通过静态成员变量 instance 来保存类的唯一实例,并在 getInstance() 方法中进行延迟实例化。如果 instancenullptr,则创建一个新的 LazySingleton 对象。如果 instance 不为 nullptr,则直接返回现有的实例。

  1. 饿汉模式:
    饿汉模式是指在类加载时就创建对象,无需延迟实例化。实现饿汉模式的关键是在类定义中直接创建对象,并提供一个静态方法来获取这个实例。
class EagerSingleton {
private:static EagerSingleton* instance;EagerSingleton() {} // 私有构造函数public:static EagerSingleton* getInstance() {return instance;}
};EagerSingleton* EagerSingleton::instance = new EagerSingleton();

在上面的示例中,EagerSingleton 类的构造函数被声明为私有,无法直接实例化对象。通过静态成员变量 instance 在类定义中直接创建 EagerSingleton 对象。在 getInstance() 方法中,直接返回这个已经创建好的实例。

懒汉模式和饿汉模式都可以实现单例模式,但它们的区别在于实例化的时机。懒汉模式在第一次调用获取实例的方法时才创建对象,而饿汉模式在类加载时就创建对象。

懒汉模式和饿汉模式各有优点和缺点,下面我将为你详细解释。

懒汉模式的优点:

  1. 延迟实例化:懒汉模式在需要获取实例时才会创建对象,可以避免不必要的资源消耗。如果实例化对象的过程比较耗时,懒汉模式可以提高性能。
  2. 线程安全(加锁):在多线程环境下,懒汉模式可以通过加锁来保证只有一个线程能够创建实例。这样可以避免多个线程同时创建多个实例的问题。

懒汉模式的缺点:

  1. 线程安全(加锁):虽然懒汉模式可以通过加锁来保证线程安全,但是加锁会引入额外的开销,降低性能。
  2. 可能存在资源竞争:在多线程环境下,如果有多个线程同时判断实例为空,然后同时创建实例,就会导致资源竞争的问题。

饿汉模式的优点:

  1. 简单直观:饿汉模式在类加载时就创建了实例,不需要进行延迟实例化的逻辑,代码相对简单。
  2. 线程安全:在类加载时就创建了实例,因此不会存在多个线程同时创建实例的问题。

饿汉模式的缺点:

  1. 提前实例化:饿汉模式在类加载时就创建了实例,如果这个实例在后续的程序中没有被使用,就会造成资源的浪费。
  2. 无法处理异常:在饿汉模式下,如果在创建实例的过程中发生异常,无法通过捕获异常来处理,因为实例的创建是在类加载时进行的。

综上所述,懒汉模式适用于需要延迟实例化的场景,可以避免不必要的资源消耗;而饿汉模式适用于实例创建比较简单且在后续程序中会被使用的场景,可以保证线程安全。

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

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

相关文章

【开源项目--稻草】Day03

【开源项目--稻草】Day03 1. 续Spring-Security1.1 自定义登录界面 2. 用户注册2.1 将注册页面显示2.2 编写控制器进行测试2.3 编写注册业务逻辑2.4 注册功能的收尾 3. VUE3.1 VUE的基本使用3.1.1 什么是VUE 3.2 使用VUEAjax完善稻草问答的注册功能 1. 续Spring-Security 1.1 …

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…

6.物联网操作系统信号量

一。信号量的概念与应用 信号量定义 FreeRTOS信号量介绍 FreeRTOS信号量工作原理 1.信号量的定义 多任务环境下使用,用来协调多个任务正确合理使用临界资源。 2.FreeRTOS信号量介绍 Semaphore包括Binary,Count,Mutex; Mutex包…

【2种方法,jmeter用一个正则提取器提取多个值!】

jmeter中,用json提取器,一次提取多个值,这个很多人都会。但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":&q…

Jenkins触发器时间、次数设定

触发器触发条件介绍 触发器触发条件公式:由5颗星组成 * * * * * 分别代表:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6) 企业项目中常用场景介绍 场景1:接口脚本部分测试通过,部分还在进行,回归测试脚本执行…

Windows上安装 jdk 环境并配置环境变量 (超详细教程)

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败,可以使用手动下载数据 Ctrl点击可以进入相关包文件,查找下载地址:https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…

企业微信小程序在调用wx.qy.login时返回错误信息qy.login:fail

原因是大概是绑定了多个企业但是在开发者工具中没有选择正确的企业 解决方法: 重新选择企业后即可成功获取code

RabbitMQ(一) - 基本结构、SpringBoot整合RabbitMQ、工作队列、发布订阅、直接、主题交换机模式

RabbitMQ结构 Publisher : 生产者 Queue: 存储消息的容器队列; Consumer:消费者 Connection:消费者与消息服务的TCP连接 Channel:信道,是TCP里面的虚拟连接。例如:电缆相当于TCP,信道是一条独立光纤束&…

web开发中的安全和防御入门——csp (content-security-policy内容安全策略)

偶然碰到iframe跨域加载被拒绝的问题,原因是父页面默认不允许加载跨域的子页面,也就是的content-security-policy中没有设置允许跨域加载。 简单地说,content-security-policy能限制页面允许和不允许加载的所有资源,常见的包括&a…

原型链污染

文章目录 1. javascript 原型链2. 原型链变量的搜索3. prototype 原型链污染4. 原型链污染例题4.1 题1:4.2.题2: 1. javascript 原型链 js在ECS6之前没有类的概念,之前的类都是用funtion来声明的。如下 可以看到b在实例化为test对象以后&…

【C语言进阶】指针的高级应用(下)

文章目录 一、指针数组与数组指针1.1 指针数组与数组指针的表达式 二、函数指针2.1 函数指针的书写方式 三、二重指针与一重指针3.1 二重指针的本质3.2 二重指针的用法3.3 二重指针与数组指针 总结 一、指针数组与数组指针 (1)指针数组的实质是一个数组,这个数组中存…

Linux进程(二)

文章目录 进程(二)Linux的进程状态R (running)运行态S (sleeping)阻塞状态D (disk sleep)深度睡眠T(stopped)状态X(dead)状态Z&#x…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--搭建Vue 前端工程[一]

文章目录 SSM--搭建Vue 前端工程--项目基础界面实现功能01-搭建Vue 前端工程需求分析/图解代码实现搭建Vue 前端工程下载node.js LTS 并安装: node.js 的npm创建Vue 项目使用idea 打开ssm_vue 项目, 并配置项目启动 Vue3 项目目录结构梳理Vue3 项目结构介绍 配置Vue 服务端口El…

Dockerfile构建mysql

使用dockerfile构建mysql详细教学加案例 Dockerfile 文件 # 使用官方5.6版本,latest为默认版本 FROM mysql:5.6 #复制my.cof至容器内 ADD my.cnf /etc/mysql/my.cof #设置环境变量 密码 ENV MYSQL_ROOT_PASSWORD123456my.cof 文件 [mysqld] character-set-server…

IDEA SpringBoot Maven profiles 配置

IDEA SpringBoot Maven profiles 配置 IDEA版本: IntelliJ IDEA 2022.2.3 注意:切换环境之后务必点击一下刷新,推荐点击耗时更短。 application.yaml spring:profiles:active: env多环境文件名: application-dev.yaml、 applicat…

【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测

【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测 思路 考虑拥挤距离指标与PCC皮尔逊相关系数法相结合,对回归或分类数据进行降维,通过SVM支持向量机交叉验证得到平均指标,来…

基于CentOS 7构建LVS-DR集群

DIPVIPRIPClient192.169.41.139 LVS 192.168.41.134192.169.41.10RS1192.168.41.135RS2192.168.41.138 要求: node4为客户端,node2为LVS,node3和node4为RS。 1.配置DNS解析(我这里使用本地解析) 192.168.41.134 www.y…

一、8.分页

当物理内存不够时就把不常用的内存暂时存入磁盘,并且描述符的P位置0,把要使用的段放入内存,描述符P位置1 但是这种方式会产生大量内存碎片,影响内存分配效率 设想一个虚拟内存,每隔任务都有他独立的虚拟内存&#xf…

golang pprof 监控系列—— cpu 占用率 统计原理

经过前面的几节对pprof的介绍,对pprof统计的原理算是掌握了七八十了,我们对memory,block,mutex,trace,goroutine,threadcreate这些维度的统计原理都进行了分析,但唯独还没有分析pprof 工具是如何统计cpu使用情况的,今天我们来分析…