当前位置: 首页 > 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.zskr.cn/news/175249.html

相关文章:

  • 2025年靠谱太阳能路灯生产厂排行榜,新测评精选太阳能路灯制造厂推荐 - mypinpai
  • yolov11热力图分析:借助PyTorch-CUDA-v2.7定位检测盲区
  • 2025Q4成都财税口碑榜推荐:狼途腾双资质标杆,高性价比+好口碑领跑 - 品牌智鉴榜
  • AI爬虫“外挂“来了!Firecrawl让数据获取像聊天一样简单,大模型开发者必看
  • 2025年立式液压打包机正规厂家推荐:液压打包机靠谱厂家有哪些? - 工业推荐榜
  • 2025/9/4日 每日总结 设计模式实践:抽象工厂模式之人种创建案例解析
  • 【必看收藏】网络安全学习宝典:从入门到精通的十大岗位详解与实战资源包
  • Dockerfile解析:PyTorch-CUDA-v2.7镜像是如何构建的?
  • 智然达智能清洁设备功能多吗?耐用吗?靠谱商用清洁机器人品牌排行榜 - 工业设备
  • PyTorch-CUDA-v2.7镜像助力高校科研团队高效开展AI研究
  • ue 动作 动画学习笔记
  • PyTorch-CUDA-v2.7镜像优化CUDA内存池,减少OOM风险
  • 简单理解:嵌入式寄存器 “精准清零单个位” 的标准写法 —— 既达到目的,又不干扰其他功能,以及为什么不能直接赋值的原因
  • git diff查看修改内容:在PyTorch-CUDA-v2.7环境中进行版本控制
  • 今天是软件需求课的最后一次随堂测试
  • AGV叉车物联网远程监控系统方案
  • 不止于代码-如何用 Trae IDE与Agent重塑软件需求工程
  • 废弃矿山光伏电站远程监控管理系统方案
  • 不知道怎么选上海装修公司?最新业主口碑实测推荐! - 速递信息
  • 【openGauss】如何在openGauss/PostgreSQL手动清理XLOG/WAL 文件?
  • 【权威榜单】微生物实验室装修|设计|建设哪家好,哪个性价比高,知名品牌口碑推荐TOP3 - 品牌推荐大师1
  • 谷歌学术搜索:高效检索学术文献的专业工具与使用指南
  • 想了解上海装修公司十大排名?2025最新实测清单来了 - 速递信息
  • 有哪些可靠的GEO贴牌代理厂家? - 源码云科技
  • 工业互联网平台下冲压工艺仿真的应用与实践
  • 计算机毕业设计springboot基于的高校人事管理系统的设计与实现 高校教职工数字化管理平台的设计与实现——基于SpringBoot框架 面向高校的人力资源信息管理系统构建与研发
  • PyTorch-CUDA-v2.7镜像SSH远程连接教程,支持团队协作开发
  • 如何辨别GEO贴牌代理的真伪? - 源码云科技
  • PyTorch-CUDA-v2.7镜像预装torchvision,支持图像分类开箱即用
  • 计算机毕业设计springboot游泳馆管理系统 基于 SpringBoot 的泳池综合运营平台 智慧泳馆一体化服务系统