Programação orientada a objectos em C++ Criação e Utilização de classes e objectos
Classe É uma estrutura de dados e de funções que permite a criação de variáveis com essa mesmo estrutura. Têm o nome de Objectos.
Objecto É uma instância definida numa classe. Um objecto é uma estrutura composta por: Dados ou atributos: designações para as variáveis existentes nas classes de origem, do objecto; Métodos: designação para as funções incluídas na classe de origem do objecto;
Características deste tipo de programação: Encapsulamento: possibilidade de se ocultar ou controlar o acesso à composição interna da classe, aos seus dados e ao código das suas funções membro; Polimorfismo: Possibilidade de operadores e funções assumirem diferentes formas de forma a poderem ser adaptadas a diferentes tipos de dados;
Características deste tipo de programação (cont.): Herança: Possibilidade de criar novas classes a partir de outras já existentes, recebendo (herança) a sua composição e características;
Struct Recordando uma struct: struct nome_estrutura { Uma classe é muito parecida a uma estrutura de dados (struct). Recordando uma struct: struct nome_estrutura { <lista de campos> } [lista de variáveis do tipo da estrutura]
Classe Formato Geral da Classe: Class nome_classe { <lista de campos> } [lista de variáveis do tipo da classe]
Classe - exemplo class pessoa{ char nome[40]; int idade; } p1; Uma variável declarada como sendo de um tipo de determinada classe deixa de se chamar variável para se chamar objecto.
Public e Private As palavras public e private são usadas para controlar o acesso aos membros da estrutura ou da classe. Com o private o acesso fica limitado ao interior da estrutura ou da classe e com o public, não. A única diferença entre uma estrutura e uma classe, neste aspecto, é que numa struct os membros são public por defeito e numa classe são private por default.
Exemplo de programa: main(){ class pessoa{ public : char nome[40]; #include <iostream> main(){ class pessoa{ public : char nome[40]; int idade; } p1; strcpy(p1.nome, “Ana”); p1.idade=16; cout<<“Nome:” << p1.nome; cout <<“Idade” <<p1.idade;}
Criação e utilização de classes e objectos: Programa com uma função dentro da classe: # include <iostream> main(){ class pessoa{ public: char nome[40]; int idade; int ano (int ano_actual) {return ano_actual – idade;} } p1; strcpy (p1.nome, “Ana”); p1.idade = 16; cout<<p1.nome; cout<<p1.idade; cout <<p1.ano(2006); }
Cont. Output: Ana 16 1990 NOTA: se substituíssemos a palavra class por struct, funcionaria da mesma forma. A função ano() funciona com um parâmetro inteiro (int ano_actual) e devolve um valor inteiro. O valor devolvido é resultante da instrução return ano_actual – idade;
Cont. Modo como é efectuada a chamada à função ano(), que é membro da classe pessoa e objecto p1.ano(2006). A função: É chamada através de um objecto do tipo classe pessoa; p1.ano; É chamada com um parâmetro correspondente ao ano corrente, p1.ano(2006);
exemplo Se a idade deixar de ser public e passar a private a função é aceite mas dá erro. ex. class pessoa{ int idade; public: char nome[40]; int ano (int ano_actual - idade) {return ano_actual – idade;}
Solução: # include <iostream> main(){ class pessoa{ private: idade; public: char nome[40]; void setidade(int i) {idade=i;} int getidade() {return idade;} int ano (int ano_actual) {return ano_actual – idade;} } p1;
exemplo strcpy(p1.nome, “Ana”); p1.setidade(16); // como a idade é privada cout<<p1.nome; cout<<p1.getidade; cout<<p1.ano(2006); } SET() : permite introduzir valores em dados privados; GET() : permite obter os valores de campos privados;
SET() Void setidade(int i) {idade = i;} Função tipo void porque não retorna nenhum valor. utiliza o parametro i (int i) para receber como argumento de chamada um valor para atribuir ao campo idade: {idade=i;}
GET() Int getidade() {return idade;} Função do tipo int porque retorna um valor desse tipo. Não necessita de parâmetros e limita-se a uma instrução: {return idade;}
Funções-membro definidas fora da classe e operador de resolução de escopo (::) Quando uma função de uma classe é mais extensa, uma outra prática a fazer é escrever as funções fora da classe e dentro da classe declaram-se os protótipos.
…. Class empregado{ char …. Class empregado{ char *codigo; float salario; public: char nome[40]; int idade; void setcodigo (char*c) {codigo=c} void setsalario (float s) {salario=s} int *getcodigo() return codigo;} int getsalario() return slario;} void mostradados(); };
main(){ empregado e1; strcpy(e1. nome, “Miguel”); e1. idade=28; e1 main(){ empregado e1; strcpy(e1.nome, “Miguel”); e1.idade=28; e1.setcodigo (“A-101”); e1.setsalario (1000); p1.mostradados(); }
Resolução de escopo void empregado::mostradados(){ //operador de //resolução de escopo cout<<“Nome”<<nome; cout<<“idade<<idade; cout<<“Codigo”<<getcodigo(); cout<<“salario”<<getsalario(); } :: Informa o compilador que determinada função FX() pertence a determinada classe.
Passagem de objectos para funções … Class produto{ float valor; public: void atribui (float v) {valor=v;} void escreve () {cout<<valor;} }; void valor_venda(venda v){ v.escreve(); // escreve 10 v.atribui(20); //altera só no local v.escreve(); // escreve 20 } main(){ venda v1; v1.atribui(v1); //atribui 10 a v1 valor_venda(v1); // passa v1 para a função v1.escreve(); // escreve 10 }
Passagem de objectos para funções através de apontadores … Class produto{ float valor; public: void atribui (float v) {valor=;} void escreve () {cout<<valor;} }; void valor_venda(venda *v){ V->escreve(); // escreve 10 V->atribui(20); //altera só no local V->escreve(); // escerve 20 } main(){ venda v1, *p; p=&pv1; v1.atribui(v1); //atribui 10 a v1 valor_venda(p); // passa v1 para a função v1.escreve(); // escreve 10 }