Você está na página 1de 10

1

Classes e Objetos
Conceitos de orientao a objetos
Objetos
Objetos so o empacotamento de procedimentos e dados relacionados. Na maioria dos casos
correspondem aos objetos de negcio do mundo real tais como: pedidos, faturas, produtos,
mquinas, departamentos, pessoas, etc.
A idia bsica desta tecnologia replicar a forma como so construdos os equipamentos de
hardware. Nesta analogia, os objetos se comportam como uma "caixa preta", equivalente, aos
circuitos integrados utilizados na construo dos referidos equipamentos.
Classes
Classes (class) so como gabaritos para definio de tipos de objetos. So parecidas com
estruturas (struct), porm fornecem mais recursos ao programador.
Uma classe define objetos que compartilham estrutura e comportamento comuns.
Por exemplo, todo objeto Nota Fiscal poderia ser descrito como uma nica classe de Notas Fiscais,
onde estariam especificados todas as propriedades ou os atributos de todas as notas, assim como
os procedimentos ou servios possveis de serem oferecidos por essas notas.
Classe representa uma abstrao.
A varivel de uma classe chamada de objeto ou instncia de classe.
A diferena fundamental entre classes e objetos est no fato de um objeto constituir uma entidade
concreta com tempo e espao de existncia, enquanto a classe somente uma abstrao.
Por exemplo, podemos abstrair uma classe lapis que formaliza todas as propriedades deste tipo
de instrumento para escrever, mas no se consegue escrever sem ter em mos um objeto desta
classe.
Membros (atributos e mtodos) de uma classe
Uma classe possui dados (que definem suas propriedades) e procedimentos (que devem ser
executados sobre esses dados).
Esses dados e procedimentos so denominados de membros da classe.
Os dados caracterizam atributos e os procedimentos caracterizam mtodos da classe.
$WULEXWRV

Os atributos ou variveis membros, em geral, devem ser manipulados por mtodos associados
classe.
Existem dois tipos de atributos:
o Atributos de objetos - Descrevem valores mantidos em um objeto. Diferentes objetos de
uma mesma classe no compartilham os atributos de objetos.
o Atributos de classe - Quando um atributo compartilhado entre os vrios objetos da classe,
eles constituem um atributo de classe. Por exemplo, um atributo de classe que constitui um
contador de objetos da classe. Ao se criar um objeto, incrementa-se esse atributo e
decrementa-o quando o objeto desaparecer (veja exemplo no prximo captulo).

0pWRGRV

Mtodo um comportamento especfico, residente no objeto, que define como ele dever agir
quando invocado. Em termos de programao, os mtodos esto implementados em funes
membro.

Encapsulamento em C++ usando o especificador de acesso


Para a anlise orientada a objeto, encapsulamento o ato de esconder do usurio informaes que
no so de seu interesse. O objeto como uma caixa preta, que realiza determinada operao, mas
o usurio no sabe (e no precisa saber) exatamente como.
Para implementar o conceito de encapsulamento, o C++ oferece as seguintes opes:
o public: significa que o atributo ou mtodo faz parte da interface do objeto, podendo ser
acessada a qualquer instante;
o protected: significa que o atributo ou mtodo est protegido de acesso externo. S pode
ser acessado pelos mtodos da classe e pelos mtodos da classe derivada;
o private: atributos e mtodos s podem ser acessados pelos mtodos da classe (mtodos
internos da classe e mtodos friend). o default. Em struct o default public.
Definindo uma classe
A definio da classe ser composta pela palavra chave class, o nome da classe, as variveis
membro (atributos) e as funes membro (mtodos).
Sintaxe:

class <nome da classe>


{
private:
// especificador de acesso
< atributos e mtodos privados >
protected: // especificador de acesso
< atributos e mtodos protegidos >
public:
// especificador de acesso
< atributos e mtodos pblicos >
};
Todo membro de uma classe deve ter a visibilidade private, a menos que possa ser comprovado
que o elemento precise de visibilidade public ou protected.

