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; }
// 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. . . */
#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; }
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; };
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(); };
O acesso a variveis e funes membro de um objeto elemento de array pode ser feita da seguinte forma:
mEmp[i].Exibe();
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);
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();
// // // //
i i i i
a a a a
no no no no
delete []pDT;
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 }
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.