使用C ++时,三个规则是经验法则。这是一种好的做法,它规定:如果您的班级需要以下任何一项
复制构造函数,
赋值运算符
或破坏者
明确定义,则可能需要全部三个。
为什么是这样?这是因为,如果您的班级需要上述任何一项,则它正在管理动态分配的资源,并且可能需要其他人才能成功实现这一目标。例如,如果您需要赋值运算符,则将创建当前正在通过引用复制的对象的副本,从而分配资源。您将需要使用复制构造函数进行复制,并需要使用析构函数来释放这些资源。
Rule of five is an extension of the rule of three due to the introduction of move semantics in C++11. The rule of five is also applied in C++ for resource management. This rule potentially eliminates memory leaks and other problems in C++ code. The Rule of The Big Five states that if you have to write one of the following functions then you have to have a policy for all of them. If we have an Object Foo then we can have a FooManager that handles the resource Foo. When implementing FooManager, you'll likely all need the following functions to be implemented −
destructor − When this manager goes out of scope it should free all the resources it was managing.
赋值运算符-如果不提供,则编译器将创建默认赋值运算符。默认分配操作是成员级复制功能,并且执行浅表复制而不是深表复制。这可能会导致内存泄漏,分配错误等问题。
复制构造函数-编译器提供的复制构造函数对所有FooManagers属性进行成员复制。这带来了与赋值运算符相同的问题。
移动构造函数-复制对象可能会很昂贵,因为它涉及创建,复制然后销毁临时对象。C ++ 11引入了r值引用的概念。可以将r值引用显式绑定到r值。r值是未命名的对象。换句话说,是一个临时对象。可以在构造函数中使用此r值引用来创建对传递给它的r值的引用
移动构造函数-复制对象可能会很昂贵,因为它涉及创建,复制然后销毁临时对象。C ++ 11引入了r值引用的概念。可以将r值引用显式绑定到r值。r值是未命名的对象。换句话说,是一个临时对象。可以在构造函数中使用此r值引用来创建对传递给它的r值的引用。
移动分配运算符-一次仅拥有一个资源很有用。该资源的所有权可以从一位经理转移到另一位经理。在这种情况下,您可以提供移动分配运算符。
这是了解五个规则的绝佳资源-https: //www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf。