programa ção orientada a objetos em...
TRANSCRIPT
ProgramaProgramaçção ão
Orientada a Objetos Orientada a Objetos
em C++em C++
Leandro ToniettoEstruturas de Dados em C++
[email protected]://www.inf.unisinos.br/~ltonietto
ago-10
24-ago-10 Leandro Tonietto 3
Resumo sobre Orientação a objetos
Perceber o mundo como objetos. Tudo no mundo são objetos: � o aluno Fulano de Tal é um objeto, o aluno Beltrano também é
um objeto. O veículo de placas ABC-1234 é um objeto, assim como o veículo XYZ-6789.
� Classes são a descrição de um (ou tipo para) grupo de objetos com as mesmas propriedades e comportamentos. • Elas descrevem o que os objetos contém de atributos e como é o comportamento dos mesmos
• Exemplos: aluno, veículo, professor, funcionário, disciplina, ...� Objetos são ocorrências especificas de uma determinada classe
de objetos; assim como o aluno Fulano de Tal ou o veículo ABC-1234.
24-ago-10 Leandro Tonietto 4
Resumo sobre Orientação a objetos
Importante: � classes descrevem quais (e de que tipo) são os atributos (campos,
propriedades ou características) de tipo de objeto. Já o objeto mantém (possui e da manutenção) sobre os seus próprios dados.
� Todos alunos possuem a propriedade, porém cada um tem o seu. Então se diz que a classe declarou ou descreveu o atributo nome e cada objeto (ocorrência) da classe guarda um nome em memória.
� Todo objeto é responsável por encapsular os seus dados. Portanto, apenas ele pode interferir no estado das suas variáveis. Mais uma vez: a classe descreve como os objetos devem fazer a manutenção e cada objeto faz a manutenção (em tempo de execução) sobre os seus atributos ou dados.
24-ago-10 Leandro Tonietto 5
Resumo sobre Orientação a objetos
Sistemas orientados a objetos:� Objetos não existem sozinhos, eles interagem com outros objetos, formando um sistema.
� A interação entre objetos é feita através da invocação (chamada) de métodos de um objeto por outro.• Em outras palavras, um objeto que necessite interagir com outro precisa referenciar o outro objeto e invocar os seus métodos para que estes realizem algum processamento e/ou retornem alguma informação.
24-ago-10 Leandro Tonietto 6
Resumo sobre Orientação a objetos
Exemplo de classes:
Pessoa
nome
idade
endereço
peso
andar(distância)
falar()
comer(comida)
Classe
métodos
atributos
Disciplina
nome
Professor
Horário
Curso
definirProf(prof)
definirHorario(h)
encerrar()
iniciarAtivid()
Classe
métodos
atributos
24-ago-10 Leandro Tonietto 7
Resumo sobre Orientação a objetos
Exemplo de interação entre objetos (sistema):SistemaTurma
Disciplina d
Aluno alunos[25]
main()
Disciplina
nome
Professor
Horário
Curso
definirProf(prof)
definirHorario(h)
encerrar()
iniciarAtivid()
main(){
Disciplina d;
//...
int horario;
cin >> horario;
d.definirHorario(horario);
//...
}
24-ago-10 Leandro Tonietto 8
Resumo sobre Orientação a objetos
Exercícios de modelagem: � Modelar a classe ContaBancaria, que tem um correntista e o saldo da conta. As operações possíveis para objetos desta classe são: retirar(valor), depositar(valor) e obterSaldo().
� Modelar a classe SistemaBancario para criar objeto de ContaBancaria e realizar as operações possíveis, de acordo com a escolha do usuário.
Depois da modelagem faremos a programação das classes.
24-ago-10 Leandro Tonietto 9
Resumo sobre Orientação a objetos
Exercícios de modelagem (inclusive na UML):
Agora implementar as classes, inclusive fazer leitura dos dados do correntista e das opções de operações no cpp do main.
24-ago-10 Leandro Tonietto 10
Codificando classes em C++
Um sistema orientado a objetos possui:� Arquivo principal .cpp (main)
� Para cada classe que participa do sistema:• Arquivo de cabeçalho com declaração de atributos e métodos (.h)
• Arquivo de implementação de métodos (.cpp)
24-ago-10 Leandro Tonietto 11
Codificando classes em C++
Para cada definição de classe� Por definição de classe entende-se a modelagem (ou quadro) que descreve o tipo de objeto.
� Primeiro criar o arquivo header (.h) exatamente como descrito na especificação
� Depois fazer a implementação da lógica de negócios de cada método declarado no header dentro do arquivo de implementação (.cpp)
24-ago-10 Leandro Tonietto 12
Codificando classes em C++
Sintaxe para escrever uma classe (.h):// inclusão de headers de arquivos e bibliotecas#include <iostream> // incluir uma biblioteca#include “header.h” // incluir um arquivo .h#define NUM_MAX 100;class NomeDaClasse {
public:// seção de atributos e métodos públicos // e construtores e destrutores da classeNomeDaClasse(); // construtor padrãoNomeDaClasse(int p); // construtor alternativo~NomeDaClasse(); // destrutor começa com “~”void andar(int distancia);int getPosicao();
protected:// seção de atributos e métodos protegidosint posicaoInicial;
private:// seção de atributos e métodos privadoschar * nome;
};
24-ago-10 Leandro Tonietto 13
Codificando classes em C++
Observações sobre o arquivo de cabeçalho:� É um “espelho” da definição da classe� Possui todas as declarações de atributos e métodos� Somente assinatura dos métodos� Definição da visibilidade dos atributos e métodos.� Por padrão comece pelos métodos e atributos públicos, depois protegidos e finalmente os privados
24-ago-10 Leandro Tonietto 14
Codificando classes em C++
Sintaxe para escrever uma classe (.cpp):// inclusão do header da classe e bibliotecas#include “NomeDaClasse.h”// para cada método declarado no .h deve ser feita uma implementação:
// construtor padrãoNomeDaClasse::NomeDaClasse(){
posicao = 0;}// construtor alternativo, onde um valor pode ser passadoNomeDaClasse::NomeDaClasse(int p){
posicao = p;}// destrutor da classeNomeDaClasse::~NomeDaClasse(){}
// demais métodos. Note que os métodos sempre// possuem tipo de retorno, mesmo que void.void NomeDaClasse::andar(int distancia){
posicao += distancia;}// método com algum tipo de retorno não void deve ter “return”int NomeDaClasse::getPosicao(){
return posicao;}
24-ago-10 Leandro Tonietto 15
Codificando classes em C++
Observações sobre o arquivo de implementação:� Deve-se implementar todos os métodos assinados no .h� Deve incluir o header da classe
• #include “NomeDaClasse.h”
� Sempre deve determinar de qual classe está sendo implementado o método• NomeDaClass::nomeDoMetodo()
� Sempre respeitar a assinatura do método no .h• Mesmo nome de método• Mesmo tipo de retorno• Mesmo número e tipo de parâmetros
24-ago-10 Leandro Tonietto 16
Etapas de desenvolvimento de um sistema
1. Compreender o problema2. Modelagem das classes3. Criar classes, UMA POR VEZ
a) Criar .H - copiando a definição da modelagemb) Criar .CPP - implementação dos métodos do .Hc) Todos os métodos assinados no .h DEVEM ser implementados no .CPPd) A assinatura do método no .CPP é igual a do .H apenas com
"NomeClasse::" antes do nome do método
4. Exemplo: a) no .H - void retirada(double valor);
b) no .CPP - void ContaBancaria::retirada(double valor){...}
Ver no próximo slide o que éesperado para “implementação”
Por exemplo, no caso do exercício da ContaBancaria e SistemaBancario, teríamos os seguintes arquivos: ContaBancaria.h, ContaBancaria.cpp e SistemaBancario.cpp (este é o que contém o main)
24-ago-10 Leandro Tonietto 17
Etapas de desenvolvimento de um sistema
Para implementação o ideal seria:1. Fazer o fluxograma do algoritmo (um para cada método)2. Traduzir os comandos/instruções do fluxograma para
instruções na linguagem de programação.
Inicio retirada(valor)
saldo -= valorvalor < 0.0? valor > saldo?
Fim retirada
S S
N N
24-ago-10 Leandro Tonietto 18
Etapas de desenvolvimento de um sistema
Por implementação, o ideal seria:1. Fazer o fluxograma do algoritmo (um para cada método)2. Traduzir os comandos/instruções do fluxograma para
instruções na linguagem de programação.
void ContaBancaria::retirar(double valor){
if(valor < 0.0)
return;
if(valor > saldo)
return;
saldo -= valor;
}
24-ago-10 Leandro Tonietto 19
Etapas de desenvolvimento de um sistema
Associação entre objetos:� A associação entre objetos de classes diferentes ocorre através
da declaração de um objeto de outra classe e da invocação de métodos deste objeto.
� Por exemplo:
24-ago-10 Leandro Tonietto 20
Etapas de desenvolvimento de um sistema
Associação entre objetos (Contato.h):class Contato {
public:
Contato();
~Contato();
void setNome(char *n);
char* getNome();
void setEMail(char *n);
char* getEMail();
private:
char *nome;
char *email;
};
24-ago-10 Leandro Tonietto 21
Etapas de desenvolvimento de um sistema
Associação entre objetos (Mail.h):#include “Contato.h”
class Mail {
public:
Mail();
~Mail();
void setRemetente(Contato r);
Contato getRementente();
void addDestinatario(Contato d);
Contato getDestinatario(int indice);
//... Outros métodos
private:
Contato remetente;
Contato destinatarios[10];
};
24-ago-10 Leandro Tonietto 22
Etapas de desenvolvimento de um sistema
Associação entre objetos (Mail.cpp):// ... Outros métodos
// implementação de setRemetente
void Mail::setRemetente(Contato r){
// assim define a associação
remetente = r;
}
// implementação para addDestinatario
void Mail::addDestinatario(Contato d){
// como o objeto mail possui mais um objeto destinario
// deve fazer um método que associe cada uma das referêncas
destinatarios[prox++] = d;
}
// implementação para getDestinario
Contato Mail::getDestinatario(int indice){
return destinatarios[indice];
}
Como exercício, você poderia criar um
main.cpp para criar objetos contato, objetos mail e associar um com o
outro.
24-ago-10 Leandro Tonietto 23
Exercício
Seguindo as etapas de desenvolvimento, implemente o seguinte sistema:� Sistema de turmas, que permite o cadastramento de alunos e
turmas� Todo aluno possui nome e matrícula.� Toda turma possui um array de alunos, um nome de disciplina e
um horário (23, 33, 42, ...).� No sistema de turmas é possível inserir alunos, portanto, o sistema
de turmas possui uma lista completa de alunos. Também épossível criar turmas, então ele também tem lista de turmas.
� No cadastramento da turma é possível informar quais os alunos do Sistema fazem parte da turma. Sugestão: criar o método addAluno(Aluno a) na classe Turma, que serve para adicionar um objeto Aluno na lista de alunos da turma.
24-ago-10 Leandro Tonietto 24
Codificando classes em C++
Herança em C++ (.h):#include <iostream>
#include “Pessoa.h” // incluir .h da classe baseclass Aluno : public Pessoa {
public:// classe derivada de declarar construtores compatíveis// com os da classe-base. o construtor Aluno invocará o // de Pessoa(n). O Pessoa(n) será executado antes do// código interno do Aluno. Normalmente, os// construtores das classes filhas são implementados no// .h, para facilitar a visualização da inicialização
Aluno(char *n, int m):Pessoa(n){
matricula = m;
};
int getMatricula();void imprimir();
private:int matricula;
};
24-ago-10 Leandro Tonietto 25
Codificando classes em C++
Herança em C++ (.cpp):// inclusão de headers de arquivos e bibliotecas#include “Aluno.h” // incluir .h da classeusing namespace std;// para cada método declarado no .h deve ser feita// uma implementação:int Aluno::getMatricula(){
return matricula;}
void Aluno::imprimir(){// invocação de métodos da classe base devem// especificar o nome da classe-base e “::” antes// no nome do método Pessoa::imprimir();
cout << “ – Matr.: “ << matricula;}
24-ago-10 Leandro Tonietto 26
Codificando classes em C++
Instanciação de objetos//em algum lugar do main...
// apenas ponteiro
Pessoa *p;
// apenas ponteiro
Aluno *a;
// instanciação/alocação
p = new Pessoa(“Beltrano”);
// instanciação/alocação
a = new Aluno(“Fulano”, 123);
Pessoa p
Aluno a
new Pessoa:
nome=Beltrano
new Aluno:
matricula=123
new Pessoa alocada pelo new Aluno:
nome = Fulano
Memória
Repare que a instanciação de Pessoa aloca uma área de memória de
tamanho X. Já a alocação de Aluno, aloca uma quantidade X + Y; onde
X é a área ocupada por um objeto Pessoa e Y é a área necessária para
armazenar informação específicas de Aluno. Lembre-se: O Aluno É uma
Pessoa, portanto carrega todas as propriedades de Pessoa também.
24-ago-10 Leandro Tonietto 27
Codificando classes em C++
Exercício 1 – Modelar e programar:� Fazer uma calculadora que executa as operações aritméticas básicas: adição, subtração, multiplicação, divisão e módulo.
� As operações devem ser realizadas sobre número do tipo float.
� O programa deve criar uma calculadora, mostrar um menu das opções de operação, ler uma opção, solicitar o cálculo e imprimir o resultado.
� Comando de leitura:float a;
cin >> a;
24-ago-10 Leandro Tonietto 28
Codificando classes em C++
Exercício 2 – Modelar e programar� Agenda de contatos. O sistema de agenda deve manter uma lista de contatos. � Um contato padrão tem: nome, e-mail, telefone, endereço e data do aniversário. Porém
o contato pode ser enquadrado como de algum tipo específico: geral, cliente ou fornecedor. Para fornecedor, é interessante manter-se um índice de qualidade, pois pode ser necessário ter de escolher 1 entre vários fornecedores de um mesmo produto. Já para o cliente, deve-se atribuir uma data da última compra e uma classificação de fidelidade (ou valores possíveis são: fiel, freqüente, pouco freqüente e apenas uma vez). Por fim, da categoria geral, não é necessário guardar mais nenhum dado além dos do contato.
� O programa da agenda deve manter um menu de opções do programa: incluir contato (acrescenta no array), excluir contato (retirar do array), listar contatos, consulta dados de um contato e sair.
� OBS: • repare que a remoção de um contato do início ou “meio” array implica em mover os posteriores para a frente.
• A inclusão de contatos ocorrente sempre no final do array.• Dica: manter um apontador para o último índice utilizado. Por exemplo, supondo que o array tem capacidade para 20 elementos e apenas cinco contatos foram incluídos, então esta variável deveria estar com valor 4 (array começa com zero...)
24-ago-10 Leandro Tonietto 29
Codificando classes em C++
Polimorfismo� Polimorfismo é a capacidade de assumir formas diferentes.
� Em termos de orientação a objetos, significa que uma mesma operação pode ser definida por diversas classes, cada uma implementando a operação de uma maneira própria.
� Polimorfismo permite que o programador acesse um método de um objeto sem saber exatamente de qual classe específica o método esta sendo acessado
24-ago-10 Leandro Tonietto 30
Codificando classes em C++
Sobreposição (overwriting)� Métodos com a mesma assinatura que são sobrescritos (substituídos). Por exemplo, um método declarado na superclasse, se redefinido na subclasse, é substituído por este em tempo de execução.
Sobrecarga (overloading)� Métodos com mesmo nome em uma classe podem executar operações de maneiras distintas. Isso épermitido pela diferenciação na passagem de parâmetros.
24-ago-10 Leandro Tonietto 31
Codificando classes em C++
Polimorfismo (exemplo de sobrescrita):� A classe Pessoa possui método imprimir() que imprime o nome e o código da pessoa.
� A classe Aluno estende a classe Pessoa e também possui o método imprimir().
� Um objeto é declarado como da classe Pessoa, porém é instanciado como Aluno.Pessoa *pessoa = new Aluno();
pessoa->imprimir();
� Quando o método imprimir() for invocado deste objeto, o interpretador chamará o método da classe Pessoa, porque a variável (objeto) pessoa é do tipo Pessoa. Neste caso, seria necessário fazer um cast explicito de Pessoa para Aluno.
24-ago-10 Leandro Tonietto 32
Codificando classes em C++
Polimorfismo (exemplo de sobrecarga):� Considere uma classe FuncoesMatematicas que possui os métodos menor, maior, arredondar e absoluto.
� Eles possuem variações das suas assinaturas para parâmetros diferentes. Por exemplo, o método menorpode retornar o menor valor entre dois dados do tipo float, double, int ou long. O mesmo vale para as outras funções/métodos.
� Conforme o tipo de parâmetro passado para classe no momento de invocar o método, o interpretador sabe qual é o método mais adequado a ser utilizado.
24-ago-10 Leandro Tonietto 33
Codificando classes em C++
Ainda sobre sobrecarga, considere o código:((Retangulo*)fg)->setLargAlt(0.1f,0.2f);
((Retangulo*)fg)->setLargAlt(10,10);
� Os métodos setLargAlt definem a largura e a altura do retângulo.
� Os dois tem o mesmo nome, mas cada um solicita um tipo de parâmetro, respectivamente, float e int.
� O compilador sabe qual método invocar pelo tipo de dado passado por parâmetro: isto é sobrecarga.
Veja o código ExemploAbstratas para visualizar
os exemplos de sobrescrita e sobrecarga
24-ago-10 Leandro Tonietto 34
Codificando classes em C++
Conversão de tipo (Type casting):� Cast implícito (tipos primitivos apenas):
• Quanto ocorre um down casting por exemplo: long para double, int para double, short para float ou double, byte para float ou double
• Entre objetos também ocorre: Pessoa p = professor;
• Isto é possível porque o Professor é uma Pessoa(herança); caso contrário, da erro;
� Cast explícito:• Situações aonde não é possível o implícito ☺. • Conversão de objetos de classes diferentes. Por exemplo, um objeto Pessoa para Professor. Só é possível para objetos que pertençam a uma mesma hierarquia.
24-ago-10 Leandro Tonietto 35
Codificando classes em C++
Continuação do exemplo:� Importante: o imprimir do professor pode reaproveitar o imprimir da pessoa:void Professor::imprimir(){
// imprime nome e matrícula
Pessoa::imprimir();
cout << “especialidade: “ << especialidade;
}
� Ao executar, considerando os dados fictícios abaixo, será:nome: Fulano de Tal
matrícula: 123456
especialidade: computação gráfica
imprimir() da classe Pessoaimprimir() da classe Professor
24-ago-10 Leandro Tonietto 36
Codificando classes em C++
Classes abstratas� São classes que não possuem implementação em alguns métodos
� Uma classe abstrata obriga que alguma classe filha implemente os métodos abstratos ou virtuais.
� Recurso utilizado quando a classe base não sabe ou não pode implementar um determinada ação, mas éobrigatório que as filhas implementem. Isto é possível porque a classe base (abstrata) sinaliza os métodos que devem ser implementados.
� A palavra é: Polimorfismo!!
24-ago-10 Leandro Tonietto 37
Codificando classes em C++
Classes abstratas� Exemplo:
• Uma classe FormaGeometrica é utilizada para descrever propriedades comuns a todas as classes de formas geométricas (elipses, retângulos, polígonos, triângulos, ...)
• A classe FormaGeometrica não sabe calcular a área de uma forma geométrica desconhecida
• Entretanto, cada das classes das formas geométricas específicas, sabe como é o próprio cálculo de área.
24-ago-10 Leandro Tonietto 38
Codificando classes em C++
Classes abstratas� Exemplo:
Elipse Retangulo
FormaGeometrica
24-ago-10 Leandro Tonietto 39
Codificando classes em C++
Classes abstratas� Exemplo:
FormaGeometrica
int x, y
virtual int calcArea()
Elipse:FormaGeometria
int ladoA, ladoB
int calcArea()
Retangulo:FormaGeometrica
int larg, alt
int calcArea()
Um método virtual não implementação, apenas
a assinatura
Classes derivadas (ou
filhas) devem implementar
os métodos virtuais da
classe base
Veja o código ExemploAbstratas
para visualizar os exemplos de classe abstrata (método virtual)
24-ago-10 Leandro Tonietto 40
Codificando classes em C++
Considere o código:FormaGeometrica *fg = new Retangulo();((Retangulo*)fg)->setLargAlt(0.1f,0.2f);cout << “Área: “ << fg->calcArea();
� Mesmo variável sendo do tipo FormaGeometrica é invocado o calcula área da classe Retangulo.
� Isto porque fg é um ponteiro declarado como FormaGeometrica, mas a instância (memória alocada) é da classe Retangulo. Portanto, os métodos (sobrescritos) utilizados são os da classe Retangulo. Isto ocorre também, porque o método calcArea() é virtual, portanto, não háimplementação nele na classe-base, que é abstrata.
� Porém, repare que os métodos da classe Retangulo que não são sobrescritos devem ser acessados através de um cast (conversão explicita de tipos) para (Retangulo*). No exemplo, setLargAlt só existe na classe Retangulo e não na FormaGeometrica.
� Este tipo de uso de objetos com herança, onde um objeto (ou variável) é declarado como da classe base e instanciado como da classe filha, só pode ser feito com ponteiros.
24-ago-10 Leandro Tonietto 41
Codificando classes em C++
Analisando a relação com a classe Elipse. Código-fonte: headerClass FormaGeometrica {
protected:
int x, y; // posição do objeto
public:
virtual float calcArea() const = 0;
};
24-ago-10 Leandro Tonietto 42
Codificando classes em C++
Analisando a relação com a classe Elipse. Código-fonte: headerClass Elipse : public FormaGeometrica{
private:
int raioA, raioB;
public:
// declaração do método virtual
float calcArea() const;
};
24-ago-10 Leandro Tonietto 43
Codificando classes em C++
Analisando a relação com a classe Elipse. Código-fonte: implementaçãofloat Elipse:: calcArea() const{
return raioA * raioB * PI;
};
24-ago-10 Leandro Tonietto 44
Codificando classes em C++
Friend
� Miniminiza o encapsulamento� São funções ou classes confiáveis
• Podem acessar os dados privados e protegidos de uma classe qualquer
• Aumento do desempenho
� Uso da palavra reservada friend antes do nome da função membro da classe torna a função (método) um método de classe e não do objeto.
� Use com moderação, pois o friend deve ser dado apenas a outras classes com direitos de acesso especiais ao membros da classe e das quais se tem total confiança. • Para estas outras classes, estes membros tornam-se públicos. Cuidado com o encapsulamento!
24-ago-10 Leandro Tonietto 45
Codificando classes em C++
Sobrecarga de operadores� Objetivos:
• Facilitar o trabalho do programador. • Qualidade de código.• Interação entre bibliotecas externas (em especial STL) e classes do sistema. Justamente porque as novas classes não são previamente conhecidas pelas classes antigas.
� Serve para padronizar a forma de manipulação de objetos e tipos primitivos.• Exemplos:
pessoa += 1; // poderia incrementar idade da pessoa
arquivo << mensagem; // gravar mensagem em arquivo
cout << pessoa; // imprimir dados de pessoa
msg = msg + cript; // poderia criptografar msg
// list da STL faz uso da sobrecarga do operador “<”
list<Aluno> lista; ... lista.sort();
24-ago-10 Leandro Tonietto 46
Codificando classes em C++
Sobrecarga de operadores – sintaxe:� O nome da função é operator#, sendo # o operador que estásendo sobrecarregado. Exemplo:• friend char* operator+(char *msg, Cript &crip)
� Em geral utiliza-se funções externas a classe caracterizadas como friends ou funções membro
� Em tempo de compilação, quando o compilador encontra uma definição nova para um operador, ele busca em algum dos arquivos de código-fonte esta nova definição, chamada de sobrecarga do operador. Exemplo:
cout << aluno1;
// o compilador sabe que tem que procurar e procura por:ostream &operator<<(ostream &o){...}
// ou por esta:friend ostream &operator<<(ostream &o, Aluno &a){...}
24-ago-10 Leandro Tonietto 47
Codificando classes em C++
Operadores unários� ! ++ -- new delete
Operadores binários� + - * / % & | ^ = < > ~ += -= *=/= %= ^= &= |= << >> >>= <<= == != <= >= && || ->* -> new[] delete[] []
24-ago-10 Leandro Tonietto 48
Codificando classes em C++
Operadores unários� Função friend
friend <type> operator#(const <class> &)
� Função membro
public: //Na classe
<type> operator#() const
Operadores binários� Função friend
friend const <type> &operator#(<class> &, const <class>&)
� Função membro
public: //Na classe
const <type> &operator#(const <class> &)
24-ago-10 Leandro Tonietto 49
Codificando classes em C++
Como escrever um método operador:� Primeiro, deve-se saber o que necessário fazer. � Por exemplo, deve ser permitido somar uma pessoa com um
inteiro para incrementar a idade de uma pessoa; por algum motivo da lógica do sistema é importante fazer isto.
� Então, se considerarmos a classe Pessoa com o atributo idade:// este código aparece no main, por exemplo
Pessoa fulano(“Fulano de Tal”, 20);
fulano = fulano + 5; // incrementa em 5 a idade
� Para implementar esta sobrecarga ao operador +:// implementação da sobrecarga na classe
friend Pessoa &operator+ (Pessoa &p, int inc){
p.idade += inc;
return p;
}
24-ago-10 Leandro Tonietto 50
Codificando classes em C++
Exemplo:� Classe Cript, que faz criptografia sobre os dados, pode utilizar a operação de soma sobre uma string para criptografá-la
� Então deve indicar ao compilador como se comporta a “soma” de uma string com um objeto Cript:// implementação da sobrecarga na classe
friend char *operator+ (char *msg, Cript &cript){
char *cmsg = new char[strlen(msg)];
encript(msg, cmsg);
return cmsg;
}
� No momento de usar a operação, no main por exemplo:Cript cript;
char *msg = “Top Secret” + cript;
24-ago-10 Leandro Tonietto 51
Codificando classes em C++
Como escrever um método operador:� Sintaxe geral para o operador binário:
� Sintaxe na sobrecarga do operador:
Resultado = 1º operando operador 2º operando
fulano = fulano + 5
friend Pessoa &operator+ (Pessoa &p, int inc)
resultado operador 1º operando 2º operando
O compilador assim, consegue traduzir uma expressão com operadores utilizando objetos criados pelo programador. Repare também, que a ordem dos operandos influencia na tradução da expressão. No caso acima, quando for utilizada, a expressão deve seguir o padrão objeto de pessoa + inteiro.
24-ago-10 Leandro Tonietto 52
Codificando classes em C++
Exemplo:class Pessoa {private:
int idade;char *nome;
public:// indica ao compilador como qual é a função // do operador << para os operandos ostream e da// classe pessoa.friend ostream &operator<<(ostream &s, Pessoa &p){s << “Pessoa: “ << p.nome << “ – “ << p.idade;return s;
}};
24-ago-10 Leandro Tonietto 53
Codificando classes em C++
Exercício 3 - Modelar e implementar� Sistema de cálculo e impressão de informações de
objetos geométricos. O sistema deve permitir a impressão de uma forma geométrica qualquer sem a necessidade de saber antecipadamente de qual tipo específico a forma é. Entretanto, o sistema deve suportar apenas as seguintes formas: retângulo, elipse e triângulo. Todas são formas geométricas, portanto, possuem método de cálculo de área, cálculo do perímetro e impressão dos dados. Dica: aqui deve ser usado o conceito de classe abstrata na modelagem e, em caso de construção deste sistema, use sobrecarga de operadores para impressão dos dados e área das formas geométricas.
24-ago-10 Leandro Tonietto 54
Codificando classes em C++
Exercício 4 - Modelar e implementar� Criar uma classe criptografia que contenha a sobrecarga dos
operadores + e - para, respectivamente, criptografar e descriptografar uma mensagem de texto.
� O algoritmo de criptografia é de livre escolha para o programador. É sugerido o algoritmo de substituição por deslocamento. Por exemplo, para o deslocamento 2, uma letra ‘A’ é cifrada como ‘C’, a ‘L’ como ‘N’, a ‘Z’ como ‘B’, ... Para decifrar, basta diminuir o deslocamento: um ‘C’ volta para ‘A’, ‘B’ volta para ‘Z’,...
� No programa principal ler uma mensagem do usuário e imprimir os resultados das operações de cifrar e decifrar uma mensagem. Exemplo de uso das operações:Criptografia cript;
char *cmsg = “algum texto” + cript;
char *dmsg = cmsg – cript;