0

0

C++中的“三五零法则”是什么?(The Rule of Three/Five/Zero)

冰火之心

冰火之心

发布时间:2025-12-29 21:05:36

|

827人浏览过

|

来源于php中文网

原创

三五零法则是C++资源管理的指导原则:三法则要求自定义析构、拷贝构造、拷贝赋值三者之一时需全部显式定义;五法则在C++11后增加移动构造和移动赋值;零法则推荐委托给标准RAII类型,避免手动管理。

c++中的“三五零法则”是什么?(the rule of three/five/zero)

“三五零法则”是C++中关于类资源管理的一组指导原则,它告诉你在什么情况下需要手动定义哪些特殊成员函数,以确保类的行为正确、安全,尤其在涉及动态内存、文件句柄、互斥锁等资源时。

Rule of Three(三法则)

适用于C++11之前。当类中需要自定义析构函数(~T())、拷贝构造函数(T(const T&))或拷贝赋值运算符(T& operator=(const T&))中的任意一个时,通常三个都需要显式定义。

原因在于:默认生成的拷贝操作是浅拷贝,若类持有裸指针或独占资源,不重写就会导致双重释放、悬空指针或资源泄漏。

  • 写了自定义析构函数 → 说明类管理了资源
  • 有资源 → 拷贝时不能简单复制指针,得深拷贝或明确禁止拷贝
  • 所以拷贝构造和拷贝赋值也必须同步处理,否则行为不一致

Rule of Five(五法则)

C++11引入移动语义后升级为“五法则”。除上述三个外,还需考虑移动构造函数(T(T&&))和移动赋值运算符(T& operator=(T&&))。

立即学习C++免费学习笔记(深入)”;

如果类支持移动(比如内部有std::unique_ptr、动态数组),且你已写了析构/拷贝相关函数,那么移动操作也应明确实现或禁用——否则编译器可能生成默认移动函数,而它们会执行位移(bitwise move),对含裸指针的类依然危险。

法语写作助手
法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

下载
  • 显式定义移动函数,可高效转移资源,避免不必要的拷贝
  • 若类逻辑上不可移动(如绑定到某个硬件句柄),就用= delete禁用
  • 注意:只声明移动函数,编译器将不再生成默认拷贝函数(除非你显式要求)

Rule of Zero(零法则)

现代C++的推荐实践:尽量不写任何特殊成员函数。让类的成员全部使用“符合三五法则”的类型(如std::vectorstd::stringstd::unique_ptr),由它们自己管理资源。

这样编译器自动生成的默认特殊成员函数就是正确的——因为所有成员都已正确实现了移动/拷贝/析构逻辑。

  • 把资源管理封装在专用小类里(RAII类型),业务类只组合它们
  • 零法则不是“什么都不管”,而是“把责任委托给标准库或靠谱的工具类”
  • 例外:需要定制语义(如写日志、验证不变量)时,仍可加少量逻辑,但避免直接操作裸资源

本质上,“三五零”不是硬性规定,而是帮你识别资源管理意图的检查清单。写代码时先问一句:这个类是否拥有并独占某种资源?如果是,就按规则补全;如果否,优先走零法则。

基本上就这些。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1431

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

74

2025.10.17

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

518

2023.09.20

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

19

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

265

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号