【C++复习】C++特殊类总结

文章目录

  • 不能被拷贝
  • 只在堆上创建
  • 只能在栈上创建
  • 不能被继承
  • 饿汉单例 程序启动前就创建好
  • 懒汉单例 需要的时候即调用GetInstance时再创建单例

不能被拷贝

class CopyBan
{public:CopyBan(){}private:// C++98CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);// C++11CopyBan(const CopyBan&) = delete;CopyBan& operator=(const CopyBan&) = delete;
};
  1. 私有:类外无法调用 类外无法定义
  2. 无定义:类内即使调用也无实现

只在堆上创建

析构函数私有化 + 提供销毁接口

class HeapOnly
{public:// 提供接口销毁堆上对象void Destroy(){delete this;}private:// 析构函数私有 导致无法在栈上创建对象~HeapOnly(){cout << "~HeapOnly()" << endl;}
};
int main()
{HeapOnly* hp = new HeapOnly;hp->Destroy();return 0;
}

构造函数私有 + 提供静态成员函数

class HeapOnly
{public:static HeapOnly* CreateObj(){return new HeapOnly;}private:HeapOnly(){}HeapOnly(const HeapOnly&) = delete;HeapOnly& operator=(const HeapOnly&) = delete;
};
int main()
{HeapOnly* hp = HeapOnly::CreateObj();return 0;
}

只能在栈上创建

class StackOnly
{public:static StackOnly CreateObj(){StackOnly obj;return obj;}private:StackOnly(){}
};
int main()
{StackOnly st1 = StackOnly::CreateObj();StackOnly* st2 = new StackOnly(st1);// error 这里仍然可以调用return 0;
}

不能通过禁用拷贝构造,CreateObj()返回栈上的对象是传值返回,需要拷贝构造函数。

在类里面写一个 operator new 并禁掉。使用 new时,默认调的是全局的 new,但是如果我们在类中写一个 operator new,那么当我们 new 一个该类的对象时,会优先调用我们自己写的 operator new,所以我们只需要把自己写的 operator new 禁掉即可。

new = operator new() + 构造函数

class StackOnly
{
public:static StackOnly CreateObj(){StackOnly obj;return obj;}// 实现类专属的 operator newvoid* operator new(size_t size) = delete;
private:StackOnly(){}
};

不能被继承

// C++98
class NonInherit
{public:static NonInherit GetInstance(){return NonInherit();}private:NonInherit(){}
};// C++11
class NonInherit final
{public:NonInherit(){}private:// ...
};

饿汉单例 程序启动前就创建好

程序启动前_inst静态对象就初始化完毕 之后使用该单例时调用GetInstancePtr()即可

