0

0

c++的“The Rule of The Big Six”是什么? (C++20资源管理)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-17 14:52:35

|

735人浏览过

|

来源于php中文网

原创

The Rule of The Big Six指C++11起社区对六个关键特殊成员函数的统称:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符;手动定义其一通常需显式定义其余,以避免资源管理错误。

c++的“the rule of the big six”是什么? (c++20资源管理)

什么是 The Rule of The Big Six

“The Rule of The Big Six”不是 C++ 标准里的正式术语,而是社区对 C++11 起(尤其 C++20 强化后)六个关键特殊成员函数的统称:它们共同决定一个类如何管理资源。如果你手动定义了其中任何一个,大概率需要显式定义其余几个,否则容易引发浅拷贝、重复释放、移动后访问野指针等问题。

六个函数分别是什么

它们是:

  • default constructor(默认构造函数)
  • destructor(析构函数)
  • copy constructor(拷贝构造函数)
  • copy assignment operator(拷贝赋值运算符)
  • move constructor(移动构造函数)
  • move assignment operator(移动赋值运算符)

注意:default constructor 有时被替换成 defaulted destructor 或省略——真正核心是后五个。C++20 中,= default= delete 的语义更清晰,编译器对移动操作的隐式生成规则也更严格(比如:只要用户声明了任何拷贝/移动操作,编译器就不再自动生成移动构造/赋值)。

为什么不能只写析构函数就完事

常见错误场景:你写了 ~MyClass()delete 原生指针,但没写移动或拷贝函数:

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

class BadExample {
    int* data;
public:
    BadExample() : data(new int[100]) {}
    ~BadExample() { delete[] data; } // ✅ 析构写了
    // ❌ 没写 copy/move —— 编译器会合成默认的(逐成员复制)
};

后果:

白瓜AI
白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载
  • 拷贝时 data 被浅复制 → 两个对象指向同一块内存 → 双重 delete[]
  • C++11 后,若没声明移动函数,编译器可能不生成移动版本 → 本可移动的场景被迫拷贝(性能损失)
  • C++20 中,一旦你声明了 ~BadExample(),编译器就不再隐式声明移动构造/赋值(即它们变成 deleted),此时 std::vectorpush_back 可能编译失败

实际怎么写才安全

优先用 RAII 容器(如 std::vectorstd::unique_ptr),避免裸指针。如果必须管理原生资源,按需显式定义:

  • 只读/不可拷贝类型 → 删除拷贝,保留移动:BadExample(const BadExample&) = delete;BadExample& operator=(const BadExample&) = delete;
  • 需要值语义(如 std::string)→ 实现深拷贝 + 移动窃取(std::swapnullptr 交换)
  • 想让编译器生成默认行为 → 显式写 = default(尤其移动函数在 C++20 中不会自动合成)

示例(安全且符合 C++20):

class GoodExample {
    std::unique_ptr data;
public:
    GoodExample() : data(std::make_unique(100)) {}
    ~GoodExample() = default; // ✅ unique_ptr 自动清理
// ✅ 默认拷贝/移动都可用(unique_ptr 禁止拷贝、允许移动)
GoodExample(const GoodExample&) = delete;
GoodExample& operator=(const GoodExample&) = delete;
GoodExample(GoodExample&&) = default;
GoodExample& operator=(GoodExample&&) = default;

};

真正麻烦的永远不是“要不要写六个”,而是“你是否意识到某个函数正被隐式删除,而你的容器或算法正依赖它”。C++20 把这种隐式行为收得更紧,反而更容易暴露问题——这不是限制,是提示你该检查资源契约了。

相关专题

更多
string转int
string转int

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

317

2023.08.02

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

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

1465

2023.10.24

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

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

228

2024.02.23

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

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

85

2025.10.17

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

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

524

2023.09.20

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

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

269

2023.11.13

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

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

209

2023.12.29

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.12.07

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

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

精品课程

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

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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