c++特殊类

news2025/1/12 18:22:01

目录

1.实现一个只能在堆上创建对象的类(了解思想)

2.实现一个只能在栈上创建对象的类(同样思想最重要)

3.单例模式(有实际应用价值)


1.实现一个只能在堆上创建对象的类(了解思想)

实现原理:为了不开出静态变量和在栈上开变量有两种方式

方式一:将析构函数私有,然后手动实现一个有析构功能的成员函数,调用该函数即可。

方式二:将构造函数私有,然后手动实现一个返回new出来对象的成员函数。比较坑的是,要注意将拷贝构造和赋值都屏蔽掉。因为,在用拷贝构造和赋值时,还会使用构造函数。

方式一:

#include<iostream>

using namespace std;

//方式1
class HeapOnly
{
public:
	void Delete() //手动实现释放
	{
		cout << "Delete by myself" << endl;
		delete this;
	}
private:
	~HeapOnly() //析构私有
	{}
	int _a;
};
int main()
{
	HeapOnly h1;
	static HeapOnly h2;
	HeapOnly* h3 = new HeapOnly;
	h3->Delete();
	return 0;
}

不屏蔽静态和栈上的会报错 。

 

 方式二:

//方式二
class HeapOnly
{
public:
	static HeapOnly* GetRet()  //手动new一个返回
	{
		cout << "new by myself" << endl;
		HeapOnly* ret=new HeapOnly;
		return ret;
	}
	HeapOnly(const HeapOnly& hp) = delete; //屏蔽拷贝构造和赋值
	HeapOnly operator=(const HeapOnly& hp) = delete;

private:
	HeapOnly() //构造私有
	{}
	int _a;
};
int main()
{
	//HeapOnly h1;
	//static HeapOnly h2;
	HeapOnly* h = HeapOnly::GetRet();

	return 0;
}


2.实现一个只能在栈上创建对象的类(同样思想最重要)

由于,栈不能和堆一样手动写一个函数进行销毁。因此只能私有构造函数。

class StackOnly
{
private:
	int _a;
	StackOnly()
		:_a(0)
	{}
public:
	static StackOnly GetRet()
	{
		cout << "get by myself" << endl;
		StackOnly ret;
		return ret;
	}
	//上面涉及拷贝(传值返回),所以不能禁用拷贝,因此解决不了创建静态对象的问题。。
	
	/*StackOnly(const StackOnly& st) = delete;
	StackOnly operator=(const StackOnly& st) = delete;*/

	void* operator new(size_t n) = delete; //可以把new对象屏蔽。
};
int main()
{
	//HeapOnly h1;
	//static HeapOnly h2;
	/*HeapOnly* h = HeapOnly::GetRet();*/

	StackOnly st1 = StackOnly::GetRet();
	//StackOnly* st2 = new(StackOnly);
	return 0;
}


3.单例模式(有实际应用价值)

单例模式是指一个类只能创建一个对象。这个实例可以被全局访问,被所有模块共享。

实现方式1:饿汉模式

饿汉指的是,无论你是否使用该实例,程序启动就创建一个实例对象。

class singleton
{
public: 
	singleton* GetInstance()
	{
		return &m_instance;  //方便拿出_instance
	}
	singleton(const singleton& sl) = delete; //屏蔽掉拷贝和赋值
	singleton operator=(const singleton& sl) = delete;

private:
	singleton() //只能实例化一次,因此构造一定要私有。
		:_a(0)
	{}
	static singleton m_instance; //静态初始化成员,方便马上直接拿出来。
	int _a;
};

singleton singleton::m_instance; //在主程序开始前就实例化

int main()

 优点:简单,不存在线程安全的问题。

缺点:拖延程序启动时间,如果有多个单例模式初始化的单例顺序不一定准。

实现方式2:懒汉模式

懒汉指的是,第一次使用对象时再实例化。

