= delete和= default
你想弄明白C中 delete和 default这两个语法的区别与用法它们是C11引入的核心特性主要用于精准控制类的特殊成员函数如构造函数、拷贝构造、赋值运算符等。我会用通俗的语言实战示例讲清两者的核心用途、区别和使用场景结合你之前接触的单例模式、类模板等场景加深理解。一、核心定义先立概念语法核心作用通俗理解 default显式要求编译器生成默认版本的特殊成员函数如默认构造、拷贝构造“编译器按你的默认规则帮我生成这个函数” delete显式禁用某个函数让编译器拒绝生成/禁用调用“编译器这个函数我不用禁止任何人调用”二、 default显式生成默认函数1. 为什么需要 defaultC编译器会为类隐式生成默认构造、拷贝构造、赋值运算符、析构函数等特殊成员函数但如果类中自定义了某些函数如带参数的构造函数编译器就会停止生成默认版本。 default可以强制编译器重新生成这些默认函数既保留自定义逻辑又不丢失默认行为。2. 实战示例#includeiostreamusingnamespacestd;classPerson{private:string name;intage;public:// 自定义带参数的构造函数编译器不再生成默认构造Person(string n,inta):name(n),age(a){}// 显式要求编译器生成默认构造函数 defaultPerson()default;// 显式要求编译器生成默认拷贝构造函数Person(constPerson)default;// 显式要求编译器生成默认赋值运算符Personoperator(constPerson)default;// 显式要求编译器生成默认析构函数~Person()default;voidshow(){coutname: name, age: ageendl;}};intmain(){// 调用默认构造函数因 default生效Person p1;p1.show();// 输出name: , age: 0// 调用自定义构造函数Personp2(Tom,18);p2.show();// 输出name: Tom, age: 18// 调用默认拷贝构造函数Person p3p2;p3.show();// 输出name: Tom, age: 18// 调用默认赋值运算符p1p2;p1.show();// 输出name: Tom, age: 18return0;}3. 关键细节 default只能用于编译器可自动生成的特殊成员函数默认构造、拷贝构造、移动构造、赋值运算符、析构函数等不能用于普通函数用 default生成的函数比手动写的“空函数”更高效编译器会优化为原生代码示例中如果不加Person() default;Person p1;会编译报错编译器未生成默认构造。三、 delete显式禁用函数1. 为什么需要 delete用于禁止某些函数的调用或生成最常见场景是禁用拷贝构造/赋值运算符如单例模式保证实例唯一禁用特定类型的函数重载如禁止int隐式转换为double禁用编译器自动生成的特殊成员函数。2. 实战场景1单例模式禁用拷贝/赋值这是你之前接触的场景用 delete保证类实例唯一#includeiostreamusingnamespacestd;classSingleton{private:staticSingleton instance;// 私有构造函数禁止外部创建Singleton(){coutSingleton创建endl;}// 禁用拷贝构造 deleteSingleton(constSingleton)delete;// 禁用赋值运算符 deleteSingletonoperator(constSingleton)delete;public:staticSingletongetInstance(){returninstance;}};Singleton Singleton::instance;intmain(){Singletons1Singleton::getInstance();// 以下代码编译报错因拷贝/赋值被禁用// Singleton s2 s1;// Singleton s3;// s3 s1;return0;}3. 实战场景2禁用特定函数重载#includeiostreamusingnamespacestd;// 函数模板计算两个数的和templatetypenameTTadd(T a,T b){returnab;}// 禁用int版本的add deletetemplateintaddint(inta,intb)delete;intmain(){// 正常调用double版本coutadd(3.14,5.67)endl;// 输出8.81// 编译报错int版本被delete// cout add(1, 2) endl;return0;}4. 关键细节 delete可用于任意函数特殊成员函数、普通函数、模板函数比 default适用范围广被 delete的函数即使声明了也无法调用编译期直接报错C03中禁用拷贝构造的方式是“声明为private且不实现”C11后推荐用 delete更清晰、编译期检测。四、 defaultvs delete核心区别维度 default delete核心目的让编译器生成默认版本的函数让编译器禁用某个函数拒绝生成/调用适用范围仅特殊成员函数编译器可自动生成的任意函数特殊成员、普通函数、模板函数编译行为生成函数代码允许调用拒绝生成函数代码调用时报错典型场景自定义构造后恢复默认构造、优化默认函数单例禁用拷贝、禁止特定类型的函数调用五、常见坑点与最佳实践1. 坑点1误用 default/ delete// 错误普通函数不能用 defaultvoidfunc()default;// 错误析构函数delete后类无法实例化对象销毁时需要析构~Person()delete;Person p;// 编译报错2. 坑点2默认函数的生成规则如果类中自定义了析构函数编译器不再自动生成移动构造/移动赋值如果用 delete禁用了拷贝构造编译器也不会自动生成移动构造建议要么显式用 default指定要么显式用 delete禁用避免依赖编译器的隐式规则。3. 最佳实践单例模式必用 delete禁用拷贝构造和赋值运算符需要默认构造但又自定义了带参构造用 default恢复默认构造禁止隐式类型转换用 delete禁用特定重载如add(int)优化性能对编译器自动生成的函数用 default比手动写空函数高效。总结 default显式要求编译器生成默认版本的特殊成员函数解决“自定义构造后丢失默认函数”的问题且更高效 delete显式禁用函数核心用于单例模式禁用拷贝、禁止特定函数调用是C11后替代“私有不实现”的最佳方式两者都是C11的语法糖核心价值是精准控制类的函数生成规则让代码更清晰、更符合预期记忆口诀default是“要默认”delete是“要禁用”。这两个语法在现代C尤其是嵌入式、高性能开发中非常常用掌握它们能让你写出更规范、更高效的类设计代码。

