Вы находитесь на странице: 1из 257

Programao Orientada para

Objetos com C++


Jos Luiz de Souza Pio
UFMG
Belo Horizonte Minas Gerais
Abril de 2002

Programa
Conceitos Bsicos
Projeto de Programas OO
Linguagem C++
Aplicao

(4 horas)
(12 horas)
(12 horas)
(12 horas)

Introduo
Projeto de Programas

Tcnicas que visam garantir:


Qualidade
Confiabilidade
Clareza
Facilidade

de manuteno

Conceito Fundamental: TAD (Tipo abstrato de Dados)

Introduo
Abstrao de Dados

Programa = modelo para a soluo de um


problema
Abstrao de dados
Representao

abstrata dos dados da aplicao

TAD
Definio

de dados associados as suas operaes

Introduo
Tcnicas

Programao no estruturada
Programao estruturada
Programao modular

Introduo
Programao no estruturada (espaguete)

Introduo
Programao Estruturada

Introduo
Programao Estruturada

Objetivos
Gerar

programas altamente legveis (clareza)


Hierarquia funcional descrita atravs de estruturas de
controle
(If - then else) (while) (for) (do)
O

cdigo produzido deve ser lido seqencialmente em


pequenos segmentos de cdigo

Introduo
Vantagens:

Programa correto desde a sua concepo (!?)


Clareza no cdigo
Menor tempo de depurao
Teste mais fcil

Interessados na metodologia Mtodo de Jackson

Introduo
Programao Modular

Organizao do programa em mdulos


Utilizao de mdulos executveis

Introduo
Como modularizar?

1. Desmembrar o programa, ou mdulo, em um mdulo raiz e um


ou mais submdulos, cujo o conjunto satisfaa especificao do
programa ou mdulo;
2. Definir as interfaces entre o mdulo raiz e os submdulos. Estas
interfaces determinam os dados passados ao ativar, os resultados
retornados e as assertivas de entrada e a sada dos diversos mdulos;
3. Repetir os passos 1 e 2 at obter uma organizao modular
satisfatria;
4.
Empacotar a organizao modular lgica completa, produzindo
uma organizao modular fsica, onde cada mdulo fsico
corresponda a um subprograma bem definido e identificvel.

Introduo
Vantagens da Programao Modular

A possibilidade de desenvolver programas


complexos em equipe
Aumento do grau de paralelismo na produo
Reduo da depurao
Reduo da manuteno
Reutilizao do modulo

Introduo
Problema:

Separao entre dados e procedimentos

Soluo:

Dependncia mtua entre dados e procedimentos

Este o principal aspecto das linguagens que


suportam OO

POO
Orientao para Objetos

A dependncia mtua entre as estruturas de dados


utilizadas em um programa e as operaes que as
acessam. Essa associao inevitvel, por dois motivos:
- S possvel exercer operaes diretas sobre uma
estrutura de dados se conhecermos a forma como ela est
implementada;
- As estruturas de dados so organizadas para que as
operaes realizadas sobre elas sejam implementadas de
forma eficiente.

POO

Operaes

Estrutura de dados

Dependncia Mtua
Como ficam as estruturas de dados globais?

POO
Decomposio
Coloque juntas todas as decises de projeto relacionadas
Decises de Projeto

Estruturas

Operaes

POO
Elemento capaz de:

Agrupar vrias operaes;


Suportar a declarao de ED que no global
nem voltil como uma varivel local.

Objeto = Resultado da unio inseparvel


entre uma ED e todas as operaes
associadas.

POO
O programa decomposto em caractersticas
que so implementadas de acordo com as
mesmas decises de projeto, no mais em
funes desempenhadas.

Objetos e Mtodos
Um objeto composto por um conjunto de
dados privados um conjunto de mtodos
que atuam sobre estes dados.

Objetos e Mtodos
Variveis locais a cada objeto
OBJETO
Dados Privados
Mtodos

Todos os elementos do sistema so


representados por objetos que podem
ser gerados um nmero arbitrrio de
vezes durante a execuo do programa

Mtodos so formados por sua interface e implementao

Mtodos e Objetos
Em um programa, a declarao de um novo objeto
deve ser constituda dos seus dados privados e de
seus mtodos;
Mtodos:

Interface: interface descreve a parte visvel do mtodo,


seu nome, tipos de parmetros, e valor de retorno.
Implementao: implementao contm o cdigo
efetivo para operao, inclusive chamadas a outros
mtodos do objeto.

Mtodos e Objetos
Exemplo
Crculo
X, Y, Raio
CalculaArea
CalculaPerimetro
DesenhaCirculo

Mtodos e Objetos
Como seria a interface do mtodo
CalculaArea?
Como seria sua implementao?

Mtodos e Objetos
Questes

Explique por que existe dependncia mtua entre ED e


operaes.
Que so as decises de projetos?
Qual a necessidade dos dados privados a um objeto?
necessrio conhecer a implementao de um objeto
para utiliza-lo?
Qual a vantagem que diferentes objetos terem mtodos
com nomes iguais?

Mtodos e Objetos
Exerccios

Esboce um objeto para calcular propriedade


geomtricas de retngulos.
Esboce um objeto chamado Mdias, cujo o
objetivo calcular diferentes tipos de mdias
(aritmtica, ponderada, geomtrica, etc).
Projete um objeto chamado disperso, cujo o
objetivo e calcular diferentes tipos de medidas de
disperso.

Classes, Instncias e
Mensagens
Classe: Modelo a partir do qual os objetos
so criados;
Exemplo:
Tom, Garfield, Frajola, Manda-chuva e
Batatinha. So todos da mesma classe: Gatos

Classes, Instncias e
Mensagens
Uma melhor definio:
Classe um agrupamento de objetos que
revelam profundas semelhanas entre si,
tanto no aspecto estrutural quanto no
funcional.

Classes, Instncias e
Mensagens
Uma classe um tipo definido pelo usurio
que contm o molde, a especificao para os
objetos, assim como o tipo inteiro contm o
molde para as variveis declaradas como
inteiros. A classe envolve, associa, mtodos e
dados, controlando o acesso a estes, defini-la
implica em especificar os seus ATRIBUTOS
(dados) e seus SERVIOS (cdigo).

Classes, Instncias e
Mensagens
Uma representao grfica para as classes
Nome da Classe

Caracterstica comum
aos objetos descritos
pela classe

Atributos

Coad & Yourdon

Servios

Alguma operao que pode


ser solicitada pelo objeto

Classes, Instncias e
Mensagens
TODO OBJETO UMA INSTNCIA DE
UMA CLASSE
OBJETOS SO CRIADOS DURANTE A
EXECUO DO PROGRAMA, E
OCUPAM ESPAO NA MEMRIA
TODAS AS INSTNCIAS DE UMA
CLASSE OBEDECEM AO MESMO
PROTOCOLO

Classes, Instncias e
Mensagens
Serra Eltrica
Serra Eltrica

Motor
Cabo
eltrico
Correia

Martelete
Disco de
serra

Furadeira

Prensa

Classes, Instncias e
Mensagens
PROTOCOLO: o conjunto de mtodos
implementados para uma classe
VARIVEIS DE INSTNCIA: Elementos
que compe a coleo de dados privados de
uma classe
ESTADO INTERNO: Conjunto de valores
assumidos pelas variveis de instncia

Classes, Instncias e
Mensagens
Classe

Parte privada
Variveis de
Instncia e
mtodos

Protocolo
Parte visvel

Classes, Instncias e
Mensagens
Exemplo
CanetaGrfica
Coordenadas
MoveTo
LineTo

Classes, Instncias e
Mensagens
Estado interno
Bic

Paker

20

X 200
Y

Variveis de instncia
Instncias da classe CanetaGrfica

10

Classes, Instncias e
Mensagens
Um estado interno de um objeto muda cada
vez que se modifica o valor de uma de suas
variveis de instncia.
interessante que os objetos possuam um
estado inicial conhecido (construtores).
Mtodos destrutores so utilizados para
liberar a memria.

Classes, Instncias e
Mensagens
Mensagem: Ativa um mtodo de um objeto
Mensagem

Resposta

mquina A
t=0
Lig = FALSE

mquina A
t = 50
Lig = TRUE

Mquina(50, TRUE)
t = 50
Lig = TRUE

Resposta
Resultado da execuo do mtodo

Mensagem
Composta por um seletor e um conjunto de parmetros

Classes, Instncias e
Mensagens
Questes

vantajoso definir um protocolo extenso para uma


classe?
Por que um objeto deve ter um estado inicial bem
definido?
Chamada a procedimento = envio de mensagem?
Qual a relao existente entre a resposta a uma
mensagem e o estado interno de um objeto receptor?
Ao projetar uma classe deve-se pensar primeiro nos
dados ou nos mtodos?

Classes, Instncias e
Mensagens
Objeto 2
Dados

Objeto 1
Dados

Objeto 6
Dados
Objeto 3
Dados
Objeto n
Dados

Objeto 4
Dados

Objeto 5
Dados

Encapsulamento
Impede ao cliente enxergar os detalhes da
implementao do objeto
Sistema
Interface

Interface
Parte
Privada

O que o cliente v

O que o projetista v

Encapsulamento
O Encapsulamento favorece o ocultamento
da informao (information hiding),
possibilitando que os dados de cada objeto s
sejam acessveis e modificados atravs de
seus mtodos.

Encapsulamento
REGRAS DO ENCAPSULAMENTO

Regra 1
Apenas

os mtodos devem ser capazes de alterar o


estado interno de um objeto

Regra 2
A resposta

a uma mensagem deve ser completamente


determinada pelo estado interno do objeto

Encapsulamento
Conseqncias

Regra 1: No possvel acessar o valor de uma


varivel de instncia externamente.
Regra 2: Se duas instncias de uma mesma classe
possuem o mesmo estado interno, ento devem
responder a mensagens iguais de forma idntica
(o comportamento de uma classe deve ser muito
bem estabelecido).

Encapsulamento
Se um valor for utilizado por um mtodo ele
pode ser:
Uma

varivel de instncia do objeto;


Um parmetro formal;
Uma varivel local;
Uma constante local;
Uma constante global.

No se deve acessar variveis globais da


aplicao no interior de um mtodo

Encapsulamento
Reusabilidade: reaproveitamento dos
componentes. Com o encapsulamento os
objetos se tornam mais reutilizvel.
Aumenta a produtividade.

Encapsulamento
Manutenabilidade: Impacto que as
modificaes causam no funcionamento de
um sistema.
O encapsulamento favorece mudanas com
efeitos mnimos e bem localizados

