Reglas generales para la sobrecarga de operadores

Las reglas siguientes restringen cómo se implementan los operadores sobrecargados.Sin embargo, no se aplican a los operadores de nuevo y de cancelación , que se tratan por separado.

  • No puede definir operadores nuevos, por ejemplo **.

  • No puede volver a definir el significado de operadores cuando se aplica a los tipos de datos integrados.

  • Los operadores sobrecargados deben ser una función miembro no estática de clase o función global.Una función global que necesita acceso a privado o miembros de clase protegidos se debe declarar como friend de esa clase.Una función global debe tener al menos un argumento que sea de clase o de tipo enumerado o que sea una referencia a una clase o tipo enumerado.Por ejemplo:

    // rules_for_operator_overloading.cpp
    class Point
    {
    public:
        Point operator<( Point & );  // Declare a member operator 
                                     //  overload.
        // Declare addition operators.
        friend Point operator+( Point&, int );
        friend Point operator+( int, Point& );
    };
    
    int main()
    {
    }
    

    El ejemplo de código anterior declara que operador como función miembro; sin embargo, se declaran los operadores de suma como funciones globales con acceso de confianza.Observe que más de una implementación se pueden proporcionar para un operador determinado.En el caso del operador de suma anterior, las dos implementaciones se proporcionan para facilitar commutativity.También es que los operadores que agregan Point a Point, int a Point, etc., pueden estar implementados probablemente.

  • Los operadores obedecen prioridad, agrupación, y el número de operandos dicta su uso típico con los tipos integrados.Por consiguiente, no hay forma de expresar el concepto “agrega 2 y 3 en un objeto de Pointescrito,” esperando que 2 se agregan a la coordenada X y 3 que se agregarán a la coordenada Y .

  • Los operadores unarios declarados como funciones miembro no toman ningún argumento; si están declarados como funciones globales, toman un argumento.

  • Los operadores binarios declarados como funciones miembro toman un argumento; si están declarados como funciones globales, toman dos argumentos.

  • Si un operador puede utilizarse como un operador unario o operador binario (y, *, +, y -), puede sobrecargar cada uso por separado.

  • los operadores sobrecargados no pueden tener argumentos predeterminados.

  • Las clases derivadas heredan todos los operadores sobrecargados excepto la asignación (operator=).

  • El primer argumento para los operadores sobrecargados miembro siempre es de tipo de clase del objeto para el que se invoca al operador (la clase en la que se declare el operador, o una clase derivada de esa clase).No se proporciona ninguna conversión para el primer argumento.

Observe que el significado de operadores cualquiera de los se puede cambiar por completo.Esto incluye el significado de dirección de (y), de asignación (=), y los operadores de la llamada de función.Además, las identidades que se pueden confirmar sobre para los tipos integrados se pueden cambiar mediante la sobrecarga de operadores.Por ejemplo, las cuatro instrucciones siguientes suelen ser equivalentes cuando se evalúan completamente:

var = var + 1;
var += 1;
var++;
++var;

Esta identidad no se puede confirmar sobre para los tipos de clase que sobrecargar operadores.Además, algunos requisitos implícitos en el uso de estos operadores para tipos básicos son flexibles para los operadores sobrecargados.Por ejemplo, agregar o el operador de asignación, +=, requiere el operando izquierdo es un valor l cuando se aplica a los tipos básicos; no hay este requisito cuando se sobrecarga el operador.

[!NOTA]

Para ofrecer coherencia, a menudo la mejor seguir el modelo de los tipos integrados al definir operadores sobrecargados.Si la semántica de un operador sobrecargado difiere mucho de su significado en otros contextos, puede ser más confusa que útil.

Vea también

Referencia

Sobrecarga de operadores