Compartilhar via


Regras gerais para a sobrecarga de operador

As seguintes regras restringir operadores sobrecarregados como são implementados.No entanto, eles não se aplicam para o nova e Excluir operadores, que são abordados separadamente.

  • Você não pode definir novos operadores, como **.

  • Você não pode redefinir o significado dos operadores quando aplicado a tipos de dados internos.

  • Operadores sobrecarregados devem ser uma função de membro não estática de classe ou uma função global.Uma função global que precise acessar membros de classe particular ou protegido deve ser declarada como um amigo dessa classe.Uma função global deve demorar pelo menos um argumento que é de classe ou tipo enumerado ou que é uma referência a uma classe ou tipo enumerado.Por exemplo:

    // 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()
    {
    }
    

    O exemplo de código anterior declara o menor-que o operador como uma função de membro; No entanto, os operadores de adição são declarados como funções globais que têm acesso friend.Observe que pode ser fornecida mais de uma implementação para um determinado operador.No caso do operador de adição anterior, as duas implementações são fornecidas para facilitar a commutativity.Ele é tão provável que operadores que adicionar um Point para um Point, int para um Pointe assim por diante, poderia ser implementado.

  • Operadores de obedecem a precedência, agrupamento e número de operandos ditado pelo seu uso típico com tipos internos.Portanto, não há nenhuma maneira para expressar o conceito "adicionar um objeto do tipo 2 e 3 Point," esperando 2 a ser adicionado ao x 3 e coordene a ser adicionado ao y coordenar.

  • Operadores unários, declarados como funções membro adotarem nenhum argumento; Se a declarado como funções globais, eles usam um argumento.

  • Operadores binários declarados como funções de membro usam um argumento; Se a declarado como funções globais, eles consideram dois argumentos.

  • Se um operador pode ser usado como um unário ou um operador binário (e, *, +, e ), você pode sobrecarregar separadamente cada uso.

  • Operadores sobrecarregados não podem ter argumentos padrão.

  • Todos sobrecarga nos operadores, exceto de atribuição (operator=) são herdadas pelas classes derivadas.

  • O primeiro argumento para operadores sobrecarregada de função de membro é sempre do tipo de classe do objeto para que o operador é chamado (a classe na qual o operador é declarado ou uma classe derivada de classe).Não há conversões são fornecidas para o primeiro argumento.

Observe que o significado de qualquer um dos operadores pode ser alterado completamente.Que inclui o significado de adress-of (e), atribuição (=) e os operadores de chamada de função.Além disso, a identidades que podem ser consideradas para tipos internos podem ser alteradas usando a sobrecarga de operador.Por exemplo, quatro instruções a seguir são normalmente equivalentes quando completamente avaliado:

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

Não confie esta identidade para os tipos de classe sobrecarregar operadores.Além disso, alguns dos requisitos implícitos no uso desses operadores para tipos básicos são relaxadas para operadores sobrecarregados.Por exemplo, o operador de atribuição de adição/ +=, exige que o operando esquerdo para ser um l-value, quando aplicado a tipos básicos; Não há não faz essa exigência quando o operador está sobrecarregado.

ObservaçãoObservação

Para obter consistência, muitas vezes é melhor quando a definição de sobrecarga nos operadores, siga o modelo dos tipos internos.Se a semântica de um operador sobrecarregado difere significativamente seu significado em outros contextos, pode ser mais confusa do que útil.

Consulte também

Referência

Sobrecarga de operador