Encapsulamento
Questes

Quais problemas ocorrem com o desrespeito a


Regra 1?
E a Regra 2?
Que tipo de mudanas o projetista pode fazer em
uma classe com a garantia de que seus clientes
no sero afetados

Encapsulamento
Exerccios

Defina classes para representar figuras


geomtricas, como crculos e retngulos. Que
caractersticas elas tm em comum?
Imagine que voc est projetando um sistema de
controle bancrio. Defina o objeto conta corrente
e as operaes que ele deve ser capaz de efetuar.
Quais so as semelhanas com o objeto
Poupana? Quais so as diferenas?

Herana e Polimorfismo
Herana um mecanismo simples e
poderoso que permite que uma nova classe
seja descrita a partir de outra classe j
existente, herdando as suas propriedades.

Herana e Polimorfismo
Diz-se que uma subclasse herda os mtodos e as
variveis de instncia de uma superclasse.

A subclasse deve ser capaz de adicionar novos mtodos e


variveis de instncia as originais, alm de redefinir os
mtodos herdados.
Uma subclasse uma especializao de uma superclasse.
Uma instncia da subclasse tm todas as propriedades de
uma instncia da superclasse, mais suas caractersticas
particulares, e nunca menos.

Herana e Polimorfismo
classe B
Dados B
Mtodos B

classe C
Dados B
Dados C
Mtodos B
Mtodos C

Herana e Polimorfismo
Representao grfica
para a Herana

superclasse

Especializao
subclasses

Herana e Polimorfismo
Hierarquia de classes

Classes mais genricas ficam prximas ao topo e


as mais especializadas na parte inferior.

Herana e Polimorfismo
classe A

classe B

Dados A
Mtodos A

Dados B
Mtodos B

classe C
Dados A
Dados B
Dados C
Mtodos A
Mtodos B
Mtodos C

A herana mltipla

Herana e Polimorfismo
Polimorfismo

desejvel que certos mtodos tenham um


comportamento diferente de acordo com o a
instncia corrente, isto alcanado atravs do
mecanismo chamado de polimorfismo, e os
mtodos envolvidos so chamados de virtuais,
que podem atuar em qualquer nvel da
hierarquia.

Herana e Polimorfismo
Polimorfismo

um conceito complementar a herana que


permite enviar a mesma mensagem a objetos
distintos e que cada objeto responda de maneira
mais apropriada para a sua classe. A vantagem
que se obtm com o polimorfismo a
possibilidade uniforme para o tratamento de
objetos distintos

Herana e Polimorfismo
Quando uma mensagem enviada a um
objeto polimrfico, no possvel determinar
previamente qual o endereo do objeto. E
agora?
O mecanismo que permite a resoluo de
endereos em tempo de execuo chama-se
ligao dinmica.

Herana e Polimorfismo
Extensibilidade: Vantagem adicional obtida
com o uso da herana e do polimorfismo.
Permite que uma subclasse seja criada para
incorporar os requisitos especficos de uma
nova aplicao.

Herana e Polimorfismo
Concluses

Programao Orientada para Objetos no a


mesma coisa que programao com objetos;
Com POO se obtm:
Reusabilidade
Manutenibilidade
Extensibilidade

Herana e Polimorfismo
Questes

O que o mecanismo de ligao dinmica?


Em que situao a identidade de um objeto
conhecida em tempo de execuo?
Sem polimorfismo e ligao dinmica como seria
feita a incluso de um novo objeto em um
programa?

Herana e Polimorfismo
Exerccios

Implemente novos tipos de figuras geomtricas,


expandindo, atravs da herana e do
polimorfismo, a hierarquia anteriormente
desenvolvida.
Como poderia ser estruturada uma hierarquia
incluindo as classes ContaCorrente e Poupana?

Classes e Objetos em C++


Termo em
OO
Classe

Significado em C++
Em C++, a palavra reservada class
representa um novo tipo de dado que uma
extenso do tipo struct.

Objeto

Objeto uma varivel do tipo nomeClasse,


onde nomeClasse foi definida de acordo com
as regras de class.

Dados de
estado

So denominados campo de dados, membro


de dados ou simplemente membros de classe.

Mensagem

So especificadas pelos prottipos de funo.

Mtodo

So definies de funo.

Subclasse

chamada de classe derivada.

Classes e Objetos em C++


Uma definio de classe basicamente uma
definio de um tipo de dado.
Em geral, as operaes so pblicas e os
dados internos da classe so privados - as
nicas modificaes possveis nos dados so
realizadas atravs das operaes que a classe
deixa disponvel para que o pblico use.

Classes e Objetos em C++


A informao que permanece escondida do
usurio da classe est contida na seo
privativa da classe. Os dados no podem ser
acessados ou modificados diretamente.

Classes e Objetos em C++


possvel que dados internos sejam
acessados externamente; para tanto, deve-se
colocar estes dados na seo pblica da
classe.

Classes e Objetos em C++


Funes declaradas dentro de uma classe so
chamadas de funes membros. Funes
membros so definidas da mesma forma que
funes normais -- a nica diferena visvel
que o nome da funo precedido pelo nome
da classe, sendo os nomes separados
por ::.

Classes e Objetos em C++


Em geral, a parte privativa da classe contm
apenas dados, enquanto que a parte pblica
contm apenas declaraes de funes.
Entretanto, nada impede que dados sejam
declarados tambm na parte pblica e
funes na parte privativa.

Classes e Objetos em C++


Exemplo

Construtor

ClassTempo{
public:
Time();
voidSetTime(int,int,int);
Interface de classe
voidPrintPadrao();
voidPrintMilitar();
private:
inthora;
S so acessados por funes
intminuto;
intsegundo;
membro ou friend
};

Classes e Objetos em C++


Implementao das funes membro
Obs: Isto um if!

Tempo::Tempo{
hora=0;
minuto=0;
segundo=0;
}
voidTime::SetTime(inth,intm,ints){
hora=(h>=0&&h<24)?h:0;
minuto=(m>=0&&m<60)?m:0;
segundo=(s>=0&&s<60)?S:0;
}
voidTime::PrintMilitar(){
cout<<(hora<10?0:)<<hora<<:
<<(minuto<10?0:)<<minuto;
}

Completar

Classes e Objetos em C++


Usando os objetos
Cria o objeto
intmain(){
Tempot;
cout<<Ahoramilitareh;
t.PrintMilitar();
:
:
}

Usa a funo membro

Classes e Objetos em C++


Onde ficam as classes?
A implementao

pode ser feita na prpria definio

da classe (inline);
Usual:
Definies (prottipos das funes membro e dados) em

arquivo cabealho;
Implementao em arquivo .cpp;

Classes e Objetos em C++


Especificadores de acesso as classes
public: Qualquer membro de dados ou funes membro so

acessveis, onde quer que o programa tenha que acessar


algum objeto da classe.
private: Qualquer membro de dados ou funo membro so

acessveis somente pelas funes membro da classe.

Classes e Objetos em C++


Mas o que uma funo amiga?
So

rotinas que pertencem a uma classe, mas podem


ser usadas em outra sem qualquer vnculo de Herana
ou Associativo com esta.

Classes e Objetos em C++


class TPessoa
{
protected:
char* pcNome;
int nIdade;
public:
void Anda(void); friend;
}
class TAnimal
{
protected:
char* pcNome;
char* pcCientNome;
public:
void Anda(void);
}

Apesar de estar definida nas duas classes, s teremos


a implementao do mtodo Anda de TPessoa:

void TPessoa::Anda(void)
{
...
}

Classes e Objetos em C++


Definindo objetos
Temposunset,
ArraydeTempos[5],
*ptToTime;

Classes e Objetos em C++


Escopo da Classe e acesso a membros

Membro de dados e funes membro formam o


escopo da classe;
Variveis definidas em uma funo membro tem
o escopo da funo;
Os membros so acessados por operadores de
acesso a membros.

Classes e Objetos em C++


Operadores de acesso a membros
Operador

ponto (.) - Combina o nome do objeto com


uma referncia ao objeto para acessar membro;
Operador seta (->) - Combina um ponteiro para um
objeto para acessar os membros do objeto.

Classes e Objetos em C++


Exemplo
ClassContador{
public:
intx;
voidPrintX(){cout<<x;}
};
intmain(){
Contadorconta;
*ptConta=&conta;
conta.x=7;
conta.PrintX();
ptConta>x=8;
ptConta>PrintX();
}

Classes e Objetos em C++


Reviso

Classes habilitam a modelagem dos objetos com atributos e


comportamentos;
Em C++, as classes so definidas usando a palavra reservada class
(obs: struct);
O nome da classe utilizado para declarar os objetos pertencentes
a classe;
As definies de classe comeam com a palavra reservada class.
O corpo da classe delimitado por {e } e termina com ;;
Qualquer membro de dados ou funo membro declarado depois
de public: em uma classe visvel a qualquer funo com acesso
a um objeto da classe.

Classes e Objetos em C++

Qualquer membro de dados ou funo membro declarada depois


de private: s visvel para friends e outros membros da classe;
Um construtor uma funo membro especial, usada para
inicializar os membros de um objeto da classe;
A interface da classe definida pelas funes membro public;
Funes membro definidas fora da classe: Usar operador ::
Funes definidas fora da classe esto dentro do escopo da
classe;
Acesso aos membros: operadores . e ->
Definies da classe colocadas em arquivos cabealhos
Definies das funes membro em arquivo .cpp com mesmo
nome base

Classes e Objetos em C++

Dentro do escopo da classe a referncia aos membros feita


atravs do nome do membro;
Fora do escopo da classe a referncia feita atravs do nome do
objeto, uma referncia para o objeto ou um ponteiro para o
objeto;
Normalmente os membros de dados de uma classe so
declarados private e as funes membro declaradas como public;
Algumas funes membro podem ser private (funes de baixo
nvel);
Inicializadores do objeto so fornecidos pelos construtores da
classe;

Classes e Objetos em C++


Aponte os erros
void~Tempo(int)

intTempo(int,*int)
(prototipodeclaradonaclasseTempo)

ClassTempo{
public:
Time();
voidSetTime(int,int,int);
voidPrintPadrao();
voidPrintMilitar();
private:
inthora=0;
intminuto=0;
intsegundo=0;
};

Classes e Objetos em C++


Exerccios de Implementao
1. Partidos polticos necessitam, principalmente neste perodo, de pesquisas que
mostrem as intenes de voto do eleitor. A cidade dividida em zonas eleitorais
e voc deve montar um programa que emita as estatsticas e as intenes de voto em
cada zona eleitoral. Quais so as classes mais importantes que voc v para desenvolver
o seu programa? Detalhe e implemente a definio de uma das classes que voc idealizou
em C++.
2. Crie uma classe chamada Complexos para fazer aritmtica de nmeros complexos. Escreva
o programa e teste sua classe. Lembre-se que um nmero complexo tem a forma a+bi, onde
i = sqrt(-1). Use variveis float para representar os dados private da classe. Fornea uma funo
construtora para os objetos dessa classe. As funes membro devem ser as seguintes:
a) Adio de dois complexos;
b) Subtrao de complexos;
c) Impresso de complexos na forma (a, b), onde a a parte real e b a parte complexa.
3. Crie uma classe Retangulo. A classe tem atributos comprimento e largura, com valor default
igual a 1. Fornea as funes get e set, tanto para o comprimento quanto para a altura.

Classes e Objetos em C++

Classes e Objetos em C++


//Arquivo 1 ponto.h, definicao para a classe ponto.
class ponto
{
public:
//daqui em diante tudo e acessivel.
void inicializa(float a,float b);
void mostra(void);
private:
float x;
//sao ocultos por default
float y;
//sao ocultos por default
};

Classes e Objetos em C++

//Arquivo 2 , ponto.cpp , implementacao para a classe ponto.


#include <iostream.h>
#include "ponto.h"
void ponto::inicializa(float a,float b)
{ x=a; y=b; }
//as funcoes de uma classe podem acessar os atributos private dela mesma.
void ponto::mostra(void)
{cout << "X:" << x << " , Y:" << y << endl;}

Classes e Objetos em C++


