36 特殊类设计

类,不能被拷贝

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝。

  • c++98
    将拷贝构造函数与赋值云悬浮重载只声明不定义,并且将其访问权限设置为私有
class CopyBan{// ...private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);//...};

原因:
1.设置为私有:如果只声明没有设置成private,用户自己如果在类外定义了,就不能禁止拷贝了
2.只声明不定义:不定义是y8inwei该函数根本不会调用,定义了也没有意义,不写反而更简单,如果定义了就不会防止成员函数内部拷贝了

  • c++11
    c++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上delete,表示让编译器删掉该默认成员函数
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;};

类,只能在栈上创建对象

将构造函数私有化,设计静态方法返回,同时防止拷贝构造,返回对象需要用拷贝,将new重载禁掉

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方式

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

c++11方法:
关键字final,类不能被继承

class A  final{// ....};

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

设计模式(Desgin Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西?就像人类历史经过一次次打仗总结的套路,研究了《孙子兵法》

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写工程化,是软件工程的基本脉络

单例模式
一个类只能创建一个对象,即单例模式。该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务器进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境的配置管理

单例模式有两种实现模式:

  • 饿汉模式
    在程序启动的时候就创建唯一的实例对象,不管用不用
class Singleton
{
public:static Singleton* GetInstance(){return &_instance;}private://防拷贝Singleton() {};Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton _instance;
};//入口前初始化
Singleton Singleton::_instance;

优点:简单
缺点:导致进程启动慢,如果由多个单例类对象实例启动顺序不确定

如果单例对象再多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好

  • 懒汉模式
    如果单例对象构造十分耗时或者占用很多资源,比如加载插件,初始化网络连接读取文件等,有可能对象程序运行时不会用到,那么也要在程序一开始就初始化,会导致启动时很慢,这种情况使用懒汉模式(延迟加载)更好

class Singleton
{
public:static Singleton* GetInstance(){if (_instace == nullptr){_instace = new Singleton();}return _instace;}//资源回收class CGarbo{public:CGarbo(){if (_instace){delete _instace;}}};private:Singleton() {};Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* _instace;static CGarbo _garbo;
};Singleton* Singleton::_instace = nullptr;
Singleton::CGarbo _garbo;  //程序结束自动调用析构释放单例对象//获取对象
Singleton::GetInstance();

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

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

相关文章

Apache中使用SSI设置

先停服务在修改httpd.conf,备份下 Apache\Apache24\conf 设置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消该命令前的注释符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消该命令前的注释符# 加入html AddType text/html .…

在 Kotlin 中,`@JvmOverloads` 注解用于为具有默认参数值的函数生成重载方法

在 Kotlin 中,JvmOverloads 注解用于为具有默认参数值的函数生成重载方法。这个注解在你需要从 Java 代码调用 Kotlin 函数时特别有用,因为 Java 不支持默认参数值。 下面是一个例子,说明 JvmOverloads 的工作原理: Kotlin 代码…

前端javascript中的排序算法之插入排序

插入排序(Selection Sort)基本思想: 插入排序每次排一个数组项,以此方式构建最后的排序数组。假定第一项已经排序了,接着, 它和第二项进行比较,第二项是应该待在原位还是插到第一项之前呢&#…

软件工具网站推荐

1.菜鸟工具 菜鸟工具 - 不止于工具菜鸟工具,为开发设计人员提供在线工具,网址导航,提供在线PHP、Python、 CSS、JS 调试,中文简繁体转换,进制转换等工具。致力于打造国内专业WEB开发工具,集成开发环境&…

详细谈谈负载均衡的startupProbe探针、livenessProbe探针、readnessProbe探针如何使用以及使用差异化

文章目录 startupProbe探针startupProbe说明示例配置参数解释 使用场景说明实例——要求: 容器在8秒内完成启动,否则杀死对应容器工作流程说明timeoutSeconds: 和 periodSeconds: 参数顺序说明 livenessProbe探针livenessProbe说明示例配置参数解释 使用…

CSS技巧专栏:一日一例 1.纯CSS实现 会讨好的热情按钮 特效

题外话: 从今天开始,我准备开设一个新的专栏,专门写 使用CSS实现各种酷炫按钮的方法,本专栏目前准备写40篇左右,大概会完成如下按钮效果: 今天,我来介绍第一个按钮的实现方法:会讨好的热情按钮。为什么我给它起这样的名字呢?你看它像不像一个不停摇尾巴的小黄?当你鼠…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry):4.2.2 布局处理:4.2.3 键处理:4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

1Panel服务器面板支持哪些Linux操作系统?

1Panel面板支持的Linux操作系统版本有哪些?1Panel支持主流Linux发行版本,包括RedHat、CentOS、Ubuntu、Debian、openEuler及其他国产操作系统。支持多种服务器架构,码笔记整理详细1Panel面板支持的服务器系统、架构、内存和浏览器支持&#x…

【界面态】霍尔效应表征氮化对SiC/SiO2界面陷阱的影响

引言 引言主要介绍了硅碳化物(SiC)金属-氧化物-半导体场效应晶体管(MOSFETs)作为新一代高压、低损耗功率器件的商业化背景。SiC MOSFETs因其优越的电气特性,在高电压和高温应用领域具有巨大的潜力。然而,尽…

综合安全防护

题目 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能ping通10.0.3.10 4,办公区分为市场部和研发部,研…

Redis 数据过期及淘汰策略

Redis 数据过期及淘汰策略 过期策略 定时过期 在设置key​的过期时间的同时,为该key​创建一个定时器,让定时器在key​的过期时间来临时,对key进行删除。到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好&a…

动态数据库设计

动态数据库设计是一种灵活的方法,用于构建能够适应不断变化的数据需求的数据库结构。它强调在不频繁修改数据库表结构的前提下,有效管理和存储多样化的数据。以下是实现动态数据库设计的一些关键技术点和策略: 实体-属性-值(EAV&a…

Rockchip RK3588 - Rockchip Linux SDK脚本分析

---------------------------------------------------------------------------------------------------------------------------- 开发板 :ArmSoM-Sige7开发板eMMC :64GBLPDDR4 :8GB 显示屏 :15.6英寸HDMI接口显示屏u-boot &a…

LeetCode //C - 214. Shortest Palindrome

214. Shortest Palindrome You are given a string s. You can convert s to a palindrome by adding characters in front of it. Return the shortest palindrome you can find by performing this transformation. Example 1: Input: s “aacecaaa” Output: “aaacec…

如何在JetBrains中写Codeforce?

目录 前言 正文 leetcode 个人喜好 参考资料 具体操作步骤 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University of Nottingham Ningbo China&#x1f4…

Python函数 之 模块和包

1.模块 1, 在Python 中, 每个以 .py 结尾的 Python 代码⽂件 都可以称为是⼀个模块。 2, 在模块中 别⼈书写好的功能(变量, 函数, 类),我们可以拿来直接使⽤。 3, 我们自己写的代码文件, 想要作为模块让别⼈使⽤, 你的代码⽂件名(模块名) 满足标识符的规…

物流工业三防平板实时跟踪货物位置和状态

在当今全球化和高度数字化的商业环境中,物流行业的高效运作对于企业的成功和经济的繁荣至关重要。货物的准确、实时跟踪不仅能提高物流效率,还能增强客户满意度,降低运营成本。物流工业三防平板的出现,为实现货物位置和状态的实时…

全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志

全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志 摘要: 本文主要介绍了日志的定义和作用,以及 Python 内置日志处理的 logging 模块,同时简单说明了日志等级和 logging …

【人工智能】-- 搜索技术(状态空间法)

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍈介绍 🍉状态空间法 🍈状态空间的构成 🍍状态 🍍算符…

搜维尔科技:触觉反馈数据手套CyberGlove击鼓测试

触觉反馈数据手套CyberGlove击鼓测试 搜维尔科技:触觉反馈数据手套CyberGlove击鼓测试