← 模式

零法则

123456789101112131415#include <memory> #include <vector> class foo { private: int x = 10; std::vector<int> v = {1, 2, 3, 4, 5}; }; class bar { public: std::unique_ptr<int> p = std::make_unique<int>(5); };

此模式采用 CC0 公共领域贡献 许可。

要求 c++98 或更新版本。

意图

利用现有类型的值语义,以避免实现自定义的拷贝和移动操作。

描述

零法则 指出,通过使用支持适当拷贝/移动语义的现有类型,我们可以避免编写任何自定义的拷贝/移动构造函数、赋值运算符或析构函数。

例如,第 4-9 行foo 类没有执行任何手动内存管理,但它正确地支持拷贝和移动,且没有任何内存泄漏。默认的拷贝/移动构造函数和赋值运算符将简单地拷贝或移动每个成员。对于 int 类型的 x第 7 行),这会拷贝它的值。对于 v第 8 行),它是一个 std::vector,其所有元素都将被拷贝。

第 11-15 行bar 类默认是不可拷贝的,因为它有一个 std::unique_ptr 成员,而该成员本身是不可拷贝的。但是,它正确地支持移动操作,这会转移动态分配资源的所有权。

贡献者

  • Joseph Mansfield

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享