C++特殊类设计,

news2024/9/21 4:30:13

目录

​编辑

一、不能拷贝的类

二、只能在栈上创建的类,

三、只能在堆上创建的类,

四、不能被继承的类,

五、只有一个对象的类

一、不能拷贝的类

c++98:将拷贝构造和=运算符重载私有化

C++11:delete删除成员函数

//禁止copy的类
//class CopyBan {//c++98
//public:
//	CopyBan(int b)
//		:a(b)
//	{};
//private:
//	CopyBan(const CopyBan&) {};
//	CopyBan& operator=(const CopyBan) {};
//	int a = 1;
//};

class CopyBan {//c++11
public:
	CopyBan(int val)
		:a(val)
	{};
	CopyBan(const CopyBan&)=delete;
	CopyBan& operator=(const CopyBan&) =delete;//返回值CopyBan&,连续赋值
	int a;
};

二、只能在栈上创建的类,

不能在堆上创建的类:new需要调用构造函数所以将构造函数删除或者声明私有化。

class StackOnly{//堆上对象,new调用构造函数,所以私有化构造函数
public:
	static StackOnly CreateObj() {
		return StackOnly();
	}
	//c++11
	//void* operator new(size_t size) = delete;
	//void operator delete(void* ptr) = delete;

private:

	//c++98
	StackOnly() :_a(1) {};
	//StackOnly(const StackOnly&) {};
	StackOnly& operator=(const StackOnly&);
	int _a;
};

三、只能在堆上创建的类,

不能在栈上创建,栈上创建可以调用构造函数或者拷贝构造函数,或者=运算符重载。所以c++98设为私有,c++11:delete


class HeapOnly {//只能在堆上创建对象,栈上的对象,拷贝和构造函数私有化
public:
	static HeapOnly* CreateObject() {
		return new HeapOnly;
	}
	//c++11
	//HeapOnly(const HeapOnly&) = delete;
private:
	HeapOnly():a(1) {}

	//c++98
	HeapOnly(const HeapOnly&);
	HeapOnly operator=(const HeapOnly&);

	int a;
	
};

四、不能被继承的类,

派生类的继承会调用基类的构造函数,c++98将基类的构造函数私有化,派生类中调不到基类的构造函数。则无法继承,c++11;final关键字


//派生类中调不到基类的构造函数。则无法继承
class nonInherit{
public:
	static nonInherit GetInstance() {
		return nonInherit();
	}
private:
	nonInherit() {}
};
//c++11:关键字
class nonInheritC11 final
{

};

五、只有一个对象的类

这是一种设计模式,叫做单例模式:

        设计模式: 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的 总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打 仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后 来孙子就总结出了《孙子兵法》。孙子兵法也是类似。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模 式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

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

单例模式有两种实现模式

        饿汉(hungry模式):就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

class Singleton {//hungry
public:
	static Singleton* GetInstance() {
		return &m_instance;
	}
private:
	Singleton() {};
	//c++98 防止拷贝
	Singleton(const Singleton &);
	Singleton& operator=(const Singleton &);

	//c++11
	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;

	static Singleton m_instance;// 程序入口前完成初始化
};

static Singleton m_instance;

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

         懒汉模式

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

#include<iostream>
#include<mutex>
#include<thread>
using namespace std;


class Singleton {
public:
	static Singleton* GetInstance() {
		if (nullptr == m_pInstance) {
			m_mtx.lock();
			if (nullptr == m_pInstance) {
				m_pInstance = new Singleton();
			}
			m_mtx.unlock();
		}
		return m_pInstance;
	}
	
	class CGarbo {
	public:
		~CGarbo() {
			if (Singleton::m_pInstance)
				delete Singleton::m_pInstance;
		}
	};

	static CGarbo Garbo;
private:
	Singleton() {};
	
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);

	static Singleton* m_pInstance;
	static mutex m_mtx;
};

Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;


int main(){
	thread t1([] {cout << Singleton::GetInstance()<<"  " << endl; });
	thread t2([] {cout << Singleton::GetInstance()<<"  " << endl; });

	t1.join();
	t2.join();
	
	cout << Singleton::GetInstance()<< endl;
	cout << Singleton::GetInstance()<< endl;


	return 0;
}

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

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

相关文章

[数据集][目标检测]电梯内广告牌电动车检测数据集VOC+YOLO格式2787张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2787 标注数量(xml文件个数)&#xff1a;2787 标注数量(txt文件个数)&#xff1a;2787 标注…

2024-09-03升级问题记录:编译打包出错java.lang.OutOfMemoryError: GC overhead limit exceeded

Android工程升级&#xff0c;debug构建apk可以正常生成&#xff0c;但是release构建时出现以上错误。 按字面意思&#xff0c;GC回收时内存不够。 那么&#xff0c;解决方法&#xff1a; 在在项目根目录的gradle.properties中&#xff0c;注意不是Administrator\.gradle 的 …

linux中vim常用命令大全详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Vim 是 Linux 系统中功能强大的文本编辑器&#xff0c;广泛用于代码编辑和配置文件的编辑。以下是 Vim 常用命令的详细讲解&#xff0c;包括基本操作、文本编辑、查找与替换、窗口操作等。 一、Vim 基本操…

Epoll 用法

Epoll 监听 EPOLL_CTL_DEL EPOLL_CTL_ADD epoll_event event event.events event.data.fd

初识redis(String,Hash,List,Set,SortedSet)

认识NoSql sql关系型数据库 nosql非关系型数据库 nosql具有非结构化&#xff0c;Key/Value&#xff0c;Document&#xff0c;Draph 无关联的&#xff0c;非sql&#xff0c;BASE&#xff08;原子性&#xff0c;持久性&#xff0c;一致性&#xff0c;隔离性&#xff09; 认识r…