//Arquivo 3 . Programa principal: princ.cpp
#include "ponto.h"
void main()
{
ponto ap;
//instanciacao
ap.inicializa(0.0,0.0);
//metodos public
ap.mostra();
//metodos public

Classes e Objetos em C++


Tipo abstrato de dados frao. Baseado no conceito de nmero racional.
Algumas operaes no foram implementadas por serem semelhantes s
existentes.
Resumo das operaes matemticas envolvidas:
Simplificao de frao: (a/b)=( (a/mdc(a,b)) / (b/mdc(a,b)) )
Onde mdc(a,b) retorna o mximo divisor comum de ab.
Soma de frao: (a/b)+(c/d)=( (a.d+c.b) / b.d ) simplificada.
Multiplicao de frao: (a/b) * (c/d)= ( (a*c) / (b*d) ) simplificada.
Igualdade: (a/b)== (c/d) se a*d == b*c.
No igualdade: (a/b) != (c/d) se a*d b*c
Maior ou igual que:(a/b)(c/d) se a*d b*c

Classes e Objetos em C++


//File easyfra.h
long mdc(long n,long d);
//maximo divisor comum metodo de Euclides.
class fracao {
private:
long num; //numerador
long den; //denominador
public:
fracao(long t,long m); //construtor comum
void simplifica(void); //divisao pelo mdc
~fracao() { /* nao faz nada*/ }
//operacoes matematicas basicas
fracao soma (fracao j);
fracao multiplicacao(fracao j);

//operacoes de comparacao
int igual(fracao t);
int diferente(fracao t);
int maiorouigual(fracao t);
//operacoes de input output
void mostra(void); //exibe fracao no video
void cria(void); //pergunta ao usuario o valor da fracao
//operacoes de conversao de tipos
double convertedbl(void); //converte para double
long convertelng(void); //converte para long
};

Classes e Objetos em C++


//implementacao para a classe fracao.
#include <iostream.h>
#include "easyfra.h"
long mdc(long n,long d)
//maximo divisor comum
//metodo de Euclides .
{
if (n<0) n=-n;
if (d<0) d=-d;
while (d!=0) {
long r=n % d;
//%=MOD=Resto da divisao inteira.
n=d;
d=r;
}
return n;
}

void fracao::simplifica(void)
{
long commd;
commd=mdc(num,den);
//divisor comum
num=num/commd;
den=den/commd;
if (den<0) { den=-den; num=-num;};
//move sinal para cima
}
fracao::fracao(long t,long m)
{
num=(t);
den=(m);
simplifica(); //chamada para o mesmo objeto.
}

Classes e Objetos em C++


fracao fracao::soma(fracao j)
{
fracao g((num*j.den)+(j.num*den),den*j.den);
return g;
}
fracao fracao::multiplicacao(fracao j)
{
fracao g(num*j.num,den*j.den);
return g;
}
int fracao::igual(fracao t)
{
return ((num*t.den)==(den*t.num));
//funciona bem mesmo para nao simplificada
}
int fracao::diferente(fracao t)
{
return ((num*t.den)!=(den*t.num));
}

int fracao::maiorouigual(fracao t)
{
return ((num*t.den)>=(t.num*den));
}
void fracao::mostra(void)
{
cout << "(" << num << "/" << den << ")";
}
void fracao::cria(void)
{
cout << "Numerador:";
cin >> num;
cout << "Denominador:";
cin >> den;
simplifica();
}

Classes e Objetos em C++


double fracao::convertedbl(void)
{
double dbl;
dbl=(double(num)/double(den));
return dbl;
}
//conversao para long
long fracao::convertelng(void)
{
long lng;
lng=num/den;
return lng;
}

Classes e Objetos em C++


#include <iostream.h>
#include "easyfra.h"
//nossa definicao da classe
#include <stdio.h>
main()
{
fracao a(0,1),b(0,1);
cout << " Entre com fracao a: ";
a.cria();
a.mostra();
cout << " Entre com fracao b: ";
b.cria();
b.mostra();
fracao c(a.soma(b));
//c(a+b)
cout << endl << "c de a+b:";
c.mostra();

cout << endl << "a*b";


c=a.multiplicacao(b);
c.mostra();
cout << endl << "a+b";
c=a.soma(b);
c.mostra();
cout << endl << "a>=b";
cout << a.maiorouigual(b);
cout << endl << "a==b";
cout << a.igual(b);
cout << endl << "a!=b";
cout << a.diferente(b);
cout << endl << "long(a) ";
cout << a.convertelng();
cout << endl << "double(a) ";
cout << a.convertedbl();
return 0;
}

Classes e Objetos em C++


#include <iostream.h>
#include <math.h>
//double sqrt(double x); de math.h retorna raiz quadrada do numero
//double pow(double x, double y); de math.h calcula x a potencia de y
const float ZERO=0.0;
class ponto{
private:
float x;
//sao ocultos por default nao precisaria private mas e' bom
float y;
//sao ocultos por default
public:
//daqui em diante tudo e acessivel em main.
ponto(float a,float b) { x=a; y=b; }
void mostra(void) const {cout << "X:" << x << " , Y:" << y << endl;}
float distancia(const ponto hi) const{
return float( sqrt( (
pow(double(hi.x-x),2.0) + pow(double(hi.y-y),2.0) ) ));
//teorema de Pitagoras
}
};

Classes e Objetos em C++


void main()
{
ponto ap(3.0,4.0);
//instanciacao
ap.mostra();
//funcoes membro public
const ponto origem(ZERO,ZERO);
//defino objeto constante
origem.mostra();
cout << "Distancia da origem:" << origem.distancia(ap);
}

Classes e Objetos em C++


Uso do const
Const pode qualificar um parmetro de funo (assegurando
que este no ser modificado), uma funo membro (assegurando
que esta no modifica os dados membro de sua classe), ou
uma instncia de objeto/tipo (assegurando que este no ser
modificado.)
Os modos de qualificao descritos atuam em conjunto,
para assegurar que um objeto const no ser modificado, C++ s
permite que sejam chamados para este objeto funes membro
qualificadas como const

Classes e Objetos em C++


#include <iostream.h>
void main()
{
int* a;
//declara um ponteiro para endereco de variavel inteira

Ponteiros em C++

a=new int(3);
//aloca memoria para o apontado por a, gravando neste o valor 3
cout << (*a) << endl ;
//imprime o valor do apontado por a
delete a;
//desaloca memoria
}

Classes e Objetos em C++


#include <iostream.h>

Alocao Esttica

class vetor_tres
{
public:
int vet[3]; //vetor alocado estaticamente numa classe.
vetor_tres(int a,int b,int c)
{ vet[0]=a; vet[1]=b; vet[2]=c; }
//construtor do vetor
void mostra(void)
{ cout << vet[0] << " " << vet[1] << " " << vet[2] << endl;}
//funcao membro para mostrar o conteudo do vetor
};

Classes e Objetos em C++


void main()
{
vetor_tres v1(1,2,3); //criacao de um objeto vetor.
vetor_tres v2(15,16,17); //criacao de um objeto vetor.
v1.mostra(); //mostrando o conteudo de v1.
v2.mostra(); //mostrando o conteudo de v2.
v2=v1; //atribuindo objeto v1 ao objeto v2.
v2.mostra(); //mostrando v2 alterado.
v1.vet[0]=44;
v1.mostra(); //mostrando o conteudo de v1.
v2.mostra(); //mostrando o conteudo de v2.
}

Classes e Objetos em C++


#include <iostream.h>
//vetor alocado dinamicamente
void main()
{
int tamanho;
int* vet;
cout << "Entre com o tamanho do vetor a criar";
cin >> tamanho;

Alocao Dinmica

vet=new int[tamanho]; //alocando vetor de "tamanho" posicoes comecando em a[0]


for (int i=0;i<tamanho;i++)
{
cout << "Entre com o valor da posicao " << i << ":";
cin >> vet[i];
cout << endl;
}
for (int j=0;j<tamanho;j++)
{
cout << "Posicao " << j << ":" << vet[j]<<endl;
}
}

Classes e Objetos em C++


//file exvet1.h
//header file para classe vetor
const int inicio=0;

TAD Vetor

class vetor{
private:
int* v;
//este e' o vetor
int tamanho; //tamanho maximo do vetor,
public:
vetor (int tam); //construtor, aloca memria para o vetor.
void atribui(int index,int valor); //altera uma posicao do vetor
int conteudo(int index);
//retorna conteudo de posicao do vetor
int maximo(void);
//retorna o maior elemento do vetor
int primeiro(void);
//primeiro indice do vetor
int ultimo(void);
//ultimo indice do vetor
~vetor() {delete v;}
//inline function ou use delete v[];
};

Classes e Objetos em C++


//codigo, implementacao, para o header file
#include <iostream.h>
#include <stdlib.h>
#include "exvet1.h"
vetor::vetor (int tam)
{v=new int[tam]; tamanho=tam;}
void vetor::atribui(int index,int valor)
{
if (index<tamanho && index>=inicio)
v[index]=valor;
}

int vetor::conteudo(int index)


{
if (index>=tamanho || index<inicio) {
cerr << "Fora dos limites"; exit(1);}
return v[index];
}
int vetor::primeiro(void)
{ return inicio;}
int vetor::ultimo(void)
{ return tamanho-1;}
int vetor:: maximo(void)
{int candidato=inicio; //candidato ao maximo
for (int i=inicio;i<tamanho;i++)
if (v[i]>v[candidato]) candidato=i;
return v[candidato];}

Classes e Objetos em C++


//programa pricipal
#include <iostream.h>
#include "exvet1.h"
main()
{
int aux;
//para ler valor a atribuir
vetor meu(5);
for (int i=meu.primeiro();i<=meu.ultimo();i++)
{
cout << "Entre com valor da posicao:" << i << "\n";
cin >> aux;
meu.atribui(i,aux);
}
for (int j=meu.primeiro();j<=meu.ultimo();j++) cout<< meu.conteudo(j)<< " ";
cout <<endl << "Maximo:" << meu.maximo();
return 0;
}

Projeto de Programas OO
a forma pela qual o programador cria o modelo
em forma de programa. o processo onde se coloca
as partes importantes de um programa em ordem.
Estabelecer quais as classes, objetos e mtodos so
necessrios para um programa, e definir quais
classes e objetos devem se interrelacionar.

Projeto de Programas OO
3 Etapas

Planejamento da Interface Abstrata


Requer

tempo adicional ao projeto


Entretanto, aproveita-se a mesma classe em diferentes
aplicaes

Projeto de Programas OO

Refinamento do Protocolo
Estender

a definio original dos objetos atravs da


incorporao de novos mtodos a seu protocolo
Definir o protocolo mnimo da classe
Refinar: A partir do protocolo mnimo antecipar os mtodos

que seriam mais teis para torn-lo mais reusvel em


diversas situaes ou possibilitando o aumento da
funcionalidade;

Projeto de Programas OO

Aspectos importantes para identificao de


novos mtodos:
Para cada mtodo, identificar se deve existir outro com
inverso;
Necessidade de mtodos complementares;
Mtodos distintos (identificar mtodos que utilizem
parmetros apenas poucos valores aceitveis, substitu-lo por
mtodos individuais;
Verificar que mtodos devem ser adicionados para tornar a
conceitualmente completa;

efeito

como
vrios
classe

Projeto de Programas OO

Planejamento da Hierarquia de Classes


Enfoque:
Top-down

As subclasses so obtidas a partir da especializao das

classes j existentes, incorporando novos mtodos e variveis


de instncia ou redefinindo a superclasse, se necessrio.
Bottom-Up

Novas superclasses so conseqncias da generalizao das

propriedades das classes existentes;

Projeto de Programas OO
Uma quarta etapa pode ser a construo das
tabelas CRC (Classe, Responsabilidade,
Correspondncia).

Projeto de Programas OO
sempre bom lembrar:
Variveis da classe
S existe uma cpia de cada varivel
Todos as instncias acessam a mesma cpia das variveis
So criadas apenas uma vez assim que o sistema reconhece a classe
Variveis da Instncia
Existe uma cpia para cada instncia criada
Cada instncia acessa a sua cpia
So criadas sempre quando uma nova instncia gerada

Projeto de Programas OO
Mtodos de Classe
Podem acessar apenas variveis da classe
Podem ser acessados pela classe ou pela instncia
Mtodos de Instncia
Podem acessar variveis da classe e da instncia
S podem ser acessados por instncias

Projeto de Programas OO
Para que objetos se comuniquem eles precisam se relacionar
Associao: conexo entre classes
Agregao: especializao de uma associao onde um todo
relacionado com suas partes (relacionamento parte-de ou conteno
Herana: um dos princpios da OO, permite a reutilizao, uma nova
classe pode ser definida a partir de outra j existente

Projeto de Programas OO
Associao:
descreve uma relao entre duas classes
Usurio possui bicicleta
Agregao:
descreve o relacionamento entre um todo e sua parte
so indicadas por frases do tipo tem um, parte de
Uma teclado parte de um notebook

Projeto de Programas OO
Generalizao / Herana
descreve o relacionamento entre classes definidas a partir de outras
classes.
toda a subclasse herda os estados e os comportamentos definidos na
superclasse
as subclasses no esto limitadas a estes estados e comportamentos.
Uma mountain bike uma bicicleta

Projeto de Programas OO
Uma associao usualmente um relacionamento bidirecional
Dado uma instncia de Aluno, h um objeto Disciplina associado
Dado uma instncia de Disciplina, h um objeto Aluno associado

Aluno

Disciplina

Projeto de Programas OO
Tipos de associaes

Unidirecional
Bidirecional
Indeterminada

Projeto de Programas OO
Classe A

Classe B
unidirecional

ou

Classe A

Classe A

Classe B

Classe B

bidirecional

bidirecional
ou
no determinada

Projeto de Programas OO
Para facilitar seu entendimento, uma associao precisa ser nomeada
- O nome representado como um rtulo colocado
ao longo da linha de associao
- Um nome de associao usualmente um verbo ou uma frase verbal

Aluno

Cursa

Dsiciplina

Projeto de Programas OO

Aluno

cursa

Disciplina

tem
matriculado
Aluno

Cursa
Tem
matriculado

Disciplina

Projeto de Programas OO
Multiplicidade para Associaes
Multiplicidade o nmero de instncias de uma classe
relacionada com UMA instncia de outra classe
Para cada associao, h duas decises a fazer: uma para cada
lado da associao
Por exemplo, na conexo entre Aluno e Disciplina:

Para cada instncia de Aluno, podem ocorrer muitas (zero ou mais)


Disciplinas
Para cada instncia de Disciplina, podem ocorrer uma ou vrias
instncias de alunos matriculados

Projeto de Programas OO
Muitos
Exatamente um

Zero ou mais

0..

Um ou mais
Zero ou um

1..

Faixa especificada

2..4

Pessoa

*
*

0..1

Disciplina

Aluno
1..*

1..*

Projeto de Programas OO
Associao em C++
E

realizado atravs da incluso de atributos nas


classes envolvidas;

Exemplo
Sejam

as classes TCliente e TProduto. Suponhamos


que o relacionamento entre elas seja "Um Cliente
possui vrios Produtos" .Este tipo de associao
Unidirecional, com duas formas de implementao.

Projeto de Programas OO
class TCliente
{
protected:
int nClientCod;
char* pcNome;
char* pcEndereco;
int* nProdCod; //array de inteiros com todos os produtos que possui
public:
...
}
class TProduto
{
Uma instncia de Cliente sabe todos os
protected:
int nProdCod;
Produtos que possui
char* pcDescri;
public:
...
}

Projeto de Programas OO
class TCliente
{
protected:
int nClientCod;
char* pcNome;
char* pcEndereco;
public:
...
}
class TProduto
Uma instncia de
{
protected:
Cliente a possui
int nProdCod;
char* pcDescri;
int nClientCod; //qual cliente o possui
public:
...
}

Produto sabe qual o

Projeto de Programas OO
Observemos agora a relao entre as classes
TAluno e TProfessor. Neste caso temos uma
associao Bidirecional, visto que "Um
Aluno tem vrios Professores e um Professor
tem vrios Alunos".

Projeto de Programas OO
class TAluno
{
protected:
char* pcDRE;
char** pacMatricula; //matriculas dos professores que possui
char* pcNome;
int nIdade;
public:
...
}
class TProfessor
{
protected:
char* pcMatricula;
char*pcNome;
char** pacDRE; //array de strings com DRE dos alunos que possui
public:
...
}

Projeto de Programas OO

Projeto de Programas OO
Agregao
Agregao uma forma especializada de associao
no qual um todo relacionado com sua(s) parte(s)

Agregao conhecido como um relacionamento de


conteno ou todo-parte.

Projeto de Programas OO
O relacionamento descrito com uma frase parte de

Uma placa parte de um computador

Algumas operaes no todo so automaticamente aplicadas a suas partes?

Transportar o computador, Transportar a placa

Alguns valores de atributos so propagados do todo para todos ou algumas


de suas partes?

Caractersticas do barramento

Existe uma assimetria inerente no relacionamento onde uma classe


subordinada a outra?

Uma placa parte de um computador, um computador NO parte de uma


placa

Projeto de Programas OO

Todo

Parte1

Parte2

Projeto de Programas OO

Turma

Aluno
1..*

Projeto de Programas OO
Em uma agregao, a parte pode estar contida, ou no, em
mais de um todo.
Quando isto ocorre, chamamos agregao compartilhada
(losango branco).
Quando uma parte no pode estar em mais de um todo,
chamamos composio (losango preto).

Na composio, quando o objeto todo destrudo, o objeto parte


tambm destrudo.

Projeto de Programas OO

Departamento

Disciplina
*

Projeto de Programas OO
Associao ou Agregao?
Se dois objetos so altamente acoplados por um
relacionamento todo-parte

O relacionamento uma agregao

Se dois objetos so usualmente considerados como


independentes, mesmo que eles estejam freqentemente
ligados

O relacionamento uma associao

Projeto de Programas OO

Curso

Disciplina
1..*

Curso e disciplina so
altamente acoplados (1 curso
formado por 1 ou mais
disciplinas)

Aluno
0..*

3..10

Objetos independentes

Projeto de Programas OO
Identificando Objetos
Em uma sala existe um conjunto de objetos fsicos que podem ser
facilmente identificados, modelados e classificados como objetos OO.
Mas em um problema onde o espao uma aplicao de software, os
objetos podem no ser facilmente encontrados.
Os objetos podem ser identificados analisando-se o problema ou
fazendo um parser gramatical do texto contendo a descrio do
problema
Objetos so determinados sublinhando-se cada substantivo ou orao
(parte de uma frase)

Projeto de Programas OO
Candidatos a objeto:

Entidade externa que produz ou consome informao para ser usada por um sistema
computacional (ex.: outros sistemas, devices, pessoas)

Coisas que so parte do domnio da informao do problema (ex.: um sinal, uma carta,
um display)

Ocorrncias ou eventos que acontecem no contexto da operao do sistema (ex.: a


propriedade de uma transferncia, a finalizao de uma srie de movimentos de um
rob)

Papeis(roles) desempenhados por pessoas que interagem com o sistema (ex.: gerente,
engenheiro, vendedor)

Unidades de organizao que so relevantes a uma aplicao (ex.: divises, grupo, time)

Lugares que estabelecem o contexto do problema (ex.: galpo, estaleiro)

Estruturas que definem a classe de um objeto (ex.: sensor, computador, veculo 4-rodas)

Projeto de Programas OO
Papis
Eventos

Lugar
Coisas

Estrutura

Entidades
externas

Unidades
organizacionais
Nome do objeto
Atributos
Operaes

Projeto de Programas OO
Escolhendo classes

Uma classe deveria capturar uma e somente uma


abstrao chave
Abstrao ruim: classe Aluno que conhece a
informao do aluno e as disciplinas que aquele aluno
est matriculado
Boa abstrao: separar em uma classe para Aluno e uma
classe para Disciplina

Projeto de Programas OO
Nomes para classes

Uma classe deveria ser um substantivo singular que


melhor caracteriza a abstrao
Dificuldades na nomeao das classes podem indicar
abstraes mal definidas
Nomes deveriam surgir diretamente do domnio do
problema

Projeto de Programas OO
Um guia de estilo deveria ditar convenes de nomeao
para classes
Uma proposta simples:

Classes so nomeadas com um substantivo no singular


O nome de uma classe inicia com a primeira letra maiscula
No so utilizados smbolos de sublinhado (_) - nomes compostos
de mltiplas palavras so organizados com todas as palavras juntas,
onde a primeira letra de cada uma fica em maiscula

Exemplos: Aluno, Professor, ControleAcadmico

Projeto de Programas OO
Uma classe deveria capturar uma e somente uma
abstrao chave
Abstrao ruim: classe Aluno que conhece a
informao do aluno e as disciplinas que aquele
aluno est matriculado
Boa abstrao: separar em uma classe para Aluno e
uma classe para Disciplina

Projeto de Programas OO
Semntica da Classe
Aps encontrar o nome da classe, importante que seja feita
uma breve (mas concisa) descrio da mesma

O foco deve ser no propsito da classe e no na implementao

O nome da classe e sua descrio formaro a base para um


dicionrio do modelo
As classes desta fase devem somente relatar o domnio do
problema

Herana e Polimorfismo em C++


Relaes entre classes:

Generalizao(Herana);
Agregao;
Associao.

Herana e Polimorfismo em C++


Hierarquia

Classificao:
Classificar

significa agrupar objetos com base e


estrutura semelhante.

Instanciao:
Instanciar

significa gerar novos exemplares a partir de


uma descrio abstrata para gerar um objeto.

Herana e Polimorfismo em C++

Generalizao
Generalizar

significa remover restries para se obter


abstraes mais genricas;

Especializao
Especializar

significa buscar caractersticas que


diferenciem abstraes afins

Herana e Polimorfismo em C++

Agregao
Agregar

significa combinar abstraes para se obter


estruturas e comportamentos mais complexos;

Decomposio
Decompor

significa detalhar uma abstrao dividindo-a


em seu elementos constituintes

Herana e Polimorfismo em C++


O mecanismo de herana possibilita:

A derivao de um tipo mais especfico a partir de tipos


mais genricos;
subclasses herdam os dados e os mtodos da subclasse
permitindo ainda modificaes nos mesmos;
herana simples: subclasse deriva somente de uma
superclasse;
herana mltipla: subclasse deriva de vrias superclasses.

Herana e Polimorfismo em C++


As classes podem ser organizadas em
hierarquia de herana

Herana e Polimorfismo em C++


Uma subclasse pode redefinir mtodos
herdados de uma superclasse modificando
uma parte de seu comportamento
class ClasseHerdeira : public ClasseBase{
//atributos da classe filha
};
class ClasseHerdeira : private ClasseBase{
//atributos da classe filha
};

Herana e Polimorfismo em C++


Regras de visibilidade

A classe derivada pode ajustar o direito de acesso


a um membro de uma classe base atravs de uma
declarao de acesso;
A classe derivada pode reduzir ou ampliar o
direito de acesso a um membro da classe base.

Herana e Polimorfismo em C++


Ao derivar uma classe, a classe base pode ser
herdada como:
Public
Private
Protected

Raramente utilizado

Herana e Polimorfismo em C++


Herana Pblica:
Na herana pblica as classes filhas passam a ter as
mesmas funes membro public da classe pai, as classes filhas
podem acrescentar funes membro, dados membro e at redefinir
funes membro herdadas . Os atributos da classe pai no so
acessveis diretamente na classe filha a no ser que sejam
qualificados como protected. Por isso que se diz que
as classes filhas garantem pelo menos o comportamento
da classe pai, podendo acrescentar mais caractersticas.

Herana e Polimorfismo em C++


Quando se deriva uma classe a partir de uma classe public,
os membros public da classe base se tornam membros public
na classe derivada e os membros protected da classe base se
tornam protected na classe derivada.
Quando se deriva uma classe a partir de uma classe base
protected , os membros public e protected da classe base se
tornam membros protected na classe derivada.
Quando se deriva uma classe a partir de uma classe base
private, os membros public e protected da classe base
tornam-se private na classe derivada.

Herana e Polimorfismo em C++


Construtores e herana:
No construtor de uma classe filha o programador pode
incluir a chamada do construtor da classe pai.
Destrutores e herana:
Quando um objeto da classe derivada destrudo, o
destrutor da classe pai tambm chamado dando a oportunidade
de liberar a memria ocupada pelos atributos private da classe pai.

Herana e Polimorfismo em C++


Diagrama de acesso

Herana e Polimorfismo em C++


Tipo de herana

Tipo de acesso original na


Classe base

Public

Protected

Private

Public

Public

Protected

No acess.

Private

Private

Private

No acess.

Tipo de acesso resultante na classe derivada

Herana e Polimorfismo em C++


Exemplo

Herana e Polimorfismo em C++


//header file
class ponto{
private:
float x;
float y;
public.
ponto(float a,float b);
void inicializa(float a,float b);
float retorna_x(void);
float retorna_y(void);
void altera_x(float a);
void altera_y(float b);
void mostra(void);
};

class ponto_reflete:public ponto {


private:
//se voce quer adicionar atributos...
public:
ponto_reflete(float a, float b);
void reflete(void);
};
class ponto_move:public ponto
{
public:
ponto_move(float a,float b);
void move(float dx,float dy);
};

Herana e Polimorfismo em C++


//implementation file
#include <iostream.h>
#include "pontos.h"
ponto::ponto(float a,float b)
{
inicializa(a,b);
}
void ponto::inicializa(float a,float b)
{
x=a;
y=b;
}
float ponto::retorna_x(void)
{ return x; }

float ponto::retorna_y(void)
{ return y; }
void ponto::altera_x(float a)
{ x=a; }
void ponto::altera_y(float b)
{ y=b; }
void ponto::mostra(void)
{
cout << "(" << x << "," << y << ")" <<endl;
}

Herana e Polimorfismo em C++


ponto_reflete::ponto_reflete(float a,float b):ponto(a,b)
{}
void ponto_reflete::reflete(void)
{
altera_x(-retorna_x());
altera_y(-retorna_y());
}
ponto_move::ponto_move(float a,float b):ponto(a,b)
{}
void ponto_move::move(float dx,float dy)
{
altera_x(retorna_x()+dx);
altera_y(retorna_y()+dy);
}

Herana e Polimorfismo em C++


#include <iostream.h>
#include "pontos.h"
void main()
{
ponto_reflete p1(3.14,2.17);
p1.reflete();
cout << "P1";
p1.mostra();
ponto_move p2(1.0,1.0);
p2.move(.5,.5);
cout << "P2";
p2.mostra();
}

Resultado do programa:
P1(-3.14,-2.17)
P2(1.5,1.5)

Herana e Polimorfismo em C++


Herana Private:
class herdeira: private nome_classe_base;
As funes membro desta classe base s so acessveis dentro
das declaraes da classe filha, ou seja a classe filha no atende
por essas funes membro, mas pode us-las em seu cdigo.
Normalmente, quando se usa herana dizemos que a classe
filha garante no mnimo o comportamento da classe pai
(em termos de funes membro) , a herana private pode invalidar
esta premissa.

Herana e Polimorfismo em C++


protected deixa os atributos da classe pai visveis,
acessveis hierarquia abaixo.
O uso de protected serve como um nvel intermedirio
de proteo entre o acesso public e o private. Membros
protected da classe podem ser acessados por membros friends
Da classe base e por membros friend das classes derivadas;
Nenhuma outra funo pode acessar membros protected de uma
Classe base.

Herana e Polimorfismo em C++


Exemplo Redefinio de mtodo herdado
Uma

classe filha pode fornecer uma outra


implementao para uma funo membro herdada,
caracterizando uma redefinio overriding de
funo membro. Importante: a funo membro deve
ter a mesma assinatura (nome, argumentos e valor de
retorno), seno no se trata de uma redefinio e sim
sobrecarga overloading.

Herana e Polimorfismo em C++

ponto_reflete redefine a funo membro mostra da classe pai,


enquanto que a classe herdeira ponto_move aceita a definio
da funo membro mostra dada pela classe ponto que sua
classe pai.

Herana e Polimorfismo em C++


//header file
class ponto
{
private:
float x;
//sao ocultos por default
float y;
//sao ocultos por default
public:
//daqui em diante tudo e acessivel.
ponto(float a,float b);
void inicializa(float a,float b);
float retorna_x(void);
float retorna_y(void);
void altera_x(float a);
void altera_y(float b);
void mostra(void);
};

class ponto_reflete:public ponto


{
private:
//se voce quer adicionar dados membro
public:
ponto_reflete(float a, float b);
void reflete(void);
void mostra(void);
//redefinicao
};
class ponto_move:public ponto
{
public:
ponto_move(float a,float b);
void move(float dx,float dy);
//esta classe filha nao redefine mostra
};

Herana e Polimorfismo em C++


//implementation file
#include <iostream.h>
#include "pontos.h"
ponto::ponto(float a,float b){
inicializa(a,b);
}
void ponto::inicializa(float a,float b){
x=a;
y=b;
}
float ponto::retorna_x(void)
{ return x; }
float ponto::retorna_y(void)
{ return y; }
void ponto::altera_x(float a)
{ x=a; }
void ponto::altera_y(float b)
{ y=b; }

void ponto::mostra(void){
cout << "(" << x << "," << y << ")" <<endl;
}
ponto_reflete::ponto_reflete(float a,float b):ponto(a,b)
{}
void ponto_reflete::reflete(void){
altera_x(-retorna_x());
altera_y(-retorna_y());
}
void ponto_reflete::mostra(void){
cout << "X:" << retorna_x() << " Y:";
cout << retorna_y() << endl;
}
//somente altera o formato de impressao
ponto_move::ponto_move(float a,float b):ponto(a,b)
{}
void ponto_move::move(float dx,float dy){
altera_x(retorna_x()+dx);
altera_y(retorna_y()+dy);
}

Herana e Polimorfismo em C++


#include <iostream.h>
#include "pontos.h"
void main()
{
ponto_reflete p1(3.14,2.17);
p1.reflete();
cout << "P1";
p1.mostra();
ponto_move p2(1.0,1.0);
p2.move(.5,.5);
cout << "P2";
p2.mostra();
}

Resultado do programa:
P1X:-3.14 Y:-2.17
P2(1.5,1.5)

Herana e Polimorfismo em C++


Herana Mltipla

A indicao da herana mltipla realizada a


partir de uma lista de classes base separadas por
vrgulas, descritas a partir do indicador de
herana (:)
Exemplo

class Derivada : public Base1, public Base2 {


//descrio da classe
};

Herana e Polimorfismo em C++

Herana e Polimorfismo em C++


Algumas dicas:
Um objeto de uma classe derivada pode ser atribudo a um objeto de uma

classe base;
Um ponteiro para um objeto de uma classe devida pode ser implicitamente
convertido para um ponteiro para um objeto da classe base;
A classe base especfica o que h de comum;
Relacionamento um herana;
Relacionamento tem um composio;
Ler declaraes de classes derivadas pode ser confuso! (os membros
herdados no aparecem na declarao)
Construtores de objetos membros so chamados na ordem de declarao
dos objetos. Na herana, os construtores da classe base so chamados na
ordem da especificao, antes do construtor das classe derivadas.

Herana e Polimorfismo em C++


Quando o objeto da classe derivada destrudo, os destrutores so
chamados na ordem inversa dos destrutores; primeiro chamado o
destrutor da classe derivada, ento chamado o destrutor da classe base;
Na herana mltipla, o construtor da classe derivada chama o construtor
da classe base para cada uma de suas classes bases, na ordem em que as
classes bases so declaradas na declarao da herana.
Tratar objetos da classe base como objetos da classe derivada pode
causar erros!
Herde sempre a classe mais prxima daquilo que voc necessita.
Use protected em ltimo recurso.
Herana mltipla pode aumentar a complexidade do sistema. Muito
cuidado!

Herana e Polimorfismo em C++


Exerccios
1) Defina: Herana, Herana Mltipla, classe base e classe
derivada.
2) Qual a diferena entre Herana simples e Herana
Mltipla?
3) (F/V) Uma classe derivada tambm chamada de
subclasse por ser um subconjunto da classe base.
4) (F/V) Um objeto da classe derivada tambm um objeto
da classe base.
5) (F/V) O protected rompe o encapsulamento.

