In C++, classes and structs are one of the most important parts of modern software development. In modern C++, there are some rules to support the principles of programming, in class definitions there are a few rules to be considered, these are the Rule of Zero, the Rule of Three, the Rule of Five, and the Rule of Six. In this post, we explain all of these rules with examples.
C++ is an Object-Oriented Programming (OOP) language, and OOP is a way to integrate with objects which can contain data in the form (attributes or properties of objects), and code blocks in the form of procedures (methods, functions of objects). Most developers find that using OOP techniques helps them to map real-world behavior and bring an organizational structure to data. These attributes and methods are variables and functions that belong to the class – part of the class’s code and they are generally referred to as class members.
First, let’s refresh our memory about the fact that Resource Acquisition Is Initialization (RAII) in OOP programming, and the Single Responsibility Principle and how that relates to the Rule of Zero in C++.
Table of Contents
What is resource acquisition in C++?
The principle of Resource Acquisition Is Initialization (RAII) term used in several OOP programming languages, which relates to the ability to manage resources, such as memory, through the copy and move constructors, destruction, and assignment operators. RAII is about the declaration and use of destructors, copy-move operators, and memory management in these members and methods. These cause new rules in development.
What is the single responsibility principle in C++?
The Single Responsibility Principle (SRP) is a computer programming principle that states, “A module should be responsible to one, and only one, actor.” This principle exposes a rule for the classes in C++, called Rule of Zero. Now, let’s see what the Rule of Zero in C++ is.
What is the rule of zero in C++?
The Rule of Zero means that, if all members have default member functions, no further work is needed. This is the simplest and cleanest semantics of programming. The compiler provides default implementations for all of the default member functions if there are no special member functions that are user-defined. You should prefer the case where no special member functions need to be defined.
Here is more about Rule of Zero with C++ Examples,
What is the rule of three in C++?
The Rule of Three states that if you need to define a class that has any of the following special member functions a copy constructor, copy assignment operator, or destructor then usually you need to define all these three special member functions. So, these 3 special member functions below should be defined if you have at least one of them defined,
- Copy constructor
- Copy assignment operator
- Destructor
Here is more about Rule of Three with C++ examples,
What is the rule of five in C++?
The Rule of Three is outdated after C++11. C++11 comes with two additional special members of move semantics: the move constructor and the move assignment operator. So, there is another rule, the Rule of Five.
The Rule of Five states that if you need to define any of the five special members below,
- copy constructor,
- copy assignment operator,
- move constructor,
- move assignment operator,
- or a destructor
then you probably need to define or delete (or at least consider) all five of them.
Here is more about Rule of Five with C++ examples,
Actually, this could be called “The Rule of Six“, because the default constructor should be also declared if there is a move constructor, in the Rule of Five it is excluded because it is a special member. Thus, you can add the constructor to this list.
What is the rule of six in C++?
The Rule of Three is outdated after C++11. C++11 comes with two additional special members of move semantics: the move constructor and the move assignment operator. So, there is another rule, the Rule of Six.
The Rule of Six states that if you need to define any of the six special members below,
- constructor
- copy constructor,
- copy assignment operator,
- move constructor,
- move assignment operator,
- or a destructor
then you probably need to define or delete (or at least consider) all six of them.
This rule also known as “The Rule of Five“, because the default constructor is special, and, therefore, sometimes excluded. Note that, when you define copy / move constructor you need to define constructor too, so the constructor needs to be added.
If you have a compiler that is compatible with the C++11 standard or over then if you need to define any of the six (or five) special members as in examples in this post below.
As you see in modern C++ these 6 special members are automatically generated as a default in simple class, if you need to define one of them (excluding constructor) you should define all of them.
C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, MacOS, iOS & Android operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs.
There is a free C++ Builder Community Edition for students, beginners, and startups; it can be downloaded from here. For professional developers, there are Professional, Architect, or Enterprise version.