In the C++ programming language, special member functions are functions which the compiler will automatically generate if they are used, but not declared explicitly by the programmer. The automatically generated special member functions are: Default constructor if no other constructor is explicitly declared. Copy constructor if no move constructor and move assignment operator are explicitly declared. If a destructor is declared generation of a copy constructor is deprecated (C++11, proposal N3242). Move constructor if no copy constructor, copy assignment operator, move assignment operator and destructor are explicitly declared. Copy assignment operator if no move constructor and move assignment operator are explicitly declared. If a destructor is declared, generation of a copy assignment operator is deprecated. Move assignment operator if no copy constructor, copy assignment operator, move constructor and destructor are explicitly declared. Destructor
In these cases the compiler generated versions of these functions perform a memberwise operation. For example, the compiler generated destructor will destroy each sub-object (base class or member) of the object.
The compiler generated functions will be public, non-virtualExcept for the destructor if a base class already has a virtual destructor. and the copy constructor and assignment operators will receive const& parameters (and not be of the alternative legal forms).Similarly, the move constructor/assignment operators will receive && parameters instead of the alternatives.
In C++03, before the introduction of move semantics (in C++11) the special member functions consisted of: Default constructor (if no other constructor is explicitly declared) Copy constructor Copy assignment operator Destructor
Example The following example depicts two classes: Explicit for which all special member functions are explicitly declared and for which none are declared.
import std;
using std::string;
class Explicit { private: string message; public: Explicit() { std::println("Default constructor {}");
explicit Explicit(string message): message{std::move(message)} { std::println("Non-default constructor {}", message);
Explicit(const Explicit& other) { std::println("Copy constructor {}", message); *this = other; // invoke copy assignment operator
Explicit& operator=(const Explicit& other) { std::println("Copy assignment operator {}", message); if (this != &other) { message = other.message;
return *this;
Explicit(Explicit&& other) noexcept { std::println("Move constructor {}", message); *this = std::move(other); // invoke move assignment operator
Explicit& operator=(Explicit&& other) noexcept { std::println("Move assignment operator {}", message); if (this != &other) { message = std::move(other.message);
return *this;
~Explicit() { std::println("Destructor {}", message);
class Implicit : public Explicit { private: Explicit member; public: void spew() { std::println("Implicit({}, {})", message, member.message);
Signatures Here are the signatures of the special member functions:
Function syntax for class X Default constructor X(); Copy constructor X(const X& other); Move constructor X(X&& other); Copy assignment operator X& operator=(const X& other); Move assignment operator X& operator=(X&& other); Destructor ~X();
References