Rule Of Three (C Programming)
   HOME

TheInfoList



OR:

The rule of three and rule of five are
rules of thumb In English, the phrase ''rule of thumb'' refers to an approximate method for doing something, based on practical experience rather than theory. This usage of the phrase can be traced back to the 17th century and has been associated with various t ...
in
C++ C++ (pronounced "C plus plus") is a high-level general-purpose programming language created by Danish computer scientist Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". The language has expanded significan ...
for the building of exception-safe code and for formalizing rules on
resource management In organizational studies, resource management is the efficient and effective development of an organization's resources when they are needed. Such resources may include the financial resources, inventory, human skills, production resources, or i ...
. The rules prescribe how the default members of a class should be used to achieve these goals systematically.


Rule of three

The rule of three (also known as ''the law of the big three'' or ''the big three'') is a rule of thumb in
C++ C++ (pronounced "C plus plus") is a high-level general-purpose programming language created by Danish computer scientist Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". The language has expanded significan ...
(prior to
C++11 C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions b ...
) that claims that if a class defines any of the following then it should probably explicitly define all three: * destructor * copy constructor * copy assignment operator These three functions are special member functions. If one of these functions is used without first being declared by the programmer it will be implicitly implemented by the compiler with the following default semantics: * Destructor – call the destructors of all the object's class-type members * Copy constructor – construct all the object's members from the corresponding members of the copy constructor's argument, calling the copy constructors of the object's class-type members, and doing a plain assignment of all non-class type (e.g., ''int'' or pointer) data members * Copy assignment operator – assign all the object's members from the corresponding members of the assignment operator's argument, calling the copy assignment operators of the object's class-type members, and doing a plain assignment of all non-class type (e.g. ''int'' or pointer) data members. The ''rule of three'' claims that if one of these had to be defined by the programmer, it means that the compiler-generated version does not fit the needs of the class in one case and it will probably not fit in the other cases either. The term "Rule of three" was coined by Marshall Cline in 1991. An amendment to this rule is that if the class is designed in such a way that resource acquisition is initialization (RAII) is used for all its (nontrivial) members, the destructor may be left undefined (also known as The Law of The Big Two). A ready-to-go example of this approach is the use of smart pointers instead of plain ones. Because implicitly-generated constructors and assignment operators simply copy all class data members (" shallow copy"), one should define explicit copy constructors and copy assignment operators for classes that encapsulate complex data structures or have external references such as pointers, if you need to copy the objects pointed to by the class members. If the default behavior ("shallow copy") is actually the intended one, then an explicit definition, although redundant, will be "
self-documenting code In computer programming, self-documenting (or self-describing) source code and user interfaces follow naming conventions and structured programming conventions that enable use of the system without prior specific knowledge. In web development, s ...
" indicating that it was an intention rather than an oversight. Modern C++ includes a syntax for expressly specifying that a default function is desired without having to type out the function body.


Rule of five

With the advent of
C++11 C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions b ...
the rule of three can be broadened to ''the rule of five'' (also known as "the rule of the big five") as
C++11 C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions b ...
implements '' move semantics'', allowing destination objects to ''grab'' (or ''steal'') data from temporary objects. The following example also shows the new moving members: move constructor and move assignment operator. Consequently, for ''the rule of five'' we have the following ''special members'': * destructor * copy constructor * copy assignment operator * move constructor * move assignment operator Situations exist where classes may need destructors, but cannot sensibly implement copy and move constructors and copy and move assignment operators. This happens, for example, when the base class does not support these latter ''Big Four'' members, but the derived class's constructor allocates memory for its own use. In C++11, this can be simplified by explicitly specifying the five members as default.


See also

*
C++ classes A class in C++ is a user-defined type or data structure declared with keyword class that has data and functions (also called member variables and member functions) as its members whose access is governed by the three access specifiers ''privat ...
*
Class (computer programming) In object-oriented programming, a class is an extensible program-code-template for creating objects, providing initial values for state (member variables) and implementations of behavior (member functions or methods). In many languages, the class n ...


References

{{C++ programming language C++ Computer programming folklore Software engineering folklore Articles with example C++ code