Exemplo
No exemplo a seguir, os atributos iNmero e cLogradouro no podem ser acessado diretamente,
mas podem ser acessados pelos mtodos Atribui_Endereco e Exibe_Endereco.
Observe que a definio dos mtodos utiliza o operador de escopo (::).
#include <iostream>
using namespace std;
// declarao da classe
class TEndereco
{
private:
int iNumero;
char cLogradouro[30];
public:
void Atribui_Endereco();
void Exibe_Endereco();
};
// funo principal
int main(int argc, char *argv[])
{
TEndereco t1;
t1.Atribui_Endereco();
t1.Exibe_Endereco();
cout << endl;
system("pause");
return 0;
}

// implementao dos mtodos


void TEndereco::Atribui_Endereco()
{
cout << "Endereco "; cin.getline(cLogradouro, 29);
cout << "Numero ";
cin >> iNumero;
}
void TEndereco::Exibe_Endereco()
{
cout << "Endereco " << cLogradouro << ", " << iNumero;
}
/*
Endereco Rua da Consolao
Numero 930
Endereco Rua da Consolao, 930
Pressione qualquer tecla para continuar. . .
*/

Observao: deve-se evitar o uso de comandos de entrada e sada dentro de mtodos, a no ser que sejam
mtodos especficos de entrada ou sada de dados. Isto faz com que a reutilizao da classe seja mais fcil.
Mtodos set e get
comum a criao de mtodos de acesso (leitura e escrita) aos atributos privados. Em geral os
mtodos de leitura comeam com o prefixo get e os mtodos de escrita comeam com o prefixo
set.
Exemplo:
#include <iostream>
#include <string>
using namespace std;
// declarao da classe
class Pessoa
{
private:
string nome;
int idade;
public:
void setNome(string n);
string getNome();
void setIdade(int i);
int getIdade();
};
// definio dos mtodos set e get
void Pessoa::setNome(string n)
{
nome = n;
}
string Pessoa::getNome()
{
return nome;
}
void Pessoa::setIdade(int i)
{
idade = i;
}
int Pessoa::getIdade()
{
return idade;
}

Linguagem Orientada a Objetos

// funo principal
int main(int argc, char *argv[])
{
Pessoa p;
p.setNome("Sergio");
p.setIdade(18);
cout << "Nome = " << p.getNome() << endl;
cout << "Idade = " << p.getIdade() << endl;
system("pause");
return 0;
}
/*
Nome = Sergio
Idade = 18
Pressione qualquer tecla para continuar. . .
*/

Outra soluo (utilizando uma unidade independente para a classe Pessoa):


Arquivo: pessoa.h
#ifndef PESSOA_H
#define PESSOA_H
#include <string>
using namespace std;
class Pessoa
{
private:
string nome;
int idade;
public:
void setNome(string n);
string getNome();
void setIdade(int i);
int getIdade();
};
#endif
Arquivo: pessoa.cpp
#include "pessoa.h"
void Pessoa::setNome(string n)
{
nome = n;
}
string Pessoa::getNome()
{
return nome;
}
void Pessoa::setIdade(int i)
{
idade = i;
}
int Pessoa::getIdade()
{
return idade;
}
Arquivo: main.cpp
#include <iostream>

Prof. Dr. Sergio V. D. Pamboukian

Universidade Presbiteriana Mackenzie

Linguagem Orientada a Objetos

#include "pessoa.h"
using namespace std;
int main(int argc, char *argv[])
{
Pessoa p;
p.setNome("Sergio");
p.setIdade(18);
cout << "Nome = " << p.getNome() << endl;
cout << "Idade = " << p.getIdade() << endl;
system("pause");
return 0;
}

Mais uma soluo (implementando os mtodos diretamente na declarao da classe):


