16.04.2013 Views

Declaração de classes Uma classe em C++ é uma extensão do ...

Declaração de classes Uma classe em C++ é uma extensão do ...

Declaração de classes Uma classe em C++ é uma extensão do ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CARACTERÍSTICAS DE <strong>C++</strong> QUE IMPLEMENTAM<br />

CONCEITOS DE ORIENTAÇÃO A OBJETOS<br />

<strong>Declaração</strong> <strong>de</strong> <strong><strong>classe</strong>s</strong><br />

<strong>Uma</strong> <strong>classe</strong> <strong>em</strong> <strong>C++</strong> <strong>é</strong> <strong>uma</strong> <strong>extensão</strong> <strong>do</strong><br />

registro (struct) <strong>em</strong> C, adicionan<strong>do</strong>-se a<br />

possibilida<strong>de</strong> <strong>de</strong> <strong>de</strong>finir componentes que são<br />

funções (m<strong>é</strong>to<strong>do</strong>s).<br />

Formato:<br />

class <br />

{<br />

<br />

public<br />

<br />

};<br />

on<strong>de</strong>...<br />

i<strong>de</strong>ntifica<strong>do</strong>r da <strong>classe</strong>. Po<strong>de</strong> ser<br />

qualquer nome único no escopo.<br />

lista das <strong><strong>classe</strong>s</strong>-base (super-<strong><strong>classe</strong>s</strong>)<br />

das quais a <strong>classe</strong> <strong>é</strong> <strong>de</strong>rivada<br />

<strong>de</strong>claração <strong>do</strong>s m<strong>em</strong>bros<br />

priva<strong>do</strong>s da <strong>classe</strong>.<br />

<strong>de</strong>claração <strong>do</strong>s m<strong>em</strong>bros<br />

públicos da <strong>classe</strong>.


ex<strong>em</strong>plo:<br />

______________________________________________<br />

class intervalo<br />

