Sobrecarga de Operadores BCC702 - Programação de Computadores II Emiliana Mara Lopes Simões [email protected] Universidade Federal de Ouro Preto junho 2010 Sobrecarga de Operadores Dificuldade: Tipos definidos pelo programador (classes) não podem ser manipulados com os mesmos operadores que funcionam com os tipos básicos de C++ Exemplo: Você utiliza a adição (+) e a subtração (-) com tipos primitivos como int e float, mas não pode adicionar/subtrair da mesma maneira objetos de classes Sobrecarga de Operadores Exemplo: Definição da classe Ponto, para representar um ponto no espaço bidimensional #include <iostream> using namespace std; class Ponto{ private: int x, y; public: Ponto(); Ponto(int x1, int y1); void print(); }; Arquivo: Ponto.h Sobrecarga de Operadores Exemplo: Definição das funções da classe Ponto #include “Ponto.h” Ponto::Ponto(){ x = 0; y = 0; } Ponto::Ponto(int x1, int y1){ x = x1; y = y1; } void Ponto::print(){ cout << “(” << x << “,” << y << “)” << endl; } Sobrecarga de Operadores Utilizar o operador + para somar dois números inteiros é intuitivo e permitido em C++ int a, b, c; a = b + c; Sobrecarga de Operadores Utilizar o operador + para somar dois números inteiros é intuitivo e permitido em C++ int a, b, c; a = b + c; E se usarmos o operador + para adicionar dois objetos do tipo Ponto (classe Ponto definida pelo usuário)? Ponto p1, p2, p3; p1 = p2 + p3; Sobrecarga de Operadores ERRO: Tipos definidos pelos usuários não podem ser manipulados com os mesmos operadores que funcionam com os tipos primitivos!!! Sobrecarga de Operadores ERRO: Tipos definidos pelos usuários não podem ser manipulados com os mesmos operadores que funcionam com os tipos primitivos!!! Com instâncias de classes e estruturas, o único operador que pode ser utilizado automaticamente e sem nenhuma escrita de código é o operador de atribuição = Sobrecarga de Operadores SOLUÇÃO: Utilizar o recurso de sobrecarga de operadores! Sobrecarregar um operador significa redefinir o seu símbolo, de modo que ele se aplique também a tipos de dados definidos pelo usuário como classes e estruturas Sobrecarga de Operadores A implementação de sobrecarga de operadores é definida por meio de funções operadoras. Elas são criadas como métodos de classes Forma geral: class Nome_classe{ ... tipo_retorno operator simbolo_operador(parametros); }; tipo_retorno Nome_classe::operator simbolo_operador(parametros){ //definição da função } Sobrecarga de Operadores Exemplo: Definição da classe Ponto de tal forma que seja possível somar objetos da classe Ponto da seguinte forma: PONTO A = (5, 1) PONTO B = (2, 3) PONTO C = (7, 4) C = A + B, isto é, C = (xA + xB , yA + yB ) Sobrecarga de Operadores Exemplo: Definição da classe Ponto #include <iostream> using namespace std; class Ponto{ private: int x, y; public: Ponto(); Ponto(int x1, int y1); void print(); Ponto operator +(Ponto p); //função operadora }; Arquivo: Ponto.h Sobrecarga de Operadores Exemplo: Definição das funções da classe Ponto #include “Ponto.h” Ponto::Ponto(){ x = 0; y = 0; } Ponto::Ponto(int x1, int y1){ x = x1; y = y1; } ... Sobrecarga de Operadores void Ponto::print(){ cout << “(” << x << “,” << y << “)” << endl; } Ponto Ponto::operator+(Ponto p){ Ponto aux; aux.x = x + p.x; aux.y = y + p.y; return aux; } Arquivo: Ponto.cpp Sobrecarga de Operadores Exemplo: Manipulando objetos do tipo Ponto no main #include “Ponto.h” void main(){ Ponto A(5, 1), B(2, 3), C; cout<<“A = ”; A.print(); cout<<“B = ”; B.print(); cout<<“C = ”; C.print(); ... Sobrecarga de Operadores ... C = A + B; cout<<“C = A + B = ”; C.print(); system(“pause”); } Saída: A = (5,1) B = (2,3) C = (0,0) C = A + B = (7,4) Sobrecarga de Operadores No exemplo anterior, a instrução C = A + B é equivalente a: C = A.operator+(B); Sobrecarga de Operadores No exemplo anterior, a instrução C = A + B é equivalente a: C = A.operator+(B); IMPORTANTE: Observe que a função é chamada pelo primeiro operando e recebe o segundo operando como argumento Sobrecarga de Operadores EXEMPLO NO QUADRO: Sobrecarga do operador ++ pré-fixado para a classe Ponto Sobrecarga de Operadores EXEMPLO NO QUADRO: Sobrecarga do operador ++ pós-fixado para a classe Ponto Sobrecarga de Operadores Exemplos de operadores definidos por C++ Sobrecarga de Operadores Limitações: Não é possível mudar um operador binário (que trabalhe com dois operandos) para unário (que trabalhe com um único operando) e vice-versa Sobrecarga de Operadores Limitações: Não é possível mudar um operador binário (que trabalhe com dois operandos) para unário (que trabalhe com um único operando) e vice-versa Não é permitido estender a linguagem criando operadores, representados por símbolos novos Sobrecarga de Operadores Limitações: Não é possível mudar um operador binário (que trabalhe com dois operandos) para unário (que trabalhe com um único operando) e vice-versa Não é permitido estender a linguagem criando operadores, representados por símbolos novos Não é possível modificar a precedência de operadores por meio de sobrecargas Sobrecarga de Operadores Limitações: Não é possível mudar um operador binário (que trabalhe com dois operandos) para unário (que trabalhe com um único operando) e vice-versa Não é permitido estender a linguagem criando operadores, representados por símbolos novos Não é possível modificar a precedência de operadores por meio de sobrecargas Nem todos os operadores podem ser sobrecarregados, são eles: o operador de acesso a membro(.), operador de resolução de escopo (::), operador condicional ternário (?:) e sizeof Dúvidas? Próxima Aula Exceções