← 模式
零法则
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
成员,而该成员本身是不可拷贝的。但是,它正确地支持移动操作,这会转移动态分配资源的所有权。