You are on page 1of 10

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

DEFINIO DE CLASSES EM C++


Linguagem Compilada Orientada a Objectos, considerada como o C da prxima
gerao, criada em meados dos anos 80.
No nos debruaremos sobre o paradigma da Programao Orientada para Objectos
uma vez que j foi objecto de estudo em disciplinas anteriores. Referiremos smente
alguns aspectos da linguagem de modo a permitir criar e manipular estruturas que
sero a base dos tipos abstractos de dados que estudaremos ao longo da disciplina.
Classes
Class nome da classe
{
private:
membros privados
protected:
membros protegidos
public:
membros pblicos
};
Na declarao da classe so colocados os prottipos dos mtodos, s em mtodos com
cdigo reduzido feita a definio dentro da estrutura class.
Definio de mtodos fora da estrutura class:
[Tipo_retorno] nome_classe :: nome_mtodo([parametros])
{
codigo do metodo
}
EXEMPLO:
#include <iostream.h>
class circulo
{
private:
int coordx;
int coordy;
int raio;
char * cor;
public:
circulo(); //construtor
circulo(int x,int y,int r,char *c); //construtor
circulo(const circulo c); //construtor cpia que se ver mais adiante
~circulo(); //destrutor que se ver mais adiante
void listar();
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
1

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

};
circulo::circulo()
{
coordx=0;
coordy=0;
raio=0;
cor=NULL;
};
circulo::circulo(int x,int y,int r,char *c)
{
coordx=x;
coordy=y;
raio=r;
cor=new char[strlen(c) +1];
strcpy(cor,c);
};
circulo::circulo (const circulo &c) //construtor cpia descrito mais tarde
{
raio=c.raio;
coordx=c.coordx;
coordy=c.coordy;
cor= new char [strlen(c.cor)+1] ;
strcpy(cor,c.cor);
};
circulo::~circulo () //destrutor descrito mais tarde
{
delete [] cor;
};
void circulo::listar()
{
cout<<"cordenada x="<<coordx<<'\n';
cout<<"cordenada y="<<coordy<<'\n';
cout<<"raio="<<raio<<'\n';
cout<<"cor="<<cor<<'\n';
};
void main()
{
circulo c1;
circulo c2(10,15,33,"Azul");
c1.listar();
c2.listar();
}

FUNES e PARMETROS
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
2

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

int f1(int x)
int f2(int& y)
int f3(const int& z)

x parmetro valor
y parmetro referncia
z parmetro referncia cons tante

EXEMPLO:
#include <iostream.h>
#include<string.h>
class circulo
{
private:
int coordx;
int coordy;
int raio;
char *cor;
public:
circulo();
circulo(int x,int y,int r,char *c);
... ... ...
void listar();
void testaParam1(int a);
void testaParam2(int& a);
void testaParam3(const int& a);
};
circulo::circulo()
{
coordx=0;
coordy=0;
raio=0;
cor=NULL;
};
circulo::circulo(int x,int y,int r,char *c)
{
coordx=x;
coordy=y;
raio=r;
cor=new char[strlen(c) +1];
strcpy(cor,c);
};
void circ ulo::listar()
{
cout<<"coordenada x="<<coordx<<'\n';
cout<<"coordenada y="<<coordy<<'\n';
cout<<"raio="<<raio<<'\n';
cout<<"cor="<<cor<<'\n';
};
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
3

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

void circulo::testaParam1(int a)
{
a=11;
raio=a;
};
void circulo::testaParam2(int& a)
{
a=22;
raio=a;
};
void circulo::testaParam3(const int& a)
{
//a=33; Erro, constante no admite atribuio
raio=a;
};
void main()
{
int i;
circulo c(10,15,100,"Amarelo");
c.listar();
i=4;
c.testaParam1(i);
cout<<"i="<<i<<'\n';
c.listar();
c.testaParam2(i);
cout<<"i="<<i<<'\n';
c.listar();
c.testaParam3(i);
cout<<"i="<<i<<'\n';
c.listar();
}
RESULTADOS
coordenada x=10
coordenada y=15
raio=100
cor=Amarelo
i=4
// i no foi alterado passagem por valor
cordenada x=10
coordenada y=15
raio=11
cor=Amarelo
i=22

// i foi alterado passagem por referncia

___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
4

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

coordenada x=10
coordenada y=15
raio=22
cor=Amarelo
i=22 // i no admitiu alterao dentro do mtodo
coordenada x=10
coordenada y=15
raio=22
cor=Amarelo

PARMETROS VALOR
Sempre que h uma passagem de parmetros por valor executado o construtor cpia
do tipo de dados do parmetro formal.
Quando uma funo termina destrutores dos tipos de dados dos parmetros formais
"destroem" os valores desses parmetros.
PARMETROS REFERNCIA
Os parmetros actuais so ligados aos parmetros formais, no existe cpia dos
parmetros, como no caso anterior. O nome dos parmetros formais substitui o nome
dos parmetros actuais. Poupa-se tempo. Qualquer alterao do parmetro formal,
altera o parmetro actual.
PARMETROS REFERNCIA CONSTANTE
Neste caso o parmetro formal substitui o actual ,mas como constante, no admite
alterao de valor.
Nota: Se no pretendemos alterar o valor do parmetro actual usamos uma passagem
por valor no caso de tipos de dados primitivos, no caso de outros tipos de dados
dever-se- usar referncia constante.

VALORES DE RETORNO
Os valores de retorno podem ser do tipo valor, referncia e referncia constante
No caso dos valores de retorno, se for devolvido um valor (objecto), aquilo que
devolvido copiado no ambiente de retorno, recorrendo-se ao construtor cpia.
Exemplo1:
int circulo::retornaRaio()
{
return raio;
};
Por questes de eficincia, no caso da devoluo de tipos no primitivos, no
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
5

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

devemos usar o retorno por valor mas o retorno de referncia, evitando-se a


invocao do construtor cpia
Exemplo2:
int& circulo::retornaRaio()
{
return raio;
};

NOTA1:S podemos devolver referncias de objectos globais funo.


NOTA2:H um alias entre a funo e o objecto que ela devolve, no exemplo anterior
podemos alterar o valor do raio invocando retornaRaio()++.
Se o valor a devolver for uma referncia constante j no admite a invocao anterior.
EXEMPLO3
const int& circulo::retornaRaio()
{
return raio;
};
EXEMPLO4
class pequena
{
private:
int x;
public:
pequena();
pequena(int a);
void listar();
int & obterx();
int& obtermembro();
};

pequena::pequena()
{
x=5;
};
pequena::pequena(int a)
{
x=a;
};
void pequena::listar()
{
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
6

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

cout<<"x="<<x<<'\n';
};
int& pequena::obter2x()
{
x=2*x;
return x;
};
int& pequena::obtermembro()
{
return x;
}
void main()
{
int i;
pequena p(45);
p.listar();
const int& y=p.obter2x();
cout<<"y="<<y<<'\n';
//y++;Erro como a referncia y constante no admite atribuio
cout<<p.obtermembro()<<'\n';
i=p.obter2x();
cout<<"y="<<y<<'\n';
// Se obter2x()devolvesse uma referencia constante isto no era possivel
p.obter2x()++
p.listar();
}
RESULTADOS:
x=45
Y=90
90
Y=180
x=361
FUNES CONSTANTES
Mtodos constantes no permitem que sejam alterados os objectos que os invocam.
Void circulo::alteraRaio() const
{
raio=88; // ERRO,estamos a alterar um membro de dados do objecto circulo que
invocou o mtodo
};

CONSTRUTORES
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
7

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

1. Sem Parmetros
circulo();
2. Com Parmetros e Parmetros por defeito
circulo(int x,int y,int r,char *c)
circulo(int x=0,int y=0,int r=5,char * c="azul")
Os valores por defeito (0,0,5,azul) s so indicados na
declarao do mtodo.
3. Cpia
circulo(const circulo& c)
Tem a mesma designao da classe
No devolvem quaisquer valores
NOTA: Temos que implementar o construtor cpia sempre que na classe existem
membros de dados no primitivos ou que exigem alocao dinmica de memria.