class MemoryPool
{
public:
	static	MemoryPool* GetInstance()
	{
		if (_pinst == nullptr)
		{
			_pinst = new MemoryPool; //用时初始化一次
		}
		return _pinst;
	}
	class CGarbo { //内嵌垃圾回收类
	public:
		~CGarbo()
		{
			if (_pinst)
				delete _pinst;
		}
	};
private:
	MemoryPool() //只能实例化一次,因此构造一定要私有。
	{}
	char* _ptr=nullptr;
	static MemoryPool* _pinst;
};

MemoryPool* MemoryPool::_pinst = nullptr; //创建单例对象
static MemoryPool::CGarbo gc; //通过调用内嵌类的析构实现资源释放。

优点:不会拖延程序启动时间,可以确定单例对象实例的循序。

缺点:复杂,存在线程安全的问题。

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

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

相关文章

MOAT: ALTERNATING MOBILE CONVOLUTION AND ATTENTION BRINGS STRONG VISION MODELS

MOAT: ALTERNATING MOBILE CONVOLUTION AND ATTENTION BRINGS STRONG VISION MODELS一、引言二、实现细节(一)、MBConv block(二)、Transformer block(三)、Comparing MBConv and Transformer blocks(四)、MOAT block(五)、Macro-level network design三、实验部分(一)、ImageN…

传奇GOM引擎登录器配置教程

登录器教程大分类目录引导说明 &#xff08;01&#xff09;&#xff1a; 解压配置器文件包后&#xff0c;打开KEY文件夹然后选择KEY &#xff08;02&#xff09;&#xff1a; 战盟官方提供5种不同功能KEY&#xff0c;请打开KEY文件夹里面有载图说明功能&#xff0c;选择你需要…

[附源码]Python计算机毕业设计Django打印助手平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

PG::SunsetDecoy

nmap -Pn -p- -T4 --min-rate1000 192.168.133.85 nmap -Pn -p 22,80 -sCV 192.168.133.85 查看80端口的页面&#xff0c;是一个压缩包 下载压缩包后尝试打开&#xff0c;需要密码&#xff0c;所以直接尝试爆破 得到解压密码 manuel 在/etc/shadow中找到了可以利用的地方 …

终于成功把家里的灯光换掉了

这个周末做过最有意义的事情莫过于把家里的客厅和餐厅的两个黄色吊灯都换上白色灯光的了。为什么说最有意义&#xff0c;因为这件事我已经拖了一年多了&#xff0c;这个黄色的灯光我就一直觉得不舒服&#xff0c;想换掉&#xff0c;可是我不会换&#xff0c;也不知道灯要买什么…

内存取证——ABC包

1、获取数据包的镜像信息 2、获取主机名字 3、 列出文件中曾使用的进程信息 题目要求我们去查看管理员的信息 使用命令查找列出有关管理员的信息继续操作(这里发现管理员注册表) 这个文件里存放着管理员的一些基本信息 已发现此的虚拟地址 打开查看 4、获取管理员用户密码

RationalDMIS 2020 轮廓度评价注意事项2021

用偏差算轮廊度值的常用方法 常见的检测设备都使用ISO和美标来评价轮廓,两者有点差异,ISO标准相对美标要更加严格。在评价轮廊度是有只管控形状和管控形状位置两种,用偏差来计算轮廊度的算法不一样。 ASMEY14.5轮廊度计算规律: (1)当最大值和最小值均三0时,轮廓度测定…

报名即将结束!11 大云原生领域开源技术干货一场拿下

距离 12 月 03 日上海站微服务x容器开源开发者 Meetup 活动正式开幕还有不到一周时间&#xff0c;线下席位即将约满。请感兴趣的同学抓紧报名哦&#xff01; 本次活动由阿里云云原生应用平台与飞天 Club 共同打造&#xff0c;整体内容聚焦容器 & 微服务方向。活动将围绕云…

位深度/像素/分辨率/图像大小的计算/帧率/刷新率

有关图像的基本名词解释&#xff1a; 位深度&#xff1a; 在记录数字图像的颜色时&#xff0c;计算机实际上是用每个像素需要的位深度来表示的。黑白二色的图像是数字图像中最简单的一种&#xff0c;它只有黑、白两种颜色&#xff0c;也就是说它的每个像素只有1位颜色&#x…