class Singleton
{public://static Singleton& GetInstance()//{//    return inst;//}static Singleton* GetInstancePtr(){return &_inst;}private:static Singleton _inst;  // 声明Singleton(){}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 定义
Singleton Singleton::_inst;

指针版本

class Singleton
{
public:static Singleton* GetPtrAtOnly(){return _ponly;}private:static Singleton* _ponly;Singleton() {}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
Singleton* Singleton::_ponly = new Singleton;int main()
{Singleton* instPtr = Singleton::GetPtrAtOnly();return 0;
}

懒汉单例 需要的时候即调用GetInstance时再创建单例

class Singleton
{
public:static Singleton* GetInstance(){// error 线程不安全//if (_inst == nullptr)//{//	_inst = new Singleton;//} ok but 效率低//_ptrmtx.lock();//if (_inst == nullptr)//{//	_inst = new Singleton;//}//_ptrmtx.unlock(); error 相当于没加锁//if (_inst == nullptr)//{//	_ptrmtx.lock();//	_inst = new Singleton;//	_ptrmtx.unlock();//}// okif (_inst == nullptr){_ptrmtx.lock();if (_inst == nullptr){_inst = new Singleton;}_ptrmtx.unlock();}return _inst;}
private:static Singleton* _inst;static mutex _ptrmtx;Singleton(){}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
mutex Singleton::_ptrmtx;
Singleton* Singleton::_inst = nullptr;

C++11后支持这样写且线程安全

// 懒汉
class Singleton
{
public:static Singleton& GetInstance() {static Singleton instance; return instance;}private:Singleton() {}~Singleton() {}Singleton(const Singleton& s) = delete;Singleton& operator=(const Singleton& s) = delete;
};class Singleton2
{
public:static Singleton2* GetPtrAtOnly(){static Singleton2 one;return &one;}private:Singleton2() {}~Singleton2() {}Singleton2(const Singleton2& s) = delete;Singleton2& operator=(const Singleton2& s) = delete;
};int main() 
{Singleton& singletonInstance = Singleton::GetInstance();Singleton2* instPtr = Singleton2::GetPtrAtOnly();return 0;
}

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

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

相关文章

Transformer-LSTM网络的轴承寿命预测,保姆级教程终于来了!

概要 关于轴承寿命预测&#xff0c;网络上的文章、代码层出不穷&#xff0c;但是质量却是令人堪忧&#xff0c;有很多文章甚至存在误导嫌疑。本期代码是在小淘怒肝好几个夜晚整理出来的&#xff0c;本期代码可以帮你迅速掌握一个轴承寿命预测的全过程。 为了不误导我的读者朋…

YOLOv5独家改进:严重遮挡和重叠目标场景解决方案 | 一种新的自适应算法轻量级通道分割和变换(ALSS)模块,自适应特征提取优化策略

💡💡💡本文解决什么问题:红外检测场景存在严重遮挡和重叠目标时的局限性的问题点。 💡💡💡提出了一种新的自适应算法轻量级通道分割和变换(ALSS)模块。该模块采用自适应信道分裂策略优化特征提取,并集成信道变换机制增强信道间的信息交换。这改善了模糊特征的提…

【d48】【Java】【力扣】LCR 123. 图书整理 I

思路 方法1&#xff1a;放进list,将list倒置&#xff0c;利用stream&#xff0c;将list改为int类型 方法2&#xff1a;递归&#xff1a;递归通用思路&#xff1b;明确每一层做什么确定返回值确定什么地方接收下层的返回值 每一层&#xff1a;调用下层&#xff0c;然后把自己…

Oracle AI理论与实践,企业落地篇干货满满

最近也是看到了圈子里的一位DBA好友&#xff0c;领导安排的工作是让负责AI的落地&#xff0c;而且也作为他业绩考核的指标&#xff0c;作为1名15年的DBA老兵来说&#xff0c;让AI落地面临的困难重重。 AI已经逐渐侵入到实际的生活中&#xff0c;最近我也是参加了Oracle官方在中…

【py】计算字母出现次数 字典储存

代码 用于计算用户输入字符串中每个字母字符的出现频率&#xff1a; from collections import Counter def calculate_character_frequency(): # 获取用户输入的字符串 user_input input("请输入一个字符串&#xff1a;") # 将字符串转换为小写…

摄影社团管理系统

基于springbootvue实现的摄影社团管理系统 &#xff08;源码L文ppt&#xff09;4-075 第四章 系统概要设计 4.1系统设计原理 设计原理是指系统的设计来源&#xff0c;它将需求合理地分解为功能&#xff0c;并抽象地描述系统的模块和其下的功能。在功能模块化后&#xff…

DeiT(ICML2021):Data-efficient image Transformer,基于新型蒸馏且数据高效的ViT!

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

KDD2024 时序论文(Time Series)

1、Generative Pretrained Hierarchical Transformer for Time Series Forecasting paper: https://dl.acm.org/doi/abs/10.1145/3637528.3671855 code&#xff1a;GitHub - SiriZhang45/FRNet: Code Implementation of FRNet 2、Fredformer: Frequency Debiased Transforme…

一文教你分不清路由器、交换机、光猫的概念,协助你对路由模组选型

当谈论网络设备时&#xff0c;我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成部分&#xff0c;承担着连接、传输和管理数据的重要任务。在日常生活和工作中&#xff0c;我们几乎离不开它们的存在&#xff0c;无论是在家中上网、办公室内…

Java:日期操作

目录 1、生成20240605180212格式的时间2、Date类型转LocalDate类型3、LocalDate类型基本操作4、格式化日期格式5、String 与 LocalDateTime 之间的转换6、生成指定时间段内的时间列表 1、生成20240605180212格式的时间 String dateTime LocalDateTime.now().format(DateTimeF…

【成品论文】2024年华为杯研究生数学建模A题成品论文

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接获取群聊【2024华为杯研赛资料汇总】&#xff1a;https://qm.q…

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式&#xff08;State Pattern&#xff09; 1、什么时候使用状态模式 2、使用状态模式的…

力扣516-最长回文子序列(Java详细题解)

题目链接&#xff1a;力扣516-最长回文子序列 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每…

接口测试Postman关联,断言,前置,参数化用法

一、Postman下载 我们直接搜索Postman官网下载即可 Postman API Platformhttps://www.postman.com/ 二、使用 下载安装完成后我们需要登录注册&#xff0c;按照Postman的指示进行注册登录&#xff0c;不登陆可能有些功能无法使用 登陆完成我们就可以开始对接口进行测试了 …

C++速通LeetCode中等第27题-二叉树展开为链表(两种迭代法)

迭代法一&#xff1a;额外容器&#xff0c;前序遍历暴力求解&#xff08;空间O(n)) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

Tableau|一入门

一 什么是BI工具 BI 工具即商业智能&#xff08;Business Intelligence&#xff09;工具&#xff0c;是一种用于收集、整理、分析和展示企业数据的软件系统&#xff0c;其主要目的是帮助企业用户更好地理解和利用数据&#xff0c;以支持决策制定。 主要功能&#xff1a; 1.数据…

springboot在线教学平台

基于springbootvue实现的在线教学平台 &#xff08;源码L文ppt&#xff09;4-069 4.1系统结构设计 这些功能可以充分满足在线教学平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。 图4-1功能结构图 4.2系统功能模块设计 在线教学平台的使用者主要有二类…

技术速递|宣布 Azure Container Apps 上的 Java 体验正式推出

作者&#xff1a;Sean Li 排版&#xff1a;Alan Wang Azure Container Apps 是一个完全托管的、无服务器容器平台&#xff0c;使您能够构建、部署和运行容器化应用程序。使用 Azure Container Apps 您可以弹性扩缩容。您可以使用统一的网络设计弹性微服务&#xff0c;并利用启用…

频率增强通道注意力机制(FECAM)学习总结

本文提出了一种新的频率增强通道注意力机制&#xff08;FECAM&#xff09;&#xff0c;旨在解决时间序列预测中傅里叶变换因吉布斯现象导致的高频噪声问题。FECAM基于离散余弦变换&#xff0c;能自适应地模拟信道间的频率依赖性&#xff0c;有效避免预测误差。实验显示&#xf…

赛意SMOM和金蝶云星空接口打通对接实战

赛意SMOM和金蝶云星空接口打通对接实战 对接源平台:赛意SMOM 赛意信息已经发展成为国内企业数字化服务领域最具发展潜力的领军企业之一&#xff0c;聚焦于工业互联网、智能制造、新一代信息技术、数字化转型等领域的技术与商业模式应用&#xff0c;为企业提供高端软件咨询、实施…