CONSTRUTOR CPIA
Este construtor caracteriza-se por ter um s parmetro, parmetro esse que do
mesma classe a que pertence o construtor ou em que o 1 parmetro (no caso de ter
mais do que um parmetro) do mesmo tipo que a classe.
Quando se passa um objecto por valor a uma funo o compilador invoca de forma
automtica o construtor cpia.
Assim, na construo de construtores cpia no podemos passar o objecto, seno
cairamos numa recursividade infinita, logo h que passar uma referncia para o
objecto. Se tal no fizermos o compilador de C++ assinala erro. Atendendo a que no
se pretende alterar o objecto que passado por referncia essa referncia dever ser
constante
Quando uma funo devolve um objecto tambm invocado o construtor cpia.
Se passarmos e devolvermos referncias para objectos em vez dos prprios objectos
eliminamos o overhead de invocao do construtor cpia.
Se o construtor cpia no estiver definido, sempre que numa funo h a passagem
ou retorno de um objecto , o compilador gera um construtor cpia automticamente,
criando um novo objecto atravs de uma operao de cpia membro a membro do
objecto que passado. Isto tem problemas sempre que o objecto tem um atributo que
exige alocao de memria porque so igualados apontadores, passando a ter a mesma
rea de memria referenciada por dois apontadores pertencentes a objectos distintos.
Exemplo: Voltemos classe circulo
//construtor cpia
circulo::circulo (const circulo &c)
{
raio=c.raio;
coordx=c.coordx;
coordy=c.coordy;
cor= new char [strlen(c.cor)+1] ;
strcpy(cor,c.cor);
___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
8

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

};

Este tipo de construtor no seria gerado automticamente, h necessidade do


programador o construir, porque na gerao automtica seriam igualados os
apontadores cor e c.cor.
Dispondo de construtor cpia, podemos criar um objecto custa de outro j criado, do
seguinte modo:
circulo circ1(8,5,30,rosa);
circulo circ2(circ1);
Assim circ2 um crculo inicializado com os mesmos dados de circ1, para tal
recorreu ao construtor cpia.
Um objecto pode ainda ser criado dinamicamente atravs do operador new que alm
de alocar espao na memria invoca o respectivo construtor.
Assim, poderamos ter o seguinte cdigo:
circulo * apcirc1;
apcirc1=new circulo(10,11,12,"verde"); //cria o objecto e invoca o construtor com parmetros
apcirc1->listar();
OU
circulo *apcic1= new circulo(10,11,12,"verde");
Para libertar o espao ocupado pele objecto far-se-ia delete apcirc1, que
automaticamente invocaria o destrutor de circulo

DESTRUTORES
1. Tem a mesma designao da classe precedidos de ~
~circulo();
2. No tem parmetros
3. No devolvem quaisquer valores
4. No so invocados explicitamente.
5. So invocados automaticamente sempre que termina o mbito de um objecto da
classe ou que feito delete de um ponteiro para um objecto da classe.
6. necessrio implementar os destrutores sempre que os membros de dados fazem
alocao dinmica de memria, para libertarem o espao alocado por esses
membros.
No exemplo do crculo o destrutor teria o seguinte cdigo:
circulo::~circulo()
{
delete [ ] cor;
}

___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
9

Estruturas de Informao - Aspectos Essenciais da Linguagem C++

___________________________________________________________________________________

Neste programa considerou-se ainda implementado no destrutor a libertao do


ponteiro cor. Quando o mbito de um objecto finaliza invocado o destrutor e assim
libertado o espao de memria, que tinha sido alocado para a cor atravs de new no
respectivo construtor.

SOBRECARGA DE OPERADORES
1. Permite reescrever codigo para operadores de modo a manipularem operandos de
classe diferente da que esto predefinidos.
2. No possvel alterar a precedncia nem o nmero de operandos.
EXEMPLO: Sobrecarregar o operador + para a classe circulo, supondo que o circulo
resultado, mantem a origem do primeiro operando e o raio a soma dos raios.

Circulo circulo::operator +( const circulo& c)


{
circulo temp;
temp.coordx=this->coordx;
temp.coordy=this->coordy;
temp.raio=this->raio + c.raio;
return temp;
}
Nas aulas prticas sero implementadas outras classes e feitos outros operadores,
como o de atribuio, os de comparao,...
H operadores que no admitem sobrecarga, tal ocaso de :
. :: ?: #
Quando um operador definido como mtodo de uma classe, tem meno s um
parmetro do que se fosse definido como uma funo normal fora da classe. Isto
porque o primeiro parmetro de um operador definido como funo membro de uma
classe o objecto que invoca o mtodo,que passado como parmetro implcito. No
exemplo anterior, soma de dois crculos, s consideramos um parmetro
correspondente ao 2 operando do operdor +, o primeiro operando ser o objecto
referenciado por this.

___________________________________________________________________________________
Departamento de Eng Informtica do ISEP
10

You might also like