gleton(const Singleton &) = delete; // 禁止拷贝 Singleton &operator=(const Singleton &) = delete;
时间: 2025-04-08 21:13:08 浏览: 23
### 禁用拷贝构造函数和赋值运算符实现单例模式
在 C++ 中,为了确保某个类只能拥有一个实例并提供全局访问点,可以采用单例模式。这种设计模式的一个重要特性是防止外部代码通过拷贝或赋值的方式创建新的对象副本。
#### 单例模式的核心机制
单例模式的关键在于控制类的实例化过程。这通常通过将构造函数设为私有来阻止外界直接调用它,并通过静态成员函数提供唯一的访问接口[^4]。此外,为了避免意外地复制现有实例,还需要禁用拷贝构造函数和赋值运算符。
#### 使用 `= delete` 的现代方法
从 C++11 起,可以通过显式删除特定的操作(如拷贝构造函数和赋值操作符),从而更清晰地表达意图:
```cpp
class Singleton {
public:
/// 提供获取唯一实例的方法
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
/// 删除拷贝构造函数
Singleton(const Singleton&) = delete;
/// 删除赋值操作符
Singleton& operator=(const Singleton&) = delete;
private:
/// 私有的默认构造函数,防止外部实例化
Singleton() {}
/// 析构函数也可以设置为私有,进一步保护资源释放逻辑
~Singleton() {}
};
```
上述代码片段展示了如何利用 `= delete` 来禁用不必要的功能[^1]。这样做的好处是可以让编译器捕获任何试图执行非法操作的行为,并给出错误提示。
#### 宏定义简化重复工作
对于多个需要应用相同策略的类来说,手动编写相同的两行代码可能会显得冗余。因此引入了一个常用的宏定义形式来减少重复劳动量:
```cpp
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
TypeName& operator=(const TypeName&) = delete;
class AnotherSingleton {
public:
static AnotherSingleton& getInstance() {
static AnotherSingleton instance;
return instance;
}
DISALLOW_COPY_AND_ASSIGN(AnotherSingleton);
private:
AnotherSingleton() {};
~AnotherSingleton() {};
};
```
这里借助预处理指令实现了简洁明了的效果[^3]。注意,在实际项目开发过程中应谨慎使用宏,因为它可能带来维护上的困难以及潜在的风险。
#### 经典方式——声明但不定义
如果目标环境尚未支持 C++11 或更高版本,则可采取另一种传统手段达成同样目的:把这两个特殊成员函数声明成私有属性而不给予具体实现体。如此一来,当尝试触发它们时就会因缺少链接信息而出错。
```cpp
class LegacySingleton {
public:
static LegacySingleton& getInstance() {
static LegacySingleton instance;
return instance;
}
private:
LegacySingleton() {};
// 声明却未定义
LegacySingleton(const LegacySingleton&);
LegacySingleton& operator=(const LegacySingleton&);
~LegacySingleton() {};
};
```
这种方法虽然有效但也稍显笨拙,因为仅仅依靠文档约定去告知开发者哪些部分不可触碰并不够直观[^2]。
### 总结
无论是采用现代化标准下的 `= delete` 还是回退至经典手法,其根本目的在于保障单一实例的存在性的同时杜绝其他途径产生的额外实体干扰程序正常运行流程。选择何种方案取决于所处项目的实际情况与兼容需求等因素考量。
阅读全文
相关推荐



