Herana e Polimorfismo em C++


Polimorfismo e Funes virtual

Polimorfismo, do grego: muitas formas. Polimorfismo


a capacidade de um operador executar a ao apropriada
dependendo do tipo do operando. Aqui operando e
operador esto definidos num sentido mais geral:
operando pode significar argumentos atuais de um
procedimento e operador o procedimento, operando pode
significar um objeto e operador um mtodo, operando
pode significar um tipo e operador um objeto deste tipo.

Herana e Polimorfismo em C++


Funes virtuais

Uma funo virtual uma funo que declarada


como virtual em uma classe base e redefinida pela
classe derivada.
A declarao da funo virtual na classe base age como
uma espcie de indicador que especifica uma linha geral
de ao e estabelece uma interface de acesso. A
redefinio da funo virtual pela classe derivada
especifica as operaes realmente executadas pelo
mtodo.

Herana e Polimorfismo em C++


#include<iostream.h>
class Base{
public:
virtual void vfunc(){
cout<<esta e vfunc() da base \n;
}
};
class Derivada1:public base{
public:
void vfunc(){
cout<<esta e vfunc() da derivada1 \n;
}
};
class Derivada2:public base{
public:
void vfunc(){
cout <<esta e vfunc() da derivada2 \n;
}
};

Herana e Polimorfismo em C++