[附源码]Python计算机毕业设计Django的低碳生活记录网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

MacBook Pro完整卸载及安装激活VMware Fusion13.0.0教程

目录一、MacBook Pro 卸载原有的VMware Fusion二、MacBook Pro下载并安装激活VMware Fusion2.1 下载并安装于Ventura 13.0.1系统2.1.1 下载地址2.1.2 安装2.1.3 激活 VMware Fusion 13.0.0一、MacBook Pro 卸载原有的VMware Fusion 具体操作过程可以详见&#xff1a; mac完整卸…

使用PyTorch实现简单的AlphaZero的算法(3):神经网络架构和自学习

神经网络架构和训练、自学习、棋盘对称性、Playout Cap Randomization&#xff0c;结果可视化 从我们之前的文章中&#xff0c;介绍了蒙特卡洛树搜索 (MCTS) 的工作原理以及如何使用它来获得给定棋盘状态的输出策略。我们也理解神经网络在 MCTS 中的两个主要作用&#xff1b;通…

程序员真的有必要把GC算法好好过一遍,因为它是进大厂必备的

GC算法概述 最早的GC算法可以追溯到20世纪60年代&#xff0c;但到目前为止&#xff0c;GC的基本算法没有太多的创新&#xff0c;可以分为复制算法&#xff08;Copying GC&#xff09;、标记清除&#xff08;MarkSweep GC&#xff09;和标记压缩&#xff08;Mark-Compact GC&am…

pte学习_SQL注入1

一、phpstudy使用及mysql数据库基础 ①进入mysql安装路径的/bin中打开cmd mysql -u root -p //登录MYSQL数据库 show databases; // 查看数据库 drop database mysql; //删除mysql数据库 create database pte; //创建pte数据库 use pte; //进入数据库 show tables; //查…

如果把网络原理倒过来看,从无到有,一切都清晰了(上)

长歌吟松风&#xff0c;曲尽河星稀。 前言 我发现绝大数人和我一样对网络原理充满困惑&#xff0c;不是因为不好理解&#xff0c;而是它往往都是直接告诉你它是什么&#xff0c;但它并不告诉你为什么要这样。 而我让离网络最近的一次距离是在一个偶然停电的深夜&#xff0c;周…

实现响应式布局有几种方法

目录 &#x1f53d; 什么是响应式布局 响应式与自适应区别 &#x1f53d; 响应式布局方法总结 响应式布局方法一&#xff1a;CSS3媒体查询 响应式布局方法二&#xff1a;百分比% 响应式布局方法三&#xff1a;vw/vh 响应式布局方法四&#xff1a;rem 响应式布局方法五&…

IPv6进阶:OSPFv3 路由汇总实验配置

实验拓扑 实验需求 R1、R2完成接口IPv6地址的配置&#xff1b;R1、R2按图示运行OSPF。R2的三个Loopback接口并不直接激活OSPFv3&#xff0c;而是以重发布的形式注入&#xff1b;在R1、R2上分别执行OSPF路由汇总&#xff0c;使得双方的路由表中关于对方的Loopback只学习到一条汇…

CANoe-vTESTstudio之State Diagram编辑器(入门介绍)

1. 什么是State Diagram编辑器 Test Diagram编辑器是使用具有各种功能的图形元素对测试用例的测试步骤的测试顺序进行建模。而State Diagram Editor,状态图表编辑器,是针对被测系统基于状态的系统行为,在状态图表编辑器中以图形方式建模,从而可以自动生成要测试的SUT(sys…

代码随想录算法训练营第四十八天| LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III

一、LeetCode198. 打家劫舍 1&#xff1a;题目描述&#xff08;198. 打家劫舍&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的…

移动设备软件开发-广播机制

广播机制 1.广播机制概述 1.1生活中的广播机制 1.显示生活中的广播就比如说村里的大喇叭&#xff0c;车上的收音机接收的广播FM广播&#xff0c;学校里的校园广播都是常见的广播&#xff0c;安卓中的广播和生活中的广播是十分类似的。 1.2广播特点 发送者 多种广播方式实…