盘点4款超好用的电脑数据恢复工具

如今我们的生活和工作越来越离不开电脑&#xff0c;因此电脑里面也储存了我们大量的数据&#xff1a;图片&#xff0c;文档&#xff0c;工作资料等。但是这些重要数据却会因为误删除、病毒攻击、系统崩溃等原因遭到丢失。所以数据恢复软件就变得十分的重要&#xff0c;今天&…

maya无法导出fbx

很多小伙伴使用Maya软件导出fbx格式文件时会提示“无法识别文件类型”&#xff0c;这主要是因为没有开启fbx插件造成的&#xff0c;只要开启fbx插件就能解决这个问题。 在Maya软件的“Modeling”模式下&#xff0c;点击菜单栏的“Windows”&#xff0c;在弹出的下拉框中选择“S…

Altium AD20差分对走线设置方法

Altium AD20差分对走线设置方法 1、在PCB界面右下角点击panels&#xff0c;选择"PCB"选项&#xff0c;则左下角就会出现PCB的窗口选项 2、在PCB窗口内&#xff0c;将上面的下拉菜单选择Differential Pairs Editor选项&#xff0c;然后按下图操作 3、增加差分网络分…

服务器数据恢复—OneFS文件系统下数据被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC NAS&#xff08;Isilon S200&#xff09;&#xff0c;共3个节点&#xff0c;每个节点配置12块STAT硬盘。数据分两部分&#xff1a;一部分数据为vmware虚拟机&#xff08;WEB服务器&#xff09;&#xff0c;通过NFS协议共享到ESX主…

【数据库】MySQL表的基本查询

关于表的增删查改主要分为CRUD&#xff1a;Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 目录 1.Creat&#xff08;增加内容&#xff09; 1.1指定列插入 1.2全列插入 1.3多行插入 1.4插入冲突更新 1.5替换 2.R…

Springboot3.x.x使用SpringSecurity6(一文包搞定)

SpringSecurity6 什么是SpringSecurity? Spring Security 是一个强大的、高度可定制的身份验证&#xff08;Authentication&#xff09;和访问控制&#xff08;Authorization&#xff09;框架。它是 Spring 框架家族的一员&#xff0c;主要用于保护基于 Java 的应用程序&#…

鸿蒙开发有必要学吗

在科技飞速发展的今天&#xff0c;新的技术不断涌现&#xff0c;开发者们也面临着众多选择。其中&#xff0c;鸿蒙开发成为了一个备受关注的话题。那么&#xff0c;鸿蒙开发有必要学吗? 一、鸿蒙系统的崛起 鸿蒙操作系统是华为推出的一款面向全场景的分布式操作系统。它的出现…

CPU飙高排查步骤

1&#xff1a;top指令(查看进程信息) top指令&#xff1a;查看进程运行信息 此处1313占用90多CPU 2&#xff1a;ps指令&#xff08;查看进程中每个线程信息&#xff0c;锁定问题线程&#xff09; 查看进程里每个线程的详细占用 ps H -eo pid,tid,%cpu | grep 1313ps H:查看进…

信息学奥赛初赛天天练-83-NOIP2014普及组-基础题2-输入设备、输出设备、操作系统、二进制、整数除法、while、do while循环

1 NOIP 2014 普及组 基础题2 4 以下哪一种设备属于输出设备( ) A 扫描仪 B 键盘 C 鼠标 D 打印机 5 下列对操作系统功能的描述最为完整的是( ) A 负责外设与主机之间的信息交换 B 负责诊断机器的故障 C 控制和管理计算机系统的各种硬件和软件资源的使用 D 将没有程序编译成目…

解决微服务调用失败之 Name or service not known

在微服务启动之后&#xff0c;调用后台接口报错&#xff0c;如下&#xff1a; Name or service not known通过在Eureka控制台查看服务注册情况&#xff0c;发现服务已经注册上来&#xff0c;并且使用了主机名(非Ip)进行了注册。 如下图&#xff1a; 查阅资料得知&#xff0c;…

【时时三省】(C语言基础)指针进阶 例题2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 第一个arr 数组名相当于首元素地址 因为他没有放到strlen内部 也没有取地址 strlen是找&#xff3c;0 找不到&#xff3c;0就不会停下来 所以它打印的就是随机值 第二个arr0 首元素地址加零还…

谁还不知道用ChatmoneyAI写短剧脚本,真能火

本文由 ChatMoney团队出品 现在大家打开抖音、小红书&#xff0c;琳琅满目&#xff0c;目光所能及的都是各种吸精剧情的小短剧&#xff0c;虽然这些短剧的制作成本低&#xff0c;但是作为编剧的要写脚本&#xff0c;可不认为这么容易啊......... 接下来我给大家推荐一下使用Ch…

2024年全国大学生数学建模竞赛(B题) 建模解析|生产过程中的决策问题|小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;实现综合建模。独创复杂系统视角&#xff0c;帮助你解决国赛的难关呀。 完整内容可以…

分布式系统漫谈:从一致到共识

0 前言 本文将以**分布式系统的基本组成为出发点&#xff0c;详细探讨分布式系统的发展历程&#xff1b;逐步展开到分布式系统构成的核心要素&#xff0c;分析这些核心要素会对系统造成怎样的影响、以及影响的不同表现形式&#xff1b;最后探讨如何构建基本可用的分布式系统**…

MySQL-35个DQL练手题(难)

第1题 取得每个部门最高薪水的人员名称 第一步&#xff1a;取得每个部门最高薪水 select max(sal) topsal, deptno from emp group by deptno;第二步&#xff1a;将上面第一步的查询结果当做一张临时表t&#xff0c;进行表连接&#xff0c;条件是&#xff1a;t.deptnoe.deptn…