main(){
Base *p, b;
Derivada1 d1;
Derivada2 d2;
p = &b;
p->vfunc();
p = &d1;
p->vfunc();
p = &d2;
p->vfunc();
Return 0;
}

Herana e Polimorfismo em C++


Observaes:

a declarao de vfunc() deve ser precedida pela palavra chave virtual;


a palavra chave virtual no necessria na declarao das funes
vfunc() das classes derivadas;
a definio de qual verso da funo vfunc() invocada s obtida em
tempo de execuo: ela no baseada no tipo declarado de p, mas sim
para quem p aponta;
polimorfismo em tempo de execuo s atingido atravs do uso de
apontadores para classe base. Se vfunc() for chamada da maneira
``usual,'' isto , usando o operador ponto, como em d2.vfunc(), ento a
funo, mesmo sendo declarada como virtual, tem o mesmo
comportamento de outras funes membro.

Herana e Polimorfismo em C++

A redefinio de uma funo virtual por uma


classe derivada similar a sobrecarga de funes.
Entretanto, h diversas diferenas:
o prottipo para uma funo virtual deve combinar exatamente

o prottipo especificado para a classe base


funes virtuais devem ser membros da classe das quais elas
fazem parte -- no podem simplesmente ser funes amigas.
Por

estes motivos, a redefinio de funes virtuais


por classes derivadas usualmente chamada de
sobreposio, e no de sobrecarga.

Herana e Polimorfismo em C++


Deve-se observar que a ``virtualidade''
hereditria. Isto , quando uma funo virtual
herdada, sua natureza virtual tambm
herdada -- mesmo quando a palavra chave
virtual no explicitamente declarada no
mtodo da classe derivada. Assim, o carter
virtual da funo mantido, no importa qual
o nmero de nveis na hierarquia de classes.

Herana e Polimorfismo em C++


O uso da palavra chave virtual indica que a
funo pode ser sobreposta, mas no obriga a
sobreposio. Caso a classe derivada no
sobreponha uma funo virtual, ento o
mtodo correspondente da classe base ser
utilizado.

Herana e Polimorfismo em C++


Sobrecarga de Funo

Sobrecarga Overloading de funo um tipo


de polimorfismo classificvel como ad-hoc. C++
permite que funes de mesmo nome tenham
parmetros distintos.

Herana e Polimorfismo em C++


#include <iostream.h>
//header file funcover.h
float abs(float a);
int abs(int a);

//implementation file
#include "funcover.h"
float abs(float a)
{
if (a>0.0) return a;
else return -a;
}
int abs(int a)
{
if (a>0) return a;
else return -a;
}

#include "funcover.h"
void main(){
int i1;
float f1;
cout << abs(int(-10))<<endl;
cout << abs(float(10.1))<<endl;
f1=-9.1;
i1=8.0;
cout << abs(f1) << endl;
cout << abs(i1) << endl;
}

Herana e Polimorfismo em C++


Outro exemplo de sobrecarga de funes
//header file funcover.h
float max(float a,float b);
float max(float a,float b,float c);
int max(int a,int b);

#include "funcover.h"
float max(float a,float b){
if (a>b) return a;
else return b;
}
float max(float a,float b,float c){
if (a>b) return max(a,c);
else return max(b,c);
}
int max(int a,int b){
if (a>b) return a;
else return b;
}

Herana e Polimorfismo em C++

#include <iostream.h>
#include "funcover.h"
void main()
{
cout << max(float(1.2),float(3.4),float(2.1))<<endl;
cout << max(float(1.5),float(.65)) << endl;
cout << max(int(12),int(120));
}

Herana e Polimorfismo em C++


Sobrecarga de Operadores
//header file para classe vetor: vet.h
#include <iostream.h>
#include <stdlib.h> //exit(1)
const int inicio=0; //inicio do vetor
class vetor{
private:
float* v; //pode ser qualquer tipo que atenda as operacoes < > =
int tamanho;
public:
vetor (int tamanho) ;
float& operator[] (int i);
float maximo(); //acha o valor maximo do vetor
int primeiro(void);
int ultimo(void);
};

Herana e Polimorfismo em C++


vetor::vetor (int tam)
{v=new float[tam]; tamanho=tam;}
int vetor::primeiro (void)
{return inicio;}
int vetor::ultimo (void)
{return tamanho-1;}
float& vetor::operator[](int i){
if (i<0 || i>=tamanho)
{cout << "Fora dos limites! Exit program"; exit(1);}
return v[i];
}
float vetor:: maximo(void)
{int candidato=inicio;
for (int i=inicio;i<tamanho;i++)
if (v[i]>v[candidato]) candidato=i;
return v[candidato];}

Herana e Polimorfismo em C++


iteradorvetor(vetor & v); :Construtor, j cria o
iterador de vetor inicializando-o para apontar para o
comeo do vetor.
virtual int comeca(); : Inicializa o iterador para o
comeo do vetor.
virtual int operator!(); : Verifica se a iterao no
chegou no fim do vetor: 1 indica que no chegou, 0
indica que chegou no fim do vetor.

Herana e Polimorfismo em C++


virtual int operator ++ (); : Faz o iterador mover
adiante uma posio.
virtual float operator() (); :Retorna o elemento
daquela posio do vetor.
virtual void operator= (float entra); : Atribui a
posio atual do vetor.
int pos(); : Retorna a posio (ndice) do vetor em
que o iterador se encontra, no virtual porque no
faz sentido para um iterador de rvore por exemplo.

Herana e Polimorfismo em C++


//it.h , arquivo com definicoes do iterador.
class iteradorvetor{
private:
vetor vetorref;
int posicao;
public:
iteradorvetor(vetor & v);
int comeca();
int operator!();
int operator ++ ();
float operator() ();
void operator= (float entra);
int pos(); //retorna posicao, n~ virtual pq n~ faz sentido p/ arvore por ex.
};

Herana e Polimorfismo em C++


int iteradorvetor::pos(){
return posicao;
}
int iteradorvetor::operator!(){
return posicao<=vetorref.ultimo();
}
iteradorvetor::iteradorvetor(vetor & vet):vetorref(vet){
comeca();
}

Herana e Polimorfismo em C++


int iteradorvetor::comeca(){
posicao=vetorref.primeiro();
return operator!();
}
int iteradorvetor::operator ++(){
posicao++;
return operator!();
}

Herana e Polimorfismo em C++


void iteradorvetor::operator=(float entra){
vetorref[posicao]=entra;
}
float iteradorvetor::operator() (){
float copia;
copia=vetorref[posicao];
return copia;
}

Herana e Polimorfismo em C++