相关新闻

第二届人工智能赋能数字创意设计国际学术会议(AIEDCD 2026)意大利会场

第二届人工智能赋能数字创意设计国际学术会议(AIEDCD 2026)意大利会场

第二届人工智能赋能数字创意设计国际学术会议 (AIEDCD 2026) 将于2026年3月27-29日在中国北京&意大利召开。会议主要围绕人工智能与数字创意设计等研究领域展开讨论。会议旨在为从事相关研究领域的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&…

2026/7/5 16:21:44 阅读更多 →
在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南 引言:当你的技能成为“硬通货” 在杭州的创意市集上,有位手作匠人从不使用收款二维码。她的顾客用“故事交换”购买作品——讲述一个关于传承的故事,就能带走一件蓝染…

2026/7/5 7:52:03 阅读更多 →
盐酸胍法辛Guanfacine常见副作用管理:镇静作用、低血压与停药反跳现象

盐酸胍法辛Guanfacine常见副作用管理:镇静作用、低血压与停药反跳现象

盐酸胍法辛在治疗ADHD过程中,镇静作用、低血压及停药反跳现象是临床管理的三大挑战。通过分级干预策略与多学科协作,可显著降低不良反应对生活质量的影响。镇静作用:时间优化与行为干预镇静作用是胍法辛最常见的不良反应,发生率超…

2026/7/3 15:10:48 阅读更多 →

最新新闻

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

过去一年,AI行业最显著的变化,是判断AI进展的方式变了。过去一年,AI行业最显著的变化,是判断AI进展的方式变了。 在更长一段时间里,外界习惯用参数规模、榜单排名、融资金额和产品发布节奏来理解AI。但进入2025年后&a…

2026/7/6 14:13:10 阅读更多 →
踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

前言 网上关于C#部署YOLO的教程铺天盖地,但90%都停留在“跑通Demo”的阶段。真正把模型塞进产线、扛住724小时运行、应对各种边缘Case后,你才会发现:能跑和能用之间,隔着一整条护城河。 本文不讲基础环境搭建,只聊我在过去半年工业落地中用血泪换来的8个细节。每一个都是深…

2026/7/6 14:11:07 阅读更多 →
【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

note T2SGrid 的最大贡献在于范式创新:它没有直接设计复杂的时间模块,而是巧妙地借用了视觉大模型原生的空间注意力机制,将时间流转化为空间网格。把视频多帧拼成一张网格图(把视频 clip 拼成网格图),让普…

2026/7/6 14:11:07 阅读更多 →
Auto memory,把 Claude Code 从临时搭档变成项目老同事

Auto memory,把 Claude Code 从临时搭档变成项目老同事

最近在研究 Claude Code 的记忆机制时,我一直觉得 Auto memory 这个功能被低估了。很多人把 Claude Code 当成一个会写代码、能跑命令、能改文件的终端助手,但真正把它和普通聊天式编程助手拉开距离的地方,不只是它能操作代码仓库,而是它可以在一次次会话之间沉淀项目经验。…

2026/7/6 14:09:05 阅读更多 →
多设备传动改造:盖茨工业皮带的工程应用经验复盘

多设备传动改造:盖茨工业皮带的工程应用经验复盘

摘要工厂多类型设备同步开展传动系统技改时,普遍存在工况混杂、传动结构差异化大、原有传动故障根源复杂、改造标准不统一等工程难题。大量现场技改数据统计,85% 以上改造后皮带仍短期失效,并非配件本体性能不足,而是前期故障诊断…

2026/7/6 14:09:05 阅读更多 →
CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

1. 项目概述:当数据安全遇上智能防御 最近在梳理一些前沿的数据安全与网络防御方案时,一个组合技术方案引起了我的注意,那就是“密文策略属性基代理重加密”与“应用层攻击混合检测技术”的结合。这听起来像是一串复杂的技术名词堆砌&#xf…

2026/7/6 14:07:03 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