Neste tutorial de nosso curso de C++, vamos aprender como sar uma importantíssima ferramenta da linguagem C++, a sobrecarga de operadores.
A função de um operador
O que faz o operador '+' no comando:
2+2 ?
Moleza. Ele soma, afinal, é o operador de adição.
Errado. Ele não é o operador de adição.
Então, o que é?
Depende do uso!
Por exemplo, com strings:
"C++" + "Progressivo"
Vai resultar na string: "C++ Progressivo"
Ou seja, a função do operador '+' foi de concatenação, ou seja, unir, juntar duas strings em uma só. Veja bem, é concatenar, não faz sentido 'somar texto'. Se soma números, e com números, a função do '+' é de adição matemática.
Ou seja, um operador pode agir de diferentes maneiras, dependendo de como está sendo usado. É chamada sobrecarga.
Para que serve a sobrecarga de Operador
Vamos supor que você é o programador de uma empresa que administra várias bandas, dentre elas tem a banda 'IronMaiden', objeto da classe 'Banda'. Seu sistema também tem a classe "Membro", onde seus objetos são os membros de cada banda.
Vamos supor que o candidato "BruceDickinson" vai ser contratado e o membro "BlazeBayley" vai sair da banda.
Com sobrecarga de operadores, podemos usar o operador '+' na expressão:
IronMaiden = IronMaiden + BruceDickinson
Bem como usar o '-' no comando:
IronMaiden = IronMaiden - BlazeBayley
Olha que curioso: estamos somando um objeto do tipo Banda com um objeto do tipo Membro. Mas, não faz sentido? Um vai entrar e outro vai sair.
Outro exemplo, imagina que você é o programador responsável por uma grande companhia.
Quando contratamos, estamos adicionando alguém, então podemos fazer uma sobrecarga para somar um objeto da classe Funcionario com o objeto da classe Empresa, aí lá no seu código, quando isso ocorre, vai ter mais uma pessoa na folha de pagamento, mais uma pessoa em determinado setor, etc.
E quando demitimos, estamos subtraindo alguém, podemos usar o operador '-' para subtrair um objeto Funcionario do objeto Empresa, então no código, nesses casos, vamos ter que pagar direitos trabalhistas, outro funcionário vai ter que ficar com as funções que o demitido fazia, etc.
Ou seja, fizemos uma sobrecarga de operadores '+' e '-', para terem diferente significados quando fazemos operações com esses objetos. Com a sobrecarga de operadores, você faz o que quiser com os objetos, os operadores farão o que você definir.
Há apenas 4 operadores que não podem ser sobrecarregados:
- .
- .*
- ::
- ?:
Como fazer sobrecarga de operadores em C++
class Point { private: int x, y; public: Point(int a, int b); void getPoint(); };
- Point operator+(Point p);
#include <iostream> using namespace std; class Point { public: int x, y; Point(int a, int b); void getPoint(); Point operator+(Point p); }; Point Point::operator+(Point p) { x=x+p.x; y=y+p.y; return Point(x,y); } Point::Point(int a, int b) { x=a; y=b; } void Point::getPoint() { cout<<"("<<x<<","<<y<<")"<<endl; } int main() { Point p1(1,2), p2(2,3); Point p3 = p1 + p2; p3.getPoint(); return 0; }
Exemplo de Sobrecarga de Operador
#include <iostream> using namespace std; class Point { public: int x, y; Point(int a, int b); Point(); void getPoint(); Point operator+(Point p); void operator=(int n); }; void Point::operator=(int n) { x=n; y=n; } Point Point::operator+(Point p) { x=x+p.x; y=y+p.y; return Point(x,y); } Point::Point() { x=0; y=0; } Point::Point(int a, int b) { x=a; y=b; } void Point::getPoint() { cout<<"("<<x<<","<<y<<")"<<endl; } int main() { Point p1(1,2), p2(2,3); Point p3 = p1 + p2; p3.getPoint(); Point p4; p4=1; p4.getPoint(); return 0; }
Sobrecarga de Operador Relacional
#include <iostream> #include <cmath> using namespace std; class myVector { public: int x, y; myVector(int a, int b); bool operator>(myVector v); }; bool myVector::operator>(myVector v) { float d1, d2; d1=sqrt(x*x + y*y); d2=sqrt(v.x*v.x + v.y*v.y); if(d1>d2) return true; else return false; } myVector::myVector(int a, int b) { x=a; y=b; } int main() { myVector v1(6,8), v2(3,4); if(v1 > v2) cout<<"O vetor ("<<v1.x<<","<<v1.y<<") é maior que ("<<v2.x<<","<<v2.y<<")"<<endl; else cout<<"O vetor ("<<v1.x<<","<<v1.y<<") é menor ou igual a ("<<v2.x<<","<<v2.y<<")"<<endl; return 0; }
Nenhum comentário:
Postar um comentário