Rule of Three vs Rule of Five in C++?


The Rule of three is a rule of thumb when using C++. This is kind of a good practice rule that says that If your class needs any of

  • a copy constructor,
  • an assignment operator,
  • or a destructor,

defined explicitly, then it is likely to need all three of them.

Why is this? Its because, if your class requires any of the above, it is managing dynamically allocated resources and would likely be needing the other to successfully achieve that. For example, if you require an assignment operator, you would be creating copies of objects currently being copied by reference, hence allocating resources. You'll need the copy constructor for copying and destructor for freeing up these resources.

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.

  • assignment operator − If you do not provide one the compiler creates a default assignment operator. The default assignment operation is a member-wise copy function and does a shallow copy and not a deep copy. This could cause problems like memory leaks, wrong assignment.

  • copy constructor − The compiler-supplied copy constructor does a member-wise copy of all the FooManagers attributes. This poses the same problems as the assignment operator.

  • move constructor − Copying objects can be expensive as it involves creating, copying and then destroying temporary objects. C++11 introduced the concept of the r-value reference. An r-value reference can be explicitly bound to an r-value. An r-value is an unnamed object. A temporary object, in other words. This r-value reference can be used in a constructor to create a reference to the r-value passed to it

  • move constructor − Copying objects can be expensive as it involves creating, copying and then destroying temporary objects. C++11 introduced the concept of the r-value reference. An r-value reference can be explicitly bound to an r-value. An r-value is an unnamed object. A temporary object, in other words. This r-value reference can be used in a constructor to create a reference to the r-value passed to it.

  • move assignment operator − It is useful to only have one resource at a time. This resource's ownership can be transferred from one manager to another. In such cases, you can provide a move assignment operator.

This is a great resource to learn about the rule of five − https://www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf.

Updated on: 24-Jun-2020

371 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements