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