C++ 怎么禁止拷贝构造 C++ delete修饰符禁用函数【控制】
发布时间 - 2026-01-29 00:00:00 点击率:次C++11起禁用拷贝构造函数应使用MyClass(const MyClass&) = delete;,需在类内声明且必须同步禁用拷贝赋值operator=,否则逻辑不一致;未声明则编译器可能自动生成,默认行为易导致误用或隐蔽错误。

如何用 delete 禁用拷贝构造函数
直接在类内声明拷贝构造函数并用 = delete 修饰,编译器就会拒绝所有隐式或显式的拷贝操作。这是 C++11 起最标准、最彻底的禁用方式。
-
MyClass(const MyClass&) = delete;必须写在类定义内部(通常放在private或public区均可,但建议public下明确表达设计意图) - 不需要实现体,也不允许实现;一旦声明为
delete,连友元函数都无法调用它 - 如果只禁用拷贝构造但没禁用拷贝赋值,编译器仍会自动生成默认的
operator=—— 这往往导致逻辑不一致,应一并禁用
为什么不能只删掉拷贝构造函数声明
不写拷贝构造函数,不代表它被禁用;编译器会自动生成一个默认的公有拷贝构造函数,只要成员都可拷贝,这个函数就有效。这和“想禁止却忘了禁”是两回事。
- 未声明 + 所有成员可拷贝 → 编译器合成公有拷贝构造函数
- 未声明 + 某个成员不可拷贝(如含
std::mutex)→ 编译失败,但错误位置在使用点而非定义点,排查困难 -
= delete是主动声明“我明确不要”,错误发生在调用处,信息清晰,且能阻止任何误用
禁用拷贝时必须同步处理的函数
禁用拷贝构造函数后,若类还支持移动语义,必须显式定义或删除移动操作,否则可能引发意外行为。
- 拷贝构造和拷贝赋值要成对
= delete:MyClass& operator=(const MyClass&) = delete; - 若类含资源(如指针、文件句柄),又不想支持移动,也应禁用移动构造和移动赋值:
MyClass(MyClass&&) = delete;和MyClass& operator=(MyClass&&) = delete; - 如果不删移动函数,而类又有不可拷贝成员(如
std::unique_ptr),编译器可能因“移动可行”而静默禁用拷贝,但这种依赖推导的行为容易误判,不如显式控制
常见误用:在模板类中错误地使用 delete
模板类里禁用拷贝需注意实例化时机 —— = delete 声明本身会被实例化,但错误只在真正调用时触发。这对 SFINAE 或概念约束场景尤其关键。
- 错误写法:
template—— 合法,但对所有struct Holder { Holder(const Holder&) = delete; }; T都禁用 - 若只想对某些
T禁用(如当T不可拷贝时),不能靠delete条件化,得用static_assert或概念约束 - 更隐蔽的问题:基类模板中
= delete的拷贝构造,在派生类未显式声明拷贝函数时,可能导致派生类对象无法被拷贝,且错误提示指向派生类而非基类
= delete 就完事;它牵扯到移动语义是否开放、资源管理策略是否统一、以及模板实例化时的边界行为。最容易被忽略的是拷贝赋值函数——很多人只删了构造函数,结果对象能赋值却不能初始化,逻辑割裂比完全不禁用还难调试。
# c++
# 为什么
# 构造函数
# const
# 指针
# 类模板
# public
# private
# Struct
# operator
# delete
# 对象
# 自动生成
# 而非
# 派生类
# 的是
# 这是
# 就会
# 也不
# 放在
# 不需要
# 句柄
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Eloquent进行子查询
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel怎么判断请求类型_Laravel Request isMethod用法
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何快速配置高效服务器建站软件?
Laravel如何使用模型观察者?(Observer代码示例)
5种Android数据存储方式汇总
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
nodejs redis 发布订阅机制封装实现方法及实例代码
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
香港服务器WordPress建站指南:SEO优化与高效部署策略
中山网站推广排名,中山信息港登录入口?
昵图网官方站入口 昵图网素材图库官网入口
黑客入侵网站服务器的常见手法有哪些?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
高防服务器租用首荐平台,企业级优惠套餐快速部署
QQ浏览器网页版登录入口 个人中心在线进入
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何选择可靠的免备案建站服务器?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何快速搭建自助建站会员专属系统?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel如何处理CORS跨域请求?(配置示例)
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Python文本处理实践_日志清洗解析【指导】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
如何实现javascript表单验证_正则表达式有哪些实用技巧
详解Android图表 MPAndroidChart折线图
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
网站图片在线制作软件,怎么在图片上做链接?
图册素材网站设计制作软件,图册的导出方式有几种?
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何在IIS中配置站点IP、端口及主机头?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何在橙子建站中快速调整背景颜色?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何快速上传自定义模板至建站之星?
想要更高端的建设网站,这些原则一定要坚持!
如何基于云服务器快速搭建个人网站?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
做企业网站制作流程,企业网站制作基本流程有哪些?