{<br />

float esq, dir;<br />

public:<br />

void intervalo (float e, float d)<br />

{<br />

esq = e;<br />

dir = d;<br />

}<br />

float LimiteEsq( )<br />

{ return esq; }<br />

float LimiteDir( )<br />

{ return dir; }<br />

bool Cont<strong>em</strong>(float f)<br />

{ if ( (f>esq) && (f


Obs:<br />

A primeira parte da <strong>de</strong>finição, acima da linha<br />

public:<br />

<strong>é</strong> a parte privada, que <strong>é</strong> visível somente <strong>de</strong>ntro<br />

da <strong>classe</strong>.<br />

Na parte pública <strong>é</strong> <strong>de</strong>finida <strong>uma</strong> função com<br />

mesmo nome da <strong>classe</strong> (intervalo), que <strong>é</strong><br />

usada para construção <strong>de</strong> objetos e <strong>é</strong> chamada<br />

<strong>de</strong> construtor da <strong>classe</strong>.<br />

Especifica<strong>do</strong>res <strong>de</strong> acesso<br />

M<strong>em</strong>bros <strong>de</strong> <strong>uma</strong> <strong>classe</strong> (variáveis ou<br />

funções) po<strong>de</strong>m adquirir atributos <strong>de</strong> acesso<br />

por <strong>de</strong>fault ou atrav<strong>é</strong>s <strong>do</strong> uso <strong>do</strong>s<br />

especifica<strong>do</strong>res public, private e<br />

protected. Isso especifica a visibilida<strong>de</strong> <strong>do</strong><br />

el<strong>em</strong>ento fora da <strong>classe</strong>.


Se um m<strong>em</strong>bro <strong>é</strong> público, ele po<strong>de</strong> ser<br />

referencia<strong>do</strong> <strong>em</strong> qualquer parte <strong>do</strong> programa.<br />

Se priva<strong>do</strong>, só po<strong>de</strong> ser referencia<strong>do</strong> pelas<br />

funções-m<strong>em</strong>bro da <strong>classe</strong> on<strong>de</strong> foi <strong>de</strong>clara<strong>do</strong><br />

e pelas funções amigas (friend - ver adiante).<br />

M<strong>em</strong>bros <strong>de</strong> <strong>uma</strong> <strong>classe</strong> são priva<strong>do</strong>s por<br />

<strong>de</strong>fault.<br />

Um m<strong>em</strong>bro protegi<strong>do</strong> <strong>é</strong> referencia<strong>do</strong> da<br />

mesma maneira que um priva<strong>do</strong>. Al<strong>é</strong>m disso,<br />

por<strong>é</strong>m, o m<strong>em</strong>bro po<strong>de</strong> ser usa<strong>do</strong> pelas<br />

funções-m<strong>em</strong>bro das <strong><strong>classe</strong>s</strong> <strong>de</strong>rivadas<br />

(sub<strong><strong>classe</strong>s</strong>) da <strong>classe</strong> on<strong>de</strong> foi <strong>de</strong>clara<strong>do</strong>.<br />

Obs: Os especifica<strong>do</strong>res <strong>de</strong> acesso têm estreita<br />

relação com o conceito <strong>de</strong> encapsulamento.


Objetos<br />

Objetos <strong>de</strong> <strong>uma</strong> <strong>classe</strong> são cria<strong>do</strong>s <strong>em</strong> <strong>C++</strong><br />

<strong>de</strong>claran<strong>do</strong>-os <strong>de</strong> forma s<strong>em</strong>elhante às<br />

variáveis. Por ex<strong>em</strong>po, x po<strong>de</strong>ria ser <strong>de</strong>clara<strong>do</strong><br />

como um objeto da <strong>classe</strong> intervalo por:<br />

intervalo x;<br />

Esse objeto possui suas próprias variáveis<br />

privadas - esq e dir – e está equipa<strong>do</strong> com as<br />

funções <strong>de</strong>finidas na sua <strong>classe</strong>.<br />

O construtor (a função intervalo) po<strong>de</strong><br />

ser ativa<strong>do</strong> para a criação <strong>de</strong> um objeto com<br />

<strong>do</strong>is parâmetros. Por ex<strong>em</strong>plo, x po<strong>de</strong>ria ser<br />

inicializa<strong>do</strong> como o intervalo (1.5, 2.8) pela<br />

<strong>de</strong>claração<br />

intervalo x(1.5, 2.8);<br />

<strong>Uma</strong> vez executada a <strong>de</strong>claração <strong>de</strong> um<br />

objeto, qualquer <strong>de</strong> seus el<strong>em</strong>entos públicos<br />

po<strong>de</strong>m ser referencia<strong>do</strong>s prefixan<strong>do</strong>-se o nome<br />

<strong>do</strong> objeto ao nome <strong>do</strong> componente, usan<strong>do</strong>-se<br />

um ponto como separa<strong>do</strong>r.


Por ex<strong>em</strong>plo, o limite esquer<strong>do</strong> <strong>do</strong> intervalo x<br />

po<strong>de</strong>ria ser obti<strong>do</strong> por<br />

x.LimiteEsq( )<br />

Essa <strong>é</strong> a única forma <strong>de</strong> acesso aos<br />

el<strong>em</strong>entos na área privada <strong>do</strong> objeto. Eles não<br />

estão disponíveis a operações que não façam<br />

parte da <strong>de</strong>finição da <strong>classe</strong> a qual pertence o<br />

objeto.<br />

>> encapsulamento.<br />

Amigos (friends)<br />

Po<strong>de</strong>-se dar a <strong>uma</strong> função externa direito<br />

<strong>de</strong> acesso aos el<strong>em</strong>entos priva<strong>do</strong>s <strong>de</strong> <strong>uma</strong><br />

<strong>classe</strong>, <strong>de</strong>claran<strong>do</strong> aquela função como amiga<br />

(friend) no interior da <strong>de</strong>claração da <strong>classe</strong>.<br />

Um amigo, mesmo não sen<strong>do</strong> m<strong>em</strong>bro<br />

daquela <strong>classe</strong>, possui completo direito <strong>de</strong><br />

acesso aos seus m<strong>em</strong>bros.


Ex:<br />

A função ImprimeIntervalo (externa à<br />

<strong>classe</strong> intervalo) po<strong>de</strong>ria ser <strong>de</strong>finida assim:<br />

void ImprimeIntervalo(Intervalo x)<br />

{<br />

cout


Herança<br />

Herança <strong>é</strong> impl<strong>em</strong>entada <strong>em</strong> <strong>C++</strong> atrav<strong>é</strong>s<br />

<strong>do</strong> conceito <strong>de</strong> <strong>classe</strong> <strong>de</strong>rivada.<br />

<strong>Uma</strong> <strong>classe</strong> <strong>de</strong>rivada herda to<strong>do</strong>s os<br />

m<strong>em</strong>bros da <strong>classe</strong>-base (super<strong>classe</strong>).<br />

A sintaxe para <strong>de</strong>clarar <strong>uma</strong> <strong>classe</strong> <strong>de</strong>rivada <strong>é</strong>:<br />

Class:public<br />

<br />

{<br />

<br />

}<br />

Essa <strong>de</strong>claração torna to<strong>do</strong>s os m<strong>em</strong>bros<br />

públicos da <strong>classe</strong>-base m<strong>em</strong>bros públicos da<br />

<strong>classe</strong> <strong>de</strong>rivada.<br />

Outra alternativa seria:<br />

class : <br />

{<br />

<br />

}


Sobrescrita <strong>de</strong> funções e Polimorfismo<br />

É possível acontecer que <strong><strong>classe</strong>s</strong><br />

<strong>de</strong>rivadas impl<strong>em</strong>ent<strong>em</strong> diferentes versões <strong>de</strong><br />

<strong>uma</strong> função da <strong>classe</strong> base.<br />

Se essa re<strong>de</strong>finição ocorrer com a mesma<br />

assinatura (nome, lista <strong>de</strong> parâmetros e tipo<br />

<strong>de</strong> retorno), ocorre sobrescrita (overiding) - a<br />

sub<strong>classe</strong> reescreve a função, quebran<strong>do</strong>,<br />

portanto a herança para aquela função.<br />

OBS: se houver na sub<strong>classe</strong> <strong>uma</strong> função com<br />

mesmo nome <strong>de</strong> <strong>uma</strong> presente na <strong>classe</strong> base,<br />

por<strong>é</strong>m com lista <strong>de</strong> parâmtros e/ou tipo <strong>de</strong><br />

retorno diferentes, estará haven<strong>do</strong> sobrecarga<br />

(overloading).<br />

A sub<strong>classe</strong> herda normalmente a função,<br />

por<strong>é</strong>m dispõe <strong>de</strong> outra operação (com mesmo<br />

nome).<br />

Para que essa re<strong>de</strong>finção seja permitida, a<br />

função <strong>de</strong>ve ser <strong>de</strong>clarada como virtual.<br />

Funções virtuais são fundamentais para a<br />

impl<strong>em</strong>entação <strong>do</strong> conceito <strong>de</strong> polimorfismo.


O ex<strong>em</strong>plo a seguir ilustra esses conceitos:<br />

#inclu<strong>de</strong> <br />

class Quadrilatero<br />

{<br />

struct TipoPonto<br />

{<br />

float X;<br />

float Y;<br />

};<br />

protected:<br />

struct TipoPonto P1,P2,P3,P4;<br />

public:<br />

Quadrilatero() { }<br />

virtual void Qu<strong>em</strong>Sou()<br />

{<br />

cout


class Trapezio: public Quadrilatero<br />

{<br />

public:<br />

Trapezio(): Quadrilatero() { }<br />

virtual void Qu<strong>em</strong>Sou() {<br />

cout


}<br />

// vetor <strong>de</strong> ponteiros para<br />

// quadriláteros:<br />

Quadrilatero * ConjQuad[19];<br />

ConjQuad[0] = &X;<br />

ConjQuad[1] = &Y;<br />

ConjQuad[2] = &Z;<br />

ConjQuad[3] = &K;<br />

for (int i=0; i Qu<strong>em</strong>Sou();<br />

OBS: o polimorfismo <strong>é</strong> um conceito muito útil na<br />

prática.<br />

>> no ex<strong>em</strong>plo acima, um conjunto <strong>de</strong> objetos<br />

<strong>de</strong> <strong><strong>classe</strong>s</strong> diferentes (por<strong>é</strong>m da mesma hierarquia<br />

<strong>de</strong> <strong><strong>classe</strong>s</strong>) po<strong>de</strong> ser trata<strong>do</strong> <strong>de</strong> maneira uniforme. A<br />

mesma mensag<strong>em</strong> ativará funções diferentes,<br />

conforme a <strong>classe</strong> <strong>do</strong> objeto-alvo.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!