#include <iostream>
#include <string>
using namespace std;
// declarao e implementao da classe
class Pessoa
{
private:
string nome;
int idade;
public:
void setNome(string n){ nome = n; };
string getNome(){ return nome; };
void setIdade(int i){ idade = i; };
int getIdade(){ return idade; };
};
// funo principal
int main(int argc, char *argv[])
{
Pessoa p;
p.setNome("Sergio");
p.setIdade(18);
cout << "Nome = " << p.getNome() << endl;
cout << "Idade = " << p.getIdade() << endl;
system("pause");
return 0;
}

Tipos de atributos
Um atributo pode ser um tipo pr-definido da linguagem, um tipo definido pelo programador ou
um tipo de uma biblioteca externa como a STL.
Exemplo:
class TEndereco
{
private:
int iNumero;
string sLogradouro;
};
class Funcionario
{
private:
char cNome[40];
TEndereco endereco;
};

// tipo pr-definido
// classe da STL

// tipo pr-definido
// classe definida pelo usurio

Exerccio
Criar uma classe para representar um crculo. Implementar os seguintes mtodos: setRaio, getRaio,
setDiametro, getDiametro, area e comprimento. Criar um programa (funo main) para testar a
classe e todos os seus mtodos. A classe deve ser codificada em uma unidade independente.
a = r2
c = 2 r

Funes e objetos

Como classe um novo tipo de dado criado pelo usurio, possvel ter um objeto como valor de
retorno de uma funo/mtodo. Algumas funes/mtodos tambm podem receber um objeto
como parmetro.
Exemplo:
#include <iostream>
using namespace std;
class Venda
{
private:
int nPecas;
float fPreco;
public:
void setVenda(int pc, float pr);
void exibe();
Venda soma(Venda x);
};
void Venda::setVenda(int pc, float pr)
{
nPecas = pc;
fPreco = pr;
}
void Venda::exibe()
{
cout << "nPecas = " << nPecas
<< " fPreco = " << fPreco << endl;
}
Venda Venda::soma(Venda x)
{
Venda vTemp;
vTemp.nPecas = nPecas + x.nPecas;
vTemp.fPreco = fPreco + x.fPreco;
return vTemp;
}
int main()
{
Venda v1, v2, v3;
v1.setVenda(10,30);
v2.setVenda(20,40);
v3 = v2.soma(v1); // Soma v1 com v2 e armazena em v3
v1.exibe(); v2.exibe(); v3.exibe();
system("pause");
return 0;
}
/*
nPecas = 10 fPreco = 30
nPecas = 20 fPreco = 40
nPecas = 30 fPreco = 70
Pressione qualquer tecla para continuar. . .
*/

Outra forma:
...
void Venda::soma(Venda x, Venda y)
{
nPecas = x.nPecas + y.nPecas;
fPreco = x.fPreco + y.fPreco;
}
int main()
{
...
v3.soma(v1,v2); // Soma v1 com v2 e armazena em v3
...
}

Arrays de objetos

A criao de um array de objetos em C++ segue a sintaxe da declarao de arrays de outros tipos
de dados:

Exemplo:

Nome_classe nome_array[quantidade de elementos];


class Empregado
{
private:
char *cNome;
int iCodigo;
public:
Empregado(char *, int);
Exibe();
};

Se a empresa possuir 100 empregados, declara-se o array no formato abaixo.


Empregado mEmp[100];

O acesso a variveis e funes membro de um objeto elemento de array pode ser feita da seguinte
forma:
mEmp[i].Exibe();

Criao dinmica de objetos


Alocao dinmica de memria
A alocao dinmica de memria em C++ feita com os operadores new (para alocar memria) e
delete (para liberar memria), anlogos as funes malloc() e free().

Exemplo em C:
double *ptr;
ptr = (double *)malloc(sizeof(double));
free (ptr);

Exemplo em C++:
double *ptr;
ptr = new double;
delete ptr;

O C++ melhorou a sintaxe de gerenciamento de memria heap do C incorporando prpria


linguagem os operadores new e delete.
Os objetos dinmicos so essenciais em sistemas orientados a objetos. Eles oferecem maior
domnio sobre o gerenciamento de memria. Com objetos dinmicos, a utilizao da memria

