Rule of Three — if you define any of destructor, copy constructor, copy assignment, define all three.
Rule of Five — add move constructor and move assignment:
1class Buffer {2 char* data;3 size_t size;4public:5 ~Buffer();6 Buffer(const Buffer&);7 Buffer& operator=(const Buffer&);8 Buffer(Buffer&&) noexcept;9 Buffer& operator=(Buffer&&) noexcept;10};
Rule of Zero — prefer classes that don't manage resources directly:
1// Use RAII members instead2class Person {3 std::string name;4 std::vector<int> scores;5 // Compiler-generated special members are correct6};
Best practice: Follow Rule of Zero when possible.