stringtranslate.com

Funciones especiales de los miembros

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:

Si se declara un destructor, la generación de un constructor de copia queda obsoleta ( C++11 , propuesta N3242 [2] ).
Si se declara un destructor, la generación de un operador de asignación de copia queda obsoleta.

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 publicno 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]

Ejemplo

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_ ; };  

Firmas

Aquí están las firmas de las funciones miembro especiales:

C++03

En C++03, antes de la introducción de la semántica de movimiento (en C++11), las funciones miembro especiales [5] eran:

Referencias

  1. ^ ISO/IEC (2011). ISO/IEC 14882:2011 (3.ª ed.). ISO/IEC. págs. §12.
  2. ^ "Hacer cumplir la regla del cero".
  3. ^ Excepto el destructor si una clase base ya tiene un destructor virtual.
  4. ^ De manera similar, los operadores de asignación/constructor de movimiento recibirán &&parámetros en lugar de las alternativas.
  5. ^ ISO/IEC (1998). Norma internacional ISO/IEC 14882: Lenguajes de programación—C++ = Languages ​​de programmation—C++ (1.ª ed.). ISO/IEC. pp. §12. OCLC  71718919.