#include <iostream.h>
#include "vet.h"
#include "it.h"
main()
{
int repete=0;
int ind;
float item;
vetor meu(5);
iteradorvetor itmeu(meu);
for (itmeu.comeca();!itmeu;++itmeu)
{
cout << "Entre com valor da posicao:" << itmeu.pos() << "\n";
cin >> item;
itmeu=item;
}

Herana e Polimorfismo em C++


for (itmeu.comeca();!itmeu;++itmeu) cout<< itmeu()<< " ";
cout << "\nEntre com o indice da posicao a atualizar:\n";
cin >> ind;
cout << "Entre com o valor a incluir:";
cin >> item;
meu[ind]=item;
for (int k=meu.primeiro();k<=meu.ultimo();k++) cout<< meu[k]<< " ";
cout <<endl << "Maximo:" << meu.maximo();
return 0;
}

Herana e Polimorfismo em C++


O significado do operador voc que define,
mas recomendvel dar ao operador um
significado prximo ao j definido na
linguagem. Por exemplo: o operador + seria
timo para representar a concatenao de
dois objetos do tipo string. A sintaxe de cada
operador fixa: nmero de operandos,
precedncia...

Herana e Polimorfismo em C++


Funes Virtuais Puras e Classes Abstratas

H situaes em que a desejvel garantir que


todas as classes derivadas de uma determinada
classe base suportassem um dado mtodo.
Entretanto, algumas vezes a classe base no tem
informao suficiente para permitir alguma
definio para uma funo virtual. Para estes
casos, C ++ suporta o conceito de funes
virtuais puras.

Herana e Polimorfismo em C++

Uma funo virtual pura no tem nenhuma


definio dentro da classe base. Para declarar
uma funo virtual pura, usa-se a forma

virtual tipo nome_funo (lista-args) = 0;

Herana e Polimorfismo em C++

Quando uma funo virtual feita pura, qualquer


classe derivada deve fornecer sua prpria
definio. Caso contrrio, um erro de compilao
ser acusado.
Classes que contenham pelo menos uma funo
virtual pura so chamadas de classes abstratas.

Herana e Polimorfismo em C++

Como uma classe abstrata contm um ou mais


mtodos para os quais no h definio (as
funes virtuais puras), objetos no podem ser
criados a partir de classes abstratas. Pode-se
dizer que uma classe abstrata a definio de um
tipo incompleto, que serve como fundao para
classes derivadas.

Herana e Polimorfismo em C++

Vantagem?
Objetos

no podem ser criados para classes abstratas,


mas apontadores para classes abstratas so vlidos.
Isto permite que classes abstratas suportem
polimorfismo em tempo de execuo.

Herana e Polimorfismo em C++


