Anda di halaman 1dari 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.

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

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:
Nome_classe nome_array[quantidade de elementos];

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

Anda mungkin juga menyukai