You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++单例模式中禁用拷贝移动函数代码的逐行作用说明

代码作用总述

这段代码是C++11及更高版本实现单例模式的标准操作,核心目的是从语法层面禁止单例类的拷贝、移动相关行为,避免意外生成额外实例,破坏单例「全局唯一实例」的核心特性。

// Delete copy/move so extra instances can't be created/moved.
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton&&) = delete;

逐行解释

  • 第一行代码Singleton(const Singleton&) = delete;:显式删除拷贝构造函数。C++会为类默认生成隐式的拷贝构造函数,如果不做限制,用户可以通过Singleton new_ins = Singleton::getInstance()的方式直接拷贝得到新的实例,彻底破坏单例的唯一性。使用= delete标记后,任何调用拷贝构造的操作都会直接在编译期报错。
  • 第二行代码Singleton& operator=(const Singleton&) = delete;:显式删除拷贝赋值运算符。和拷贝构造同理,这也是类默认生成的隐式函数,如果保留,两个单例实例之间可以通过赋值操作修改内容,违反单例的设计规则,因此显式删除。
  • 第三行代码Singleton(Singleton&&) = delete;:显式删除移动构造函数。这是C++11新增的语义,默认也会生成隐式实现,如果不删除,用户可以通过Singleton new_ins = std::move(Singleton::getInstance())的方式移动生成新的实例,同样会破坏单例唯一性。
  • 第四行代码Singleton& operator=(Singleton&&) = delete;:显式删除移动赋值运算符。和移动构造同理,禁止通过移动赋值的方式修改单例实例、生成新实例,从语法层面堵死所有违反单例规则的可能性。

补充说明:C++11之前没有= delete语法,旧的单例实现会把上述四个函数声明为private且不提供实现,同样可以达到禁止调用的效果,但= delete的写法更直观,报错时机更早(编译期就会触发,而非链接期),是现在的主流写法。

内容的提问来源于stack exchange,提问作者ganeshredcobra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:54:03