Вы находитесь на странице: 1из 10

Programao Orientada a Objetos em C++ Prof Lucilena de Lima

Fonte: http://www.inf.lasalle.tche.br/~barreto/cursoC++/index.htm visitado: maro/2009

1 POO em C++
1.1 Classes e objetos
Classe a principal abstrao de C++ para a programao orientada a objetos. Para criar uma classe, utiliza-se a palavra-reservada class seguido do nome da classe, "abrir chaves", declarao de atributos e mtodos, e "fechar chaves". Veja no exemplo a seguir: class nome_classe { // atributo da classe int dado_membro; // metodo da classe void exibe_membro(int); } A definio de uma classe representa a definio de um "modelo" ou "tipo abstrato de dado" atravs do qual se pode criar objetos desse tipo de classe; da mesma forma que os tipos bsicos de dados (int, char, float, etc.) permitem que se criem variveis. Uma classe formada por atributos - informaes guardadas na classe, e mtodos - aes vlidas sobre os atributos. O acesso aos atributos e mtodos pblicos da classe se d atravs do operador ponto ("."). Aps definir uma classe, possvel us-la para criar (ou instanciar) diversos objetos desta classe, conforme o exemplo a seguir:

Exemplo:

#include <iostream.h> #include <string.h> class funcionario { public: char nome[64]; long ident_func; float salario; void exibe_func(void) { cout << "Nome: " << nome << endl; cout << "Ident: " << ident_func << endl; cout << "Salario: " << salario << endl; }; }; void main(void) { funcionario func, chefe; strcpy(func.nome, "Joao Silva"); func.ident_func = 12345; func.salario = 2500; strcpy(chefe.nome, "Alberto Roberto"); chefe.ident_func = 101; chefe.salario = 10110.00; func.exibe_func(); chefe.exibe_func(); } Neste exemplo, a classe Funcionario tem trs atributos e um mtodo, todos eles pblicos. Na funo principal (main()) so declarados dois objetos do tipo Funcionario: func e chefe. Observe que em ambos os objetos, o acesso aos atributos feito pelo operador ".".

Tambm possvel (e desejvel, para fins de legibilidade) separar a declarao dos mtodos da classe das suas respectivas implementaes. Dessa forma, dentro da declarao da classe, aparecem somente os nomes dos mtodos com seus respectivos parmetros; a implementao destes mtodos colocada fora da definio da classe. A declarao do mtodo, dentro da classe, chamada ento de prottipo. Exemplo: #include <iostream.h> #include <string.h> class funcionario { public: char nome[64]; long ident_func; float salario; void exibe_func(void); // prototipo do metodo }; // implementacao do metodo void funcionario::exibe_func(void) { cout << "Nome: " << nome << endl; cout << "Ident: " << ident_func << endl; cout << "Salario: " << salario << endl; }; void main(void) { funcionario func, chefe; strcpy(func.nome, "Joao Silva"); func.ident_func = 12345; func.salario = 2500; strcpy(chefe.nome, "Alberto Roberto"); chefe.ident_func = 101; chefe.salario = 10110.00; func.exibe_func(); chefe.exibe_func(); }

1.2 Encapsulamento
O encapsulamento, ou ocultao de informaes, uma caracterstica das linguagens orientadas a objetos que permite definir diferentes critrios de visibilidade e acesso a atributos e mtodos de uma classe. A orientao a objetos pensa num sistema onde o usurio somente precisa conhecer os servios (mtodos) que um objeto capaz de realizar; no precisando conhecer detalhes de como estes servios so implementados. Neste sentido, o conjunto de servios prestados por um objeto dito pblico e conhecido como sua interface; enquanto que a implementao destes servios (e os atributos necessrios para execut-los) so ditos privados. Um atributo ou mtodo pblico definido pela palavra-reservada public seguida de dois pontos (:). Um atributo ou mtodo privado definido pela palavra-reservada private seguida de dois pontos (:). No primeiro caso, o acesso aos atributos e mtodos pblicos feito atravs do operador ponto ("."); enquanto que no segundo caso, o acesso feito somente atravs de mtodos (pblicos) presentes na interface do objeto. Exemplo: #include <iostream.h> #include <string.h> class funcionario { private: char nome[64]; long funcionario_id; float salario; public: int atribui_valores(char *, long, float); void exibe_funcionario(void); int altera_salario(float); long obtem_ident(void); };

int funcionario::atribui_valores(char *fun_nome, fun_salario) { strcpy(nome, fun_nome); funcionario_id = fun_id; if (fun_salario < 5000.0) { salario = fun_salario; return(0); // Bem sucedido } else return(-1); // Salario invalido }

long fun_id, float

void funcionario::exibe_funcionario(void) { cout << "Funcionario: " << nome << endl; cout << "Ident: " << funcionario_id << endl; cout << "Salario: " << salario << endl; } int funcionario::altera_salario(float new_salario) { if (new_salario < 5000.0) { salario = new_salario; return(0); // Bem sucedido } else return(-1); // Salario invalido } long funcionario::obtem_ident(void) { return(funcionario_id); }

main() { funcionario func; if (func.atribui_valores("Happy Jamsa", 101, 1010.0) == 0) { cout << "Valores de funcionario atribuidos" << endl; func.exibe_funcionario(); if (func.altera_salario(3500.00) == 0) { cout << "Novo salario atribuido" << endl; func.exibe_funcionario(); } } else cout << "Salario invalido especificado" << endl; }

1.3 Herana
Uma das facilidades da programao orientada a objetos o mecanismo de herana, que permite a reutilizao, dentro de um programa, de uma ou mais classes definidas dentro de outro programa. Numa relao de herana, uma classe derivada herda atributos e mtodos de uma classe-base ou superclasse. A classe derivada pode, ento, usar estes atributos e mtodos da forma como foram herdados ou pode redefinir a implementao de algum mtodo. Atravs do operador ponto ("."), a classe derivada pode acessar membros (pblicos) da classe-base. Alm disso, C++ define um terceiro tipo de visibilidade, definido como protegido. Atributos e mtodos protegidos, identificados pela palavra protected, podem ser acessados pela classe-base e por todas as suas classes derivadas.

Por exemplo: um programa define uma classe Funcionario, da seguinte forma: class Funcionario { public: Funcionario(char *, char *, float); void exibeFuncionario(void); private: char nome[64]; char cargo[64]; float salario; }; Depois, necessrio definir uma classe Gerente, que agrega s informaes contidas na classe Funcionrio, os seguintes atributos: float bonus_anual; char carro_empresa[64]; int opcoes_acoes; Ento, o programa pode ser codificado de duas formas: definir duas classes independentes, uma para Funcionrio e outra para Gerente, onde boa parte das informaes sero repetidas; OU usar o mecanismo de herana para criar a classe Gerente a partir da classe Funcionrio. class Funcionario { public: Funcionario(char *, char *, float); void exibeFuncionario(void); private: char nome[64]; char cargo[64]; float salario;

};

class Gerente : public Funcionario { public: Gerente(char *, char *, char *, float, float, int); void exibeGerente(void); private: float bonus_anual; char carro_empresa[64]; int opcoes_acoes; }; Na herana a partir de uma classe-base, os atributos e mtodos privados da classe-base somente so acessveis classe derivada atravs de mtodos presentes na interface da classe-base. Por outro lado, atributos e mtodos pblicos so acessveis atravs do operador ponto ("."). Exemplo: #include <iostream.h> #include <string.h> class funcionario { public: funcionario(char *, char *, float); void exibe_funcionario(void); private: char nome[64]; char cargo[64]; float salario; }; funcionario::funcionario(char *nome, char *cargo, float salario) { strcpy(funcionario::nome, nome); strcpy(funcionario::cargo, cargo); funcionario::salario = salario; } void funcionario::exibe_funcionario(void) {

cout << "Nome: " << nome << endl; cout << "Cargo: " << cargo << endl; cout << "Salario: $" << salario << endl; } class gerente : public funcionario { public: gerente(char *, char *, char *, float, float, int); void exibe_gerente(void); private: float bonus_anual; char carro_empresa[64]; int opcoes_acoes; }; gerente::gerente(char *nome, char *cargo, char *carro_empresa, float salario, float bonus, int opcoes_acoes) : funcionario(nome, cargo, salario) { strcpy(gerente::carro_empresa, carro_empresa); gerente::bonus_anual = bonus; gerente::opcoes_acoes = opcoes_acoes; } void gerente::exibe_gerente(void) { exibe_funcionario(); cout << "Carro da empresa: " << carro_empresa << endl; cout << "Bonus anual: $" << bonus_anual << endl; cout << "Opcoes de acoes: " << opcoes_acoes << endl; } void main(void) { funcionario func("Joao Silva", "Programador", 3000); gerente chefe("Jane Silva", "Vice-Presidente", "Lexus", 5000.0, 5000, 1000); func.exibe_funcionario(); chefe.exibe_gerente(); } IMPORTANTE: Para inicializar os membros de uma classe derivada, o programa precisa chamar as funes construtoras da classe-base.

Observe a funo construtora da classe Gerente - antes de ser executada, ela invoca o construtor da classe-base Funcionrio. Alm disso, observe que a funo exibeGerente() invoca tambm a funo exibeFuncionario() da classe-base.

Nota sobre atributos e mtodos protegidos Um atributo ou mtodo protegido est entre os membros pblicos e os membros privados, em termos de visibilidade de acesso. Um atributo protegido (protected) pode ser acessado pela classe derivada como se fosse pblico, ou seja, atravs do operador ponto ("."). Para o resto do programa, este atributo considerado privado e s pode ser acessado via mtodos na interface do objeto. Exemplo: class funcionario { public: char nome[64]; char cargo[64]; int idade; funcionario(char *, char *, float); void exibe_funcionario(void); private: float salario; float inss; protected: float perc_reajuste; float bonus_anual; int cadastraReajuste(float); int cadastraBonus(float); };

Вам также может понравиться