news 2026/8/6 1:24:29

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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对象管理资源,避免手动管理。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 20:38:37

手把手教会你做接口自动化测试

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、基础知识1.接口测试原理接口测试的原理就是模拟客户端向服务器发送请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答&#xff…

作者头像 李华
网站建设 2026/7/30 7:39:56

PyTorch-CUDA-v2.7镜像支持AMP自动混合精度,训练更高效

PyTorch-CUDA-v2.7镜像支持AMP自动混合精度,训练更高效 在现代深度学习研发中,一个常见的场景是:团队成员刚拿到新的实验任务,兴冲冲地准备复现一篇最新论文。结果第一道坎就卡住了——环境装不上。CUDA 版本和 PyTorch 不匹配、c…

作者头像 李华
网站建设 2026/8/3 13:01:20

2025年AI市场舆情分析榜单:原圈科技凭何脱颖而出?

摘要: 在AI市场舆情分析领域,原圈科技被普遍视为头部代表。相较于其他方案,其在技术能力、垂直行业适配度及服务稳定性等多个维度下表现突出,能深度融合企业公私域数据,驱动业务增长。本文通过对比分析,阐述…

作者头像 李华
网站建设 2026/7/30 7:36:00

Web自动化测试中的接口测试

一、背景 1.程序中的接口 (1)典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端。web客户端的应用有html,JavaScript,ajax&#x…

作者头像 李华
网站建设 2026/7/31 7:00:13

【收藏】大模型已成职场必备!从零入门到实战,轻松提升效率拿高薪

当下,大模型早已不是前沿领域的“小众技术”,而是席卷全行业的职场必备技能。掌握大模型的底层逻辑与微调技术,不仅能让你的工作效率翻倍,更能在薪资谈判和职业晋升中占据绝对优势。无论是解决公司内部流程问题、应对产品咨询&…

作者头像 李华
网站建设 2026/7/31 4:32:12

不止于工具:用系统性思维彻底理解网络安全的核心与边界

一、网络安全概述 1.什么是网络安全 网络安全(Cybersecurity)是指通过技术手段和管理措施保护网络系统、网络设备、网络数据和网络服务免受未经授权的访问、破坏、篡改或泄露的技术领域。随着数字化转型加速,网络安全已成为保障国家安全、企业运营和个人隐私的重要…

作者头像 李华