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
Download

Aula 06 (Sobrecarga de operadores)