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

C++ 中三法则五法则零法则

三法则

C++98/03 年代:如果一个类需要显式定义以下三者之一,那么它很可能需要显式定义所有三个:

析构函数

拷贝构造函数

拷贝赋值运算符

原因:如果一个类需要自定义析构函数,通常是因为它管理着动态内存或其他资源(例如文件句柄、网络连接等)。那么,当进行拷贝时(通过拷贝构造函数或拷贝赋值运算符),如果使用编译器生成的默认拷贝操作,会导致浅拷贝(即只拷贝指针,而不拷贝指针指向的资源),从而可能造成双重释放、内存泄漏等问题。因此,需要自定义拷贝操作来实现深拷贝或适当的资源管理。

classRuleOfThree{char*data;// 动态分配的资源public:RuleOfThree(constchar*str){data=newchar[strlen(str)+1];strcpy(data,str);}// 1. 需要自定义析构函数来释放资源~RuleOfThree(){delete[]data;}// 2. 拷贝构造函数(深拷贝)RuleOfThree(constRuleOfThree&other){data=newchar[strlen(other.data)+1];strcpy(data,other.data);}// 3. 拷贝赋值运算符(深拷贝)RuleOfThree&operator=(constRuleOfThree&other){if(this!=&other){delete[]data;// 释放原有资源data=newchar[strlen(other.data)+1];strcpy(data,other.data);}return*this;}};

五法则

五法则指出:如果一个类需要显式定义拷贝操作、移动操作或析构函数中的任何一个,那么它很可能需要显式定义以下五个:

  1. 析构函数
  2. 拷贝构造函数
  3. 拷贝赋值运算符
  4. 移动构造函数
  5. 移动赋值运算符
    原因:当一个类管理资源时,除了三法则中的三个函数,我们还应该考虑移动操作。通过定义移动操作,我们可以避免不必要的拷贝,提高效率。移动操作将资源从源对象转移到目标对象,同时使源对象处于有效但不可用的状态(通常为空)。
classRuleOfFive{char*data;public:RuleOfFive(constchar*str=""){data=newchar[strlen(str)+1];strcpy(data,str);}// 1. 析构函数~RuleOfFive(){delete[]data;}// 2. 拷贝构造函数RuleOfFive(constRuleOfFive&other){data=newchar[strlen(other.data)+1];strcpy(data,other.data);}// 3. 拷贝赋值运算符RuleOfFive&operator=(constRuleOfFive&other){if(this!=&other){delete[]data;data=newchar[strlen(other.data)+1];strcpy(data,other.data);}return*this;}// 4. 移动构造函数(从临时对象“窃取”资源)RuleOfFive(RuleOfFive&&other)noexcept:data(other.data){other.data=nullptr;// 使源对象处于有效状态(可析构)}// 5. 移动赋值运算符RuleOfFive&operator=(RuleOfFive&&other)noexcept{if(this!=&other){delete[]data;data=other.data;other.data=nullptr;}return*this;}};

零法则

在现代C++中,还有一个重要的原则叫零法则。它建议:让类依赖自动生成的默认操作,而将资源管理委托给专门的资源管理类(如std::string, std::vector, std::unique_ptr等)。这样,我们就不需要自定义析构函数、拷贝/移动操作,编译器生成的默认行为就是正确的。

classRuleOfZero{std::string data;// 使用标准库字符串管理动态内存public:RuleOfZero(conststd::string&str):data(str){}// 不需要定义析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符// 编译器自动生成的版本会正确调用std::string的相应操作。};

总结

三法则:适用于C++98/03,涉及拷贝控制和析构。

五法则:适用于C++11及以后,增加了移动控制。

零法则:现代C++的最佳实践,通过使用RAII对象管理资源,避免手动管理。

在编写类时,应优先考虑零法则,如果必须手动管理资源(例如设计底层资源管理类),则遵循五法则。

http://www.jsqmd.com/news/159915/

相关文章:

  • 2026年求婚钻戒推荐:价值观驱动下的五大选择 - 品牌企业推荐师(官方)
  • yolov11热力图分析:借助PyTorch-CUDA-v2.7定位检测盲区
  • 2025年靠谱太阳能路灯生产厂排行榜,新测评精选太阳能路灯制造厂推荐 - mypinpai
  • 2025Q4成都财税口碑榜推荐:狼途腾双资质标杆,高性价比+好口碑领跑 - 品牌智鉴榜
  • 2025年绞肉机推荐:口碑与实力兼具的品牌,绞肉机厂家找哪家博锐市场认可度高 - 品牌推荐师
  • 6万预算钻戒推荐:2026理性消费新标杆 - 品牌企业推荐师(官方)
  • AI爬虫“外挂“来了!Firecrawl让数据获取像聊天一样简单,大模型开发者必看
  • 软件测试,银行测试到底能不能长期做下去?
  • 2025年立式液压打包机正规厂家推荐:液压打包机靠谱厂家有哪些? - 工业推荐榜
  • GitHub Wiki文档编写:基于PyTorch-CUDA-v2.7生成使用手册
  • 2025/9/4日 每日总结 设计模式实践:抽象工厂模式之人种创建案例解析
  • 2025重庆房屋结构加固公司TOP5推荐:技术、售后双维度测评 - 工业推荐榜
  • 2025/9/18日 每日总结 设计模式实践:抽象工厂模式之人种创建案例解析
  • Cookie Session Token的区别
  • 2025年南京装修公司服务排行榜,新测评精选家装公司推荐 - myqiye
  • ICLR史无前例!中国团队站上C位,全球AI顶会首次为它设专场
  • Dockerfile解析:PyTorch-CUDA-v2.7镜像是如何构建的?
  • SSH隧道转发:安全访问远程PyTorch-CUDA-v2.7开发环境
  • JAVA助力:羽毛球馆自助预约系统源码
  • PyTorch-CUDA-v2.7镜像助力高校科研团队高效开展AI研究
  • 当 Paperzz 开题报告撞上 “无痛毕业”:从熬夜改框架到 10 分钟出 PPT 的降维打击
  • PyTorch-CUDA-v2.7镜像优化CUDA内存池,减少OOM风险
  • ue 动作 动画学习笔记
  • 2025年质量好的防火堵料公司推荐,正规供应商排名与专业解析 - 工业品网
  • 企业上数据管理平台有什么好处
  • 【必藏】2025年CTF完全指南:零基础也能掌握的网络安全实战技巧
  • 简单理解:嵌入式寄存器 “精准清零单个位” 的标准写法 —— 既达到目的,又不干扰其他功能,以及为什么不能直接赋值的原因
  • git diff查看修改内容:在PyTorch-CUDA-v2.7环境中进行版本控制
  • Jupyter Notebook无法启动?试试PyTorch-CUDA-v2.7容器解决方案
  • 无需手动installing CUDA驱动,PyTorch-CUDA-v2.7自动识别GPU