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

代码解释(10.20)

template <typename T>
class Singleton{
protected:
    Singleton() = default;
    Singleton(const Singleton<T>&) = delete;
    Singleton& operator = (const Singleton<T>& st) = delete;
}

提供的 Singleton 模板类中,代码的三个部分 Singleton() = default;, Singleton(const Singleton<T>&) = delete;, 和 Singleton& operator = (const Singleton<T>& st) = delete; 分别用于控制类的构造和复制行为。这些设计常用于实现单例模式(Singleton Pattern),确保类在运行时只有一个实例。具体解释如下:

1. Singleton() = default;

  • 作用:这个语句声明了一个默认构造函数,并由编译器生成其默认实现。= default; 语法告诉编译器使用自动生成的构造函数,而不是自己定义的构造函数。

  • 为什么需要:在这个类中,默认构造函数被声明为 protected,意味着外部类无法直接实例化 Singleton 类的对象。这种设计确保了只能通过类的特定接口或方法来创建对象(通常是通过静态成员函数)。同时,= default; 保留了默认构造函数的生成,不需要额外定义构造逻辑。

  • 总结:提供了一个默认的构造函数,但限制了外部调用,通常是为了通过某种单例机制(如静态方法)来控制实例化。

2. Singleton(const Singleton<T>&) = delete;

  • 作用:这个语句删除了拷贝构造函数,使得类的实例无法通过复制另一个 Singleton 对象来创建。也就是说,尝试复制一个 Singleton 对象会导致编译错误。

  • 为什么需要:在单例模式中,要求类只有一个实例,允许拷贝对象可能会导致出现多个实例,这违背了单例模式的原则。通过删除拷贝构造函数,确保了无法通过拷贝的方式创建新对象,维护了单例的唯一性。

  • 总结:禁止通过拷贝构造函数创建对象,确保类的实例唯一性。

3. Singleton& operator = (const Singleton<T>& st) = delete;

  • 作用:这个语句删除了拷贝赋值运算符,使得你不能将一个 Singleton 对象赋值给另一个 Singleton 对象。尝试这样做同样会导致编译错误。

  • 为什么需要:赋值运算符的作用是将一个对象的状态赋给另一个对象,然而在单例模式中,只有一个对象应该存在,赋值操作可能会破坏单例的状态或导致生成新的对象实例。删除赋值运算符确保了实例的不可复制性和唯一性。

  • 总结:禁止通过赋值运算符复制 Singleton 对象,进一步确保类的实例不会被复制。

作用总结

  • Singleton() = default;:保留了默认构造函数(但受保护,外部无法直接调用),允许类内部的控制方式来创建实例。
  • Singleton(const Singleton<T>&) = delete;:删除了拷贝构造函数,防止通过拷贝创建新实例。
  • Singleton& operator = (const Singleton<T>& st) = delete;:删除了拷贝赋值运算符,防止通过赋值来复制对象。

这三部分共同作用,确保 Singleton 类的实例是唯一的,符合单例模式的设计要求。


http://www.kler.cn/news/363894.html

相关文章:

  • 《跟我一起学“Harmony-ArkTS”》——TypeScript基础语法
  • 【数据结构与算法】之队列详解
  • 电子设备老化实验怎么做?
  • 安全见闻(3)——开阔眼界,不做井底之蛙
  • 字符串使用方法:
  • 常见的跨境电商平台对比【总结表】
  • Oracle 第2章:安装与配置Oracle
  • react18中在列表项中如何使用useRef来获取每项的dom对象
  • 博饼代码【Python】
  • WPF MVVM模式实现DataGrid编辑
  • vue2.x 的依赖收集通知更新
  • 【力扣 | SQL题 | 每日4题】力扣1164,3293,1308,1270
  • 【scene_manager_msgs】ROS2 自定义消息、服务的包
  • 动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++
  • OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用
  • 七、高级查询和数据操作及数据完整性和约束
  • 基于Linux来讲解Kconfig的基础知识
  • 【2024版】sql-liabs靶场前十关解题过程和思路----适合入门小白
  • Appium环境搭建全流程(含软件)
  • Java项目-基于springboot框架的社区疫情防控平台系统项目实战(附源码+文档)
  • React 纯手写一个 Modal 组件,除了样式不太美观以外,其他功能都不错呢?附上全部源码
  • vscode ssh连接远程服务器一直卡在正在打开远程
  • linux,socket编程,select,poll,epoll学习
  • MATLAB基础应用精讲-【数模应用】负二项回归(附R语言和python代码实现)
  • OpenCV高级图形用户界面(16)设置一个已经创建的滚动条的最大值函数setTrackbarMax()的使用
  • 【跑酷项目02】实现触发并在前方克隆金币