En el lenguaje de programación C++ , las funciones miembro especiales [1] son funciones que el compilador generará automáticamente si se utilizan, pero no son declaradas explícitamente por el programador. Las funciones miembro especiales generadas automáticamente son:
En estos casos, las versiones de estas funciones generadas por el compilador realizan una operación por miembro . Por ejemplo, el destructor generado por el compilador destruirá cada subobjeto (clase base o miembro) del objeto.
Las funciones generadas por el compilador serán public
no virtuales [3] y el constructor de copias y los operadores de asignación recibirán const&
parámetros (y no tendrán las formas legales alternativas ). [4]
El siguiente ejemplo muestra dos clases: Explícita para la que se declaran explícitamente todas las funciones miembro especiales, e Implícita para la que no se declara ninguna.
#include <iostream> #include <cadena> #include <utilidad> clase Explicit { público : Explicit () { std :: cout << "Constructor predeterminado " << mensaje_ << '\n' ; } explícito Explícito ( std :: string mensaje ) : mensaje_ ( std :: mover ( mensaje ) ) { std :: cout << "Constructor no predeterminado " << mensaje_ << '\n' ; } Explícito ( const Explicit & other ) { std :: cout << "Constructor de copia " << message_ << '\n' ; * this = other ; // invocar operador de asignación de copia } Operador explícito & = ( const Explícito & otro ) { std :: cout << "Operador de asignación de copia " << mensaje_ << '\n' ; if ( this != & otro ) { mensaje_ = otro . mensaje_ ; } return * this ; } Explícito ( Explícito && otro ) noexcept { std :: cout << "Constructor de movimiento " << mensaje_ << '\n' ; * this = std :: move ( otro ); // invocar operador de asignación de movimiento } Operador explícito & = ( Explícito && otro ) noexcept { std :: cout << "Operador de asignación de movimiento " << mensaje_ << '\n' ; if ( this != & otro ) { mensaje_ = std :: move ( otro . mensaje_ ); } return * this ; } ~ Explícito () { std :: cout << "Destructor " << mensaje_ << '\n' ; } privado : clase amiga Implícito ; std :: string mensaje_ ; }; clase Implícito : público Explícito { público : void Spew () { std :: cout << "Imlícito(" << mensaje_ << ", " << miembro_ . mensaje_ << ") \n " ; } privado : Miembro explícito_ ; };
Aquí están las firmas de las funciones miembro especiales:
En C++03, antes de la introducción de la semántica de movimiento (en C++11), las funciones miembro especiales [5] eran:
&&
parámetros en lugar de las alternativas.