//exvetit6 , arquivo com definicoes do iterador.
class iterador{ //classe base abstrata
public:
int comeca(void)
{cout << "Erro, classe abstrata!";}
float operator()()
{cout << "Erro, classe abstrata!"; return 0;}
int operator!(void) {return 0;}
int operator ++() {return 0;}
void operator=(float entra) {;}
};
class iteradorvetor:public iterador
{
private:
vetor vetorref;
int posicao;
//classe filha acrescentando dados membro
public:
iteradorvetor(vetor & v);
int comeca();
int operator!();
int operator ++ ();
float operator() ();
void operator= (float entra);
int pos();

Herana e Polimorfismo em C++


Funes Amigas (Friend)

friends permite que uma classe toda ou uma


funo membro acesse atributos encapsulados de
outra classe. Por este motivo, friends representa
uma quebra do encapsulamento e deve portanto
ser usado com muita cautela.
Uma funo friend definida fora do escopo da
classe, mas tem o direito de acessar membros
private da classe (e protected via herana).

Herana e Polimorfismo em C++


Uma classe inteira pode ser declarada como
friend de outra classe;
Para declarar uma funo friend, uma clase
precede o prottipo da funo na definio da
classe com a palavra chave friend;
Para declarar uma classe amiga de outra
friend class ClasseDois; na definio da
ClasseUm.

Herana e Polimorfismo em C++


#include <iostream>
class Count {
friend void setX( Count &, int );
public:
Count() { x = 0; }
// constructor
void print() const { cout << x << endl; } // output
private:
int x; // data member
};

Herana e Polimorfismo em C++


void setX( Count &c, int val ) {
c.x = val; // legal: setX is a friend of Count
}
int main(){
Count counter;
cout << "counter.x depois da instancicao ";
counter.print();
cout << "counter.x depois da chamada da funcao amiga SetX: ";
setX( counter, 8 ); // atribui um valor a x com SetX
counter.print();
return 0;
}

Herana e Polimorfismo em C++

friends muito usado em conjunto com


operadores. Operadores so frequentemente
usados para implementar operaes entre tipos
enquanto que funes membro comuns so mais
usadas para passagem de mensagens alterando o
estado de um nico objeto, segundo alguns
parmetros, normalmente tipos simples.

Herana e Polimorfismo em C++


#include <iostream.h>

class relogio
{
friend class caixa_de_mensagem;
//permitiu acesso as definicoes private e public
private:
int hora;
int minuto;
int segundo;
//atributos private, encapsulados
public:
relogio(int h,int m,int s)
{hora=h; minuto=m; segundo=s;}
};

Herana e Polimorfismo em C++


class caixa_de_mensagem{
public:
void imprime(relogio a){
cout << a.hora << ":" << a.minuto << ":" << a.segundo
<< endl;
}
};

void main(){
relogio meurolex(11,30,10);
caixa_de_mensagem ativa;
ativa.imprime(meurolex);
}

Herana e Polimorfismo em C++


O uso do ponteiro this

Todo objeto tem acesso ao seu prprio endereo


atravs do ponteiro this.
O ponteiro this implicitamente usado para
prover referncia tanto para membros de dados
quanto para as funes membro do objeto

Herana e Polimorfismo em C++


#include <iostream>
class Test {
public:
Test( int = 0 );
void print() const;
private:
int x;
};

Herana e Polimorfismo em C++


Test::Test( int a ) { x = a; } // constructor
void Test::print() const {
cout << "
x = " << x
<< "\n this->x = " << this->x
<< "\n(*this).x = " << ( *this ).x << endl;
}

Herana e Polimorfismo em C++


int main()
{
Test testObject( 12 );
testObject.print();
return 0;
}

Herana e Polimorfismo em C++


Algumas Dicas

Classes abstratas no so instnciadas;


Se uma classe derivada de uma classe com funo virtual
pura, ento a classe derivada tb abstrata;
Atravs do uso de virtual e polimorfismo, uma chamada a
funo membro pode produzir aes diferentes, dependendo
do tipo do objeto que est recebendo a chamada;
Ponteiros declarados para classes abstratas so usados para
possibilitar manipulaes polimrficas de objetos de classe
derivadas quando tais objetos forem instnciados de classes
concretas;

Herana e Polimorfismo em C++

Declare o destrutor da classe base como virtual se a


classe possui funes virtuais;
erro tentar instanciar um objeto de uma classe abstrata;
Construtores no podem ser virtuais (erro).
Uma classe tornada abstrata quando se declara uma ou
mais funes membro virtual;
Uma funo virtual pura uma funo com um
inicializador =0 em sua declarao;

Herana e Polimorfismo em C++


#ifndef SHAPE_H
#define SHAPE_H
class Shape {
public:
virtual double area() const { return 0.0; }
virtual double volume() const { return 0.0; }
// pure virtual functions overridden in derived classes
virtual void printShapeName() const = 0;
virtual void print() const = 0;
};
#endif

Herana e Polimorfismo em C++


#ifndef POINT1_H
#define POINT1_H
#include <iostream>
#include "shape.h"
class Point : public Shape {
public:
Point( int = 0, int = 0 ); // default constructor
void setPoint( int, int );
int getX() const { return x; }
int getY() const { return y; }
virtual void printShapeName() const { cout << "Point: "; }
virtual void print() const;
private:
int x, y; // x and y coordinates of Point
};
#endif

Herana e Polimorfismo em C++


//point.cpp
#include "point1.h"
Point::Point( int a, int b ) { setPoint( a, b ); }
void Point::setPoint( int a, int b ){
x = a;
y = b;
}
void Point::print() const
{ cout << '[' << x << ", " << y << ']'; }

Herana e Polimorfismo em C++


#ifndef CIRCLE1_H
#define CIRCLE1_H
#include "point1.h"
class Circle : public Point {
public:
// default constructor
Circle( double r = 0.0, int x = 0, int y = 0 );
void setRadius( double );
double getRadius() const;
virtual double area() const;
virtual void printShapeName() const { cout << "Circle: "; }
virtual void print() const;
private:
double radius; // radius of Circle
};
#endif

Herana e Polimorfismo em C++


//circle1.cpp
#include <iostream>
#include "circle1.h"
Circle::Circle( double r, int a, int b )
: Point( a, b ) // call base-class constructor
{ setRadius( r ); }
void Circle::setRadius( double r ) { radius = r > 0 ? r : 0; }
double Circle::getRadius() const { return radius; }
double Circle::area() const
{ return 3.14159 * radius * radius; }
void Circle::print() const{
Point::print();
cout << "; Radius = " << radius;
}

Herana e Polimorfismo em C++


#ifndef CYLINDR1_H
#define CYLINDR1_H
#include "circle1.h"
class Cylinder : public Circle {
public:
// default constructor
Cylinder( double h = 0.0, double r = 0.0,
int x = 0, int y = 0 );
void setHeight( double );
double getHeight();
virtual double area() const;
virtual double volume() const;
virtual void printShapeName() const {cout << "Cylinder: ";}
virtual void print() const;
private:
double height; // height of Cylinder
};

Herana e Polimorfismo em C++


#include <iostream>
#include "cylindr1.h"
Cylinder::Cylinder( double h, double r, int x, int y ): Circle( r, x, y ) //constructor
{ setHeight( h ); }
void Cylinder::setHeight( double h ) { height = h > 0 ? h : 0; }
double Cylinder::getHeight() { return height; }
double Cylinder::area() const{
// surface area of Cylinder
return 2 * Circle::area() + 2 * 3.14159 * getRadius() * height;
}
double Cylinder::volume() const
{ return Circle::area() * height; }
void Cylinder::print() const{
Circle::print();
cout << "; Height = " << height;
}

Herana e Polimorfismo em C++


Polimorfismo Paramtrico (template)

Polimorfismo paramtrico um recurso bastante


til para evitar redundncia de cdigo, portanto
se trata de um meio de reuso deste. importante
para criar famlias de classes ou funes
relacionadas.

Herana e Polimorfismo em C++


Este recurso permite por exemplo definir uma
classe matriz uma nica vez num header file e
utilizar esta classe matriz para matrizes de tipo
float, tipo int ou long ,etc. Assim, por exemplo se
na sua classe matriz usa o operador %, todos os
tipos a serem instanciados (susbtitudos como tipo
usado na matriz) devem atender da maneira
desejada a esse operador.

Herana e Polimorfismo em C++


Se optar por templates, siga os seguintes passos:

Defina os tipos que voc quer parametrizar um termos de


chamadas de funes membro e operadores de nomes e
sintaxe iguais (uniformidade). Os tipos dos argumentos
vo variar.
Construa seu programa para operar em um s destes
tipos.
Termine incluindo as definies dos templates no
programa e testando para os demais tipos.
Corrija as eventuais falhas de substituio

Herana e Polimorfismo em C++


Templates de Classe
Um

gabarito de classe permite definir um padro para


definies de classes. Assim como para gabaritos de
funes, a declarao de um gabarito de classe
precedida por template class <T>, onde T apenas
uma referncia a tipo ou classe que ser utilizada na
declarao.

Herana e Polimorfismo em C++


template <class T>
class Vector {
T *data;
int size;
public:
Vector(int);
~Vector() { delete [] data; }
T& operator[] (int i) { return data[i]; }
};
// observe a sintaxe para definicao fora da classe
template <class T>
Vector< T> ::Vector(int n) {
data = new T[n];
size = n;

Herana e Polimorfismo em C++


// exemplo de declaracao
main () {
Vector <int> ix(5); // gera um vetor de inteiros
Vector <float> fx(6); // gera vetor de floats
//...
}

Herana e Polimorfismo em C++


classes gabaritos (as instncias de gabaritos
de classes) devem ser explcitas sobre os
parmetros sobre os quais elas iro
instanciar.

Herana e Polimorfismo em C++


Templates de funes

Considere a seguinte funo que troca os valores


de dois inteiros:
void swap (int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
}

Herana e Polimorfismo em C++


E se desejarmos trocar floats e longs?
E exemplo a seguir ilustra o uso do template
template <class T>
void swap (T& x, T& y) {
T tmp = x;
x = y;
y =tmp;
}

Herana e Polimorfismo em C++


Toda vez que a funo swap for chamada
com um dado par de tipos, o compilador C +
+ ir at a definio acima e criar uma outra
funo gabarito como uma instncia do
gabarito de funo acima. Funes gabaritos
podem ser sobrepostas por outras definies
para tipos especficos, se necessrio

E/S com streams em C++


Recursos de E/S
Biblioteca<iostream.h>
Streams = sequncia de bytes
Disponvel E/S no estilo C <stdio.h>
Uso dos recursos do C++ facilita a portabilidade
Do cdigo

E/S com streams em C++


A biblioteca iostrema

Fornece recursos de E/S


Define objetos do tipo cin, cout, cerr, clog;
<iomanip> declara processamento com arquivos
controlado pelo usurio;

E/S com streams em C++


Exemplos

cin >> nome


cout << nome
endl // gera um caracter de nova linha
cout << flush; //esvazia o buffer de sada

E/S com streams em C++


Encadeamento (c/ << sobregarregado)
cout << 2 mais 3 << (2+3) << endl;

Sada de char
char *string = teste;
cout << valor da string << string;

E/S com streams em C++


Permite ainda:

E/S formatada (classe ios)


Skipws (ignora espaos em branco)
Left (justifica a esquerda)
Right (justifica a direita)
Dec (inteiros na base 10)
Oct (inteiros na base 8)
Hex (inteiros na base 16)
Showpoint (especifica o nmero em ponto flutuante)
Uppercase (letras maisculas)
etc

E/S com streams em C++

Manipulao de arquivos
Notao cientfica
Vnculo de E/S

#include <iostream>
using std::cout;
using std::endl;
#include <iomanip>
using std::ios;
#include <cmath>
int main(){
cout << "Before setting the ios::showpoint flag\n"
<< "9.9900 prints as: " << 9.9900
<< "\n9.9000 prints as: " << 9.9000
<< "\n9.0000 prints as: " << 9.0000
<< "\n\nAfter setting the ios::showpoint flag\n";
cout.setf( ios::showpoint );
cout << "9.9900 prints as: " << 9.9900
<< "\n9.9000 prints as: " << 9.9000
<< "\n9.0000 prints as: " << 9.0000 << endl;
return 0;
}

Programao C++
No se integra a definio da classe com
arquivos cabealhos, por dois motivos:
desempenho

de compilao:

arquivos de cabealho so arquivos em cdigo fonte, sendo

portanto recompilados quando a aplicao que os incluem


modificada. Mantendo mtodos em um arquivo separado, seu
cdigo pode ser pr-compilado e integrado aplicao
durante a fase de ligao;

Programao C++
segredo tecnolgico:

ao entregar a implementao de mtodos em um arquivo


de cabealho, o projetista da classe estaria entregando o
cdigo fonte de como as suas funes foram
implementadas. Em alguns casos, isto seria altamente
indesejvel. A pr-compilao da implementao dos
mtodos permitiria que apenas a declarao das classes
fossem abertas, com o cdigo dos mtodos sendo
mantido fechado em bibliotecas de cdigo objeto.

Programao em C++
Arquivos Cabealhos (header)

cabealhos so usados para conter declaraes de


classes -- usualmente, um arquivo para cada
classe. Em geral, definies dos mtodos no so
includas em cabealhos, mas sim mantidas em
um arquivo parte

Programao em C++
Em uma aplicao que inclua dois mais dos cabealhos, um
erro de compilao seria gerado por estar definindo a classe
base mais de uma vez. A soluo para evitar este problema,
usar as diretivas de pr-processamento #define e #ifdef
juntamente com uma ``varivel de controle'': quando um
cabealho includo pela primeira vez, a varivel de
controle no estar definida; assim, o segmento do arquivo
de cabealho com a definio da classe includo e a
varivel de controle definida. Caso contrrio, a varivel de
controle j estar definida, e o restante do arquivo de
cabealho (a declarao da classe) pode ser ignorado.

Programao em C++
#ifndef VEHICLE_H
#define VEHICLE_H
class vehicle {
protected:
int wheels;
float weight;
public:
void initialize(int in_wheels, float in_weight);int get_wheels(void);
float get_weight(void);
float wheel_loading(void);
};
#endif

Programao em C++
Algumas recomendaes que, sendo
seguidas durante o desenvolvimento da
aplicao, podem auxiliar na minimizao
dos errose facilitar a manuteno de projetos
de software.

Programao em C++
1. Otimize cdigo apenas quando voc sabe que voc
tem um problema de desempenho. Pense duas vezes
antes de faz-lo.
2. Um arquivo de cabealho no deve conter mais do
que uma definio de classe.
3. Se h cdigo na sua aplicao que depende da
mquina onde a aplicao ser executada, coloque
este cdigo em um arquivo isolado, de forma que seja
fcil localiz-lo quando transferir sua aplicao para
outra mquina.

Programao em C++
4. Todo arquivo que contm cdigo fonte deve ser
documentado com comentrios introdutrios dando
informao sobre o nome do arquivo e seu contedo
5. Todos arquivos devem incluir informao de
copyright.
6. Escreva comentrios descritivos antes de cada funo.
7. Todo arquivo de cabealho deve conter o mecanismo
para evitar mltiplas incluses do mesmo arquivo.

Programao em C++
8. Escolha nomes de variveis que sugiram o seu uso.
9. Na definio de classes, ordene a declarao de
sees na ordem: pblica, protegida, privativa.
10. No define funes membro dentro da definio da
classe.
11. Sempre explicite o tipo de retorno de uma funo.
12. No especifique dados na seo pblica de uma
classe.

Programao em C++
13. Funes pequenas (por exemplo, simplesmente
retornar um valor de um membro da classe)
devem ser definidas como funo em linha.
14. Contrutores e destrutores no devem ser definidos
como funes em linha.
15. Uma funo membro que no afeta o estado de um
objeto deve ser declarada como const.
16. Use sobrecarga de operadores com parcimnia e
de maneira uniforme.

Programao em C++
17. Quando dois operadores tm usualmente
significados opostos (como == e !=),
apropriado definir ambos.
18. Evite funes com muitos argumentos.
19. Evite o uso de nmero varivel de argumentos.
20. Quando sobrecarregando funes, todas as
variaes devem ter a mesma semntica, isto ,
devem ser usadas para o mesmo fim.

Programao em C++
21. Uma funo pblica nunca deve retornar uma
referncia ou um apontador para uma varivel
local.
22. Evite funes longas e complexas.
23. No use a diretiva de processador #define para
definir macros; prefira a definio de funes em
linha.
24. Defina constantes usando const ou enum; nunca
use #define.

Programao em C++
25. Evite o uso de valores numricos no cdigo; d
preferncia ao uso de valores simblicos.
26. Variveis devem ser declaradas dentro do menor
escopo possvel.
27. Toda varivel que declarada deve receber um
valor antes de ser utilizada.
28. Evite o uso de apontadores para apontadores.
29. Evite o uso de converses explcitas de tipos
(casts).

Programao em C++
30. No escreva cdigo que dependa de funes que
usam converso implcita de tipos.
31. O cdigo aps um case deve sempre ser seguido
por um comando break.
32. Um comando switch deve sempre ter uma opo
default para manipular casos inesperados.
33. Nunca use goto.
34. Sempre use unsigned para uma varivel que se
espera que no v assumir valores negativos.

Programao em C++
35. Evite o uso de continue.
36. O uso de break para sair de laos deve ser
preferido ao uso de variveis de flag.
37. Use parnteses para deixar claro a ordem de
avaliao de operadores em expresses.
38. No use malloc, realloc ou free.
39. Sempre use colchetes vazios ([]) quando
removendo arranjos com delete.

Programao em C++
40. Evite usar dados globais.
41. No aloque memria esperando que outro algum ir
desaloc-la mais tarde.
42. Verifique os cdigos de falhas de funes de bibliotecas
por mais seguro que as chamadas possam parecer.
43. No assuma que um int tem 32 bits ou que tem o
mesmo tamanho de um long ou de um apontador.
44. No assuma que voc sabe como um certo tipo de dado
representado em memria.

Referncias
Object-Oriented Modeling and Design
James Rumbaugh, Michael Blaha, William
Premerlani, Frederick Eddy, William Lorensen
Prentice Hall International Editions, 1991.
The C ++ Programming Language, 2nd Edition
Bjarne Stroustrup
Addison Wesley, 1991.
C ++: the Complete Reference
Herbert Schildt
Osborne/McGraw-Hill, 1991.

Вам также может понравиться