In theC++programming language,special member functions[1] arefunctions which thecompiler will automatically generate if they are used, but notdeclared explicitly by the programmer.The automatically generated special member functions are:
In these cases the compiler generated versions of these functions perform amemberwise operation. For example, the compiler generated destructor will destroy each sub-object (base class or member) of the object.
The compiler generated functions will bepublic, non-virtual[3] and the copy constructor and assignment operators will receiveconst& parameters (and not be of thealternative legal forms).[4]
The following example depicts two classes:Explicit for which all special member functions are explicitly declared andImplicit for which none are declared.
#include<iostream>#include<string>#include<utility>classExplicit{public:Explicit(){std::cout<<"Default constructor "<<message_<<'\n';}explicitExplicit(std::stringmessage):message_(std::move(message)){std::cout<<"Non-default constructor "<<message_<<'\n';}Explicit(constExplicit&other){std::cout<<"Copy constructor "<<message_<<'\n';*this=other;// invoke copy assignment operator}Explicit&operator=(constExplicit&other){std::cout<<"Copy assignment operator "<<message_<<'\n';if(this!=&other){message_=other.message_;}return*this;}Explicit(Explicit&&other)noexcept{std::cout<<"Move constructor "<<message_<<'\n';*this=std::move(other);// invoke move assignment operator}Explicit&operator=(Explicit&&other)noexcept{std::cout<<"Move assignment operator "<<message_<<'\n';if(this!=&other){message_=std::move(other.message_);}return*this;}~Explicit(){std::cout<<"Destructor "<<message_<<'\n';}private:friendclassImplicit;std::stringmessage_;};classImplicit:publicExplicit{public:voidSpew(){std::cout<<"Implicit("<<message_<<", "<<member_.message_<<")\n";}private:Explicitmember_;};
Here are the signatures of the special member functions:
| Function | syntax for class MyClass |
|---|---|
| Default constructor | MyClass(); |
| Copy constructor | MyClass(const MyClass& other); |
| Move constructor | MyClass(MyClass&& other) noexcept; |
| Copy assignment operator | MyClass& operator=(const MyClass& other); |
| Move assignment operator | MyClass& operator=(MyClass&& other) noexcept; |
| Destructor | virtual ~MyClass(); |
In C++03 before the introduction ofmove semantics (in C++11) the special member functions[5] were:
&& parameters instead of the alternatives.