当前位置: 首页 > news >正文

C++-特殊类和单例模式

1.请设计一个类,不能被拷贝

拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可
//该类不能发生拷贝class NonCopy{public:NonCopy(const NonCopy& Nc) = delete;NonCopy& operator=(const NonCopy& Nc) = delete;};

 2.请设计一个类,只能在堆上创建对象

实现方式:
1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。然后提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
2.将类的析构函数私有,然后提供一个公有的Delete函数提供释放资源的功能。
//只能在堆上创建对象class OnlyHeap{public:OnlyHeap():_a(0){}void Delete(){delete this;}private:~OnlyHeap(){}private:int _a;};

 3. 请设计一个类,只能在栈上创建对象

思路:同上将构造函数私有化,然后设计静态方法创建对象返回即可。

//只能在栈上创建对象class OnlyStack{public:static OnlyStack GetInstance(){OnlyStack st;return st;}void* operator new(size_t n) = delete;private:OnlyStack():_a(0){}private:int _a;};

4. 请设计一个类,不能被继承

//该类不能被继承class NonInheritable final{};

 final关键字,final修饰类,表示该类不能被继承。

5.单例模式 

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个
访问它的全局访问点,该实例被所有程序模块共享
单例模式有两种实现模式:
  • 饿汉模式
        就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
// 饿汉模式 -- 一开始(main函数之前)就创建出对象
// 优点:简单、没有线程安全问题 
// 缺点:
// 1、一个程序中,多个单例,并且有先后创建初始化顺序要求时,饿汉无法控制。
// 比如程序两个单例类A 和 B,假设要求A先创建初始化,B再创建初始化。
// 2、饿汉单例类,初始化时任务多,会影响程序启动速度。class MemoryPool{public:static MemoryPool* GetInstance(){return _a;}private:MemoryPool(){}mutex mtx;static MemoryPool* _a;};MemoryPool* MemoryPool::_a = new MemoryPool;
  • 懒汉模式

如果单例对象构造十分耗时或者占用很多资源,这种情况使用懒汉模式(延迟加载)更好。 

/ 懒汉模式:第一次使用对象再创建实例对象
// 优点:
// 1、控制顺序。
// 2、不影响启动速度。// 缺点:
// 1、相对复杂。(线程安全问题)
// 2、线程安全问题要处理好class Singleton{public:static Singleton* GetInstance(){if (_a == nullptr)//提高效率{_mtx.lock();if (_a == nullptr)//保护多线程{_a = new Singleton;}_mtx.unlock();}return _a;}static void Delete(){_mtx.lock();if (_a){delete _a;_a = nullptr;}_mtx.unlock();}class GC{public:~GC(){Delete();}};// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象static GC _gc;private:Singleton(){}private:static mutex _mtx;static Singleton* _a;};Singleton* Singleton::_a = nullptr;mutex Singleton::_mtx;Singleton::GC Singleton::_gc;
}

 

 

 

http://www.lryc.cn/news/236335.html

相关文章:

  • 【开源】基于Vue.js的智能教学资源库系统
  • C语言之qsort()函数的模拟实现
  • 数字化未来:实时云渲染在智慧城市中的创新应用
  • Go语言常用命令详解(二)
  • ChatGPT 从零到一打造私人智能英语学习助手
  • 算法升级之路(七)-盛最多水的容器
  • milvus数据库索引管理
  • JVM中的 -Xms参数 设置 JVM 的初始堆大小
  • Idea 创建 Spring 项目(保姆级)
  • C++多线程学习(一):C++11 多线程快速入门
  • Linux系统之lsof命令的基本使用
  • 性能压力测试的优势与重要性
  • AtCoder Beginner Contest 329 题解A~F
  • Windows网络「SSL错误问题」及解决方案
  • python数据可视化
  • LV.12 D18 中断处理 学习笔记
  • 蓝桥杯每日一题2023.11.19
  • <b><strong>,<i><em>标签的区别
  • c++中的特殊类设计
  • 开源更安全? yum源配置/rpm 什么是SSH?
  • 庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集
  • Java读写Jar
  • 【四元数简述】
  • ClickHouse SQL 查询优化
  • 「Verilog学习笔记」数据选择器实现逻辑电路
  • 【Go入门】Web工作方式
  • 综述:目标检测二十年(机翻版)(未完
  • quinn源码解析:QUIC数据包是如何发送的
  • scss的高级用法——循环
  • Linux安装Chrome浏览器 -linux安装choeme