听过C语言有规则,听过C ++的零规则吗?

本文介绍了C++中的零规则,强调不应为非资源管理类定义特殊函数。通过实例探讨了违反规则的原因和后果,并提出了遵守规则的策略,包括使用模仿类和例外保证。此外,还讨论了如何通过复制和交换实现强大的异常安全保证。
摘要由CSDN通过智能技术生成

你们中的一些人可能已经知道零度规则。你们中的更多人可能听说过3号规则(前C ++ 11)或5号规则。让我们首先回顾一下“零规则”是什么。小编c++学习群825414254获取c++一整套系统性的学习资料还有数十套pdf

什么是零规则?

它背后的想法如下:类不应定义任何特殊函数(复制/移动构造函数/赋值和析构函数),除非它们是专用于资源管理的类。它在描述博客文章。这有几个很好的理由,一个更具概念性,另一个更实用。概念上的原因源于单一责任原则,即一个阶级应该对一件事负责的想法。如果你让一个类负责多个事情,那么你已经将两个独立事物的实现和接口紧密耦合在一起。你的类的工作是协调其成员变量的状态,以提供一些组合状态,以及与该状态的接口。当你编写特殊的成员函数时,你基本上就会收集那些没有以你想要的方式管理资源的成员留下的东西。正确的做法是确保您使用正确的成员。这直接导致了我们的实际原因:在c ++中,一个类不能选择它将重新定义特殊功能的成员。我的意思是什么?好吧,如果你不编写特殊函数,编译器会通过尝试逐个成员地应用预期的操作来为你生成它们。因此,如果使用默认的移动构造函数,编译器将生成一个移动构造函数,它只是尝试移动构造所有数据成员(和基类)。只要编写一个自定义移动构造函数,对一个数据成员进行一些特殊处理,您就必须编写代码来处理其他所有成员,即使您只需要更改一个。毕竟,根据自定义特殊功能,每个变量的一行代码是什么似乎不是什么大问题?真正的问题不是必须编写它,因为编译器不会强制执行它并且很容易忘记。

<span style="color:#555555">class Example {
 public:
  Example(const Example &amp; other) : m_double(other.m_double) { }

 private:
  double m_double = 0.0;
  bool m_bool = false;
};
</span>

您不会在IDE或任何清理程序中收到此警告,因为m_bool将通过其内联初始化确定性地设置为false,并且在构造函数初始化列表中未提及它。但这几乎肯定是一个错误,因为无论何时复制一个Example对象,无论副本的来源如何,新副本都将具有m_bool = false。像这样的东西很容易引入,之后可能很难挖掘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值