segue um esquema ligado necessidade, ou seja, alocamos quando necessrio e liberamos quando
o objeto deixa de ser til.

Criao dinmica de objetos


Os objetos dinmicos surgem quando reservamos espao em memria heap para uma instncia de
classe.
A sintaxe de alocao de objetos dinmicos :
Nome_classe *ptr = new Nome_Classe;
Nome_classe *ptr = new Nome_Classe(parmetros do construtor);

Exemplo:
CDATA *pDT = new CDATA;
CDATA *pDT1 = new CDATA(1,1,2005);

Para declarar um vetor de objetos dinmicos, utilizar a seguinte sintaxe:


Nome_Classe *array = new Nome_Classe[tamanho];

Exemplo:
CDATA *pDT = new CDATA[10];

Destruio de objetos dinmicos


Como qualquer varivel dinmica, um objeto deve ser liberado da memria explicitamente.
Sintaxe:
delete Nome_objeto
delete [tamanho]array
delete []array

Acesso aos membros de objetos dinmicos


Para acessar um atributo ou um mtodo de um objeto criado dinamicamente deve-se utilizar o
operador de acesso -> ao invs do ponto.

Exemplo:
CDATA *pDT;
pDT = new CDATA;
pDT->Recebe();

Exemplo para vetor:


CDATA *pDT = new CDATA[10];
...

(&pDT[i])->Recebe();
(pDT + i)->Recebe();
(*(pDT + i)).Recebe();
pDT[i].Recebe();

//
//
//
//

i
i
i
i

a
a
a
a

posio
posio
posio
posio

no
no
no
no

array
array
array
array

...

delete []pDT;

Observao: note que pDT um ponteiro, mas pDT[i] um CDATA.

Ponteiro THIS
Quando criamos instncias de uma classe, cada uma delas tem sua prpria cpia dos atributos.
Para efetivar a ligao entre atributos/mtodos e os objetos, o C++ possui um ponteiro
implicitamente criado para cada mtodo, denominado this. Sua finalidade apontar para o
objeto que chamou o mtodo.

Exemplo :
void LIVRO::Exibe()
{
cout << "\n Titulo " << this->cTitulo; // ponteiro this implicito
cout << "\n Autor " << this->cAutor; // portanto, no precisa
cout << "\n Total " << this->iTotal; // ser usado neste caso
}

O exemplo anterior tambm poderia ser escrito da seguinte forma:


void LIVRO::Exibe()
{
cout << "\n Titulo " << LIVRO::cTitulo; // LIVRO o nome da classe
cout << "\n Autor " << LIVRO::cAutor; // e no precisa
cout << "\n Total " << LIVRO::iTotal; // ser usado neste caso
}

Outro exemplo (note que atributos e parmetros possuem o mesmo nome):


#include <iostream>
using namespace std;
class TEMPO
{
private:
int iHora, iMinuto, iSegundo;
public:
void setTempo(int iHora, int iMinuto, int iSegundo);
};
void TEMPO::setTempo(int iHora, int iMinuto, int iSegundo)
{
this->iHora = iHora;
this->iMinuto = iMinuto;
this->iSegundo = iSegundo;
}
int main(int argc, char *argv[])
{
TEMPO t;
t.setTempo(15,28,03);
system("pause");
return 0;
}

Benefcios da tecnologia OO

As aplicaes podem ser desenvolvidas em menos tempo e com menor custo, devido
reutilizao de objetos existentes.
Os sistemas possuem qualidade superior, por serem construdos com componentes testados e
comprovados, oferecendo melhores solues para os problemas, com menos bugs.
A implementao dos objetos pode ser modificada sem afetar outros objetos, tornando a aplicao
mais fcil de ser mantida e permitindo maior flexibilidade e agilidade no crescimento e na
evoluo das aplicaes.

10

Agradecimentos

Parte deste material foi adaptada a partir das aulas dos Professores Jamilson Bispo do Santos,
Vilmar Pedro Votre, Lincoln Csar Zamboni e Srgio V. D. Pamboukian.

Você também pode gostar