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


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

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

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

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

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

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

    1. //只能在栈上创建对象
    2. class OnlyStack
    3. {
    4. public:
    5. static OnlyStack GetInstance()
    6. {
    7. OnlyStack st;
    8. return st;
    9. }
    10. void* operator new(size_t n) = delete;
    11. private:
    12. OnlyStack()
    13. :_a(0)
    14. {}
    15. private:
    16. int _a;
    17. };

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

    1. //该类不能被继承
    2. class NonInheritable final
    3. {};

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

    5.单例模式 

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

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

    1. / 懒汉模式:第一次使用对象再创建实例对象
    2. // 优点:
    3. // 1、控制顺序。
    4. // 2、不影响启动速度。
    5. // 缺点:
    6. // 1、相对复杂。(线程安全问题)
    7. // 2、线程安全问题要处理好
    8. class Singleton
    9. {
    10. public:
    11. static Singleton* GetInstance()
    12. {
    13. if (_a == nullptr)//提高效率
    14. {
    15. _mtx.lock();
    16. if (_a == nullptr)//保护多线程
    17. {
    18. _a = new Singleton;
    19. }
    20. _mtx.unlock();
    21. }
    22. return _a;
    23. }
    24. static void Delete()
    25. {
    26. _mtx.lock();
    27. if (_a)
    28. {
    29. delete _a;
    30. _a = nullptr;
    31. }
    32. _mtx.unlock();
    33. }
    34. class GC
    35. {
    36. public:
    37. ~GC()
    38. {
    39. Delete();
    40. }
    41. };
    42. // 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
    43. static GC _gc;
    44. private:
    45. Singleton()
    46. {}
    47. private:
    48. static mutex _mtx;
    49. static Singleton* _a;
    50. };
    51. Singleton* Singleton::_a = nullptr;
    52. mutex Singleton::_mtx;
    53. Singleton::GC Singleton::_gc;
    54. }

     

     

     

  • 相关阅读:
    SpringBoot @GroupSequenceProvider注解实现bean多属性联合校验
    Llama模型家族训练奖励模型Reward Model技术及代码实战(三) 使用 TRL 训练奖励模型
    Zabbix实现对Tomcat的监控
    17届智能车-多车编队寻光测距
    R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的均值和中位数、指定na.rm参数配置删除缺失值
    瑞芯微 | 如何固定以太口地址为指定ip?
    XML小讲
    Word处理控件Aspose.Words功能演示:使用Java合并MS Word文档
    sql server 分区表
    @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解
  • 原文地址:https://blog.csdn.net/m0_72445027/article/details/134494704