零規則
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
也將自動移動。