零规则
Version >= C++ 11
我们可以结合五条规则和 RAII 的原则来获得更精简的界面:零规则:任何需要管理的资源都应该是自己的类型。该类型必须遵循五条规则,但该资源的所有用户不需要编写五个特殊成员函数中的任何一个,并且可以简单地知道所有这些函数。
使用 Rule of Three 示例中介绍的 Person
类,我们可以为 cstrings
创建资源管理对象:
class cstring {
private:
char* p;
public:
~cstring() { delete [] p; }
cstring(cstring const& );
cstring(cstring&& );
cstring& operator=(cstring const& );
cstring& operator=(cstring&& );
/* other members as appropriate */
};
一旦这是分开的,我们的 Person
类变得更加简单:
class Person {
cstring name;
int arg;
public:
~Person() = default;
Person(Person const& ) = default;
Person(Person&& ) = default;
Person& operator=(Person const& ) = default;
Person& operator=(Person&& ) = default;
/* other members as appropriate */
};
Person
中的特殊成员甚至不需要明确声明; 根据 Person
的内容,编译器将默认或删除它们。因此,以下也是零规则的一个例子。
struct Person {
cstring name;
int arg;
};
如果 cstring
是一个仅移动类型,使用 delete
d 复制构造函数/赋值运算符,则 Person
也将自动移动。