programa ção orientada a objetos em...

54
Programa Programa ç ç ão ão Orientada a Objetos Orientada a Objetos em C++ em C++ Leandro Tonietto Estruturas de Dados em C++ [email protected] http://www.inf.unisinos.br/~ltonietto ago-10

Upload: nguyenngoc

Post on 15-Dec-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 2: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

24-ago-10 Leandro Tonietto 2

Sumário

Classes simplesHerançaPolimorfismoClasses abstratasOperadores

Page 3: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 4: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 5: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 6: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 7: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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);

//...

}

Page 8: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 9: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 10: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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)

Page 11: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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)

Page 12: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 13: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 14: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;}

Page 15: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 16: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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)

Page 17: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 18: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

}

Page 19: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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:

Page 20: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 21: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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];

};

Page 22: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 23: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 24: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 25: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;}

Page 26: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 27: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

Page 28: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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...)

Page 29: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 30: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 31: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 32: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 33: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 34: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 35: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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

Page 36: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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!!

Page 37: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 38: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

24-ago-10 Leandro Tonietto 38

Codificando classes em C++

Classes abstratas� Exemplo:

Elipse Retangulo

FormaGeometrica

Page 39: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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)

Page 40: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 41: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 42: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 43: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

};

Page 44: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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!

Page 45: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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();

Page 46: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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){...}

Page 47: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

24-ago-10 Leandro Tonietto 47

Codificando classes em C++

Operadores unários� ! ++ -- new delete

Operadores binários� + - * / % & | ^ = < > ~ += -= *=/= %= ^= &= |= << >> >>= <<= == != <= >= && || ->* -> new[] delete[] []

Page 48: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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> &)

Page 49: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

}

Page 50: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

Page 51: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 52: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;

}};

Page 53: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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.

Page 54: Programa ção Orientada a Objetos em C++professor.unisinos.br/ltonietto/tsi/edc/ProgramacaoOO_CPP.pdf · 24-ago-10 Leandro Tonietto 12 Codificando classes em C++ Sintaxe para escrever

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;