1 / 14

Classes C++

Classes C++. Declaração de Classes. Class nome da classe { private: membros privados protected: membros protegidos public: membros públicos };. Declaração de métodos fora da estrutura da classes. [Tipo_retorno] nome_classe :: nome_método([parametros]) { código do método }.

Télécharger la présentation

Classes C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Classes C++ Declaração de Classes Class nome da classe { private: membros privados protected: membros protegidos public: membros públicos }; Declaração de métodos fora da estrutura da classes [Tipo_retorno] nome_classe :: nome_método([parametros]) { código do método } ADA / DEI - ISEP 2001/2000

  2. Exemplo de uma Classe C++ Interface (circulo.h) Implementação (circulo.cpp) #include <iostream.h> class circulo { private: int coordx; int coordy; int raio; char * cor; public: circulo(); circulo(int x,int y,int r,char *c); ~circulo(); void listar(); }; circulo::circulo() { coordx=0; coordy=0; raio=0; cor=NULL; }; circulo::circulo(int x,int y,int r,char *c) {coordx=x; coordy=y; raio=r; cor=new char[strlen(c) +1]; strcpy(cor , c); }; circulo::~circulo() { if (cor !=(char*)0) delete cor; }; void circulo::listar() { cout<<"cordenada x="<<coordx<<'\n'; cout<<"cordenada y="<<coordy<<'\n'; cout<<"raio="<<raio<<'\n'; cout<<"cor="<<cor<<'\n'; }; void main() { circulo c1; circulo c2(10,15,33,"Azul"); c1.listar(); c2.listar(); } ADA / DEI - ISEP 2001/2000

  3. Funções (Métodos) e Parâmetros PARÂMETROS VALOR - A passagem de parâmetros por valor invoca o construtor cópia do tipo de dados do parâmetro formal. Quando uma função termina destrutores dos tipos de dados dos parâmetros formais "destroem" os valores desses parâmetros. int f1(int x); // x parâmetro valor PARÂMETROS REFERÊNCIA - Os parâmetros actuais são ligados aos parâmetros formais, não existe cópia dos parâmetros. O nome dos parâmetros formais substitui o nome dos parâmetros actuais. Qualquer alteração do parâmetro formal, altera o parâmetro actual. int f2(int& y); // y parâmetro referência PARÂMETROS REFERÊNCIA CONSTANTE - Neste caso o parâmetro formal substitui o actual, mas como é constante, não admite alteração de valor. int f3(const int& z) // z parâmetro referência constante ADA / DEI - ISEP 2001/2000

  4. Construtores • O construtor serve normalmente para inicializar os membros-dados • O construtor é invocado automaticamente sempre que é criado um objecto da classe • Construtores também podem ser invocados explicitamente circulo(); circulo(int x,int y,int r,char *c); circulo(int x=0,int y=0,int r=5,char * c="azul“) circulo::circulo (const circulo &c) { raio=c.raio; coordx=c.coordx; coordy=c.coordy; cor= new char [strlen(c.cor)+1] ; strcpy(cor,c.cor); }; ADA / DEI - ISEP 2001/2000

  5. Destrutor • Tem a mesma designação da classe precedido de ~ • Não tem parâmetros e não devolvem quaisquer valores • Não são invocados explicitamente. • São invocados automaticamente sempre o objecto deixa de existir. • Destrutores servem normalmente para libertar recursos (memória dinâmica, etc.) associados ao objecto. • circulo::~circulo() • { • delete [ ] cor; • } ADA / DEI - ISEP 2001/2000

  6. Sobrecarga de Operadores • Permite rescrever código para operadores de modo a manipularem operandos de classe diferente da que estão predefinidos. • Não é possível alterar a precedência nem o número de operandos. • circulo circulo::operator +( const circulo& c) • { • circulo temp; • temp.coordx=this->coordx; • temp.coordy=this->coordy; • tem.raio=this->raio + c.raio; • return temp; • } ADA / DEI - ISEP 2001/2000

  7. Relação "IS-A" e Herança • Muitas vezes, conceptualmente, um objecto de uma classe também é um objecto doutra classe (relação IS-A) • Um aluno é uma pessoa e um objecto da classe Aluno é também um objecto da classe Pessoa • Nesse caso, herda as propriedades definidas para a segunda classe (relação de herança) • Aluno herda as propriedades de Pessoa (atributos e funções como nome, idade, etc.) podendo acrescentar outras propriedades (curso, média, etc.) • Notação : • clase Pessoa {/*prop's comuns a todas as pessoas*/}; • class Aluno : public Pessoa {/*prop's especificas*/}; • Pessoa é uma classe base (ou superclasse) para Estudante e Estudante é uma classe derivada (ou subclasse ou subtipo) de Pessoa • Objectos da classe derivada podem ser tratados como objectos da classe base (desde que manipulados através de apontadores ou referências) ADA / DEI - ISEP 2001/2000

  8. Exemplo com classe derivada Um Aluno é (is-a) uma Pessoa class Pessoa { protected:string nome; Data dataNascimento; public:Pessoa(string, Data);string getNome() const;Data getDataNascimento() const;int getIdade() const;void setNome(string);void setDataNascimento(Data); void imprime() const; }; class Aluno : public Pessoa {protected: string curso; public: Aluno( string nm, Data, string crs); string getCurso() const; void setCurso(string); void imprime() const;}; ADA / DEI - ISEP 2001/2000

  9. Resumo de extensões ao C! • Comentários começados em // (vão até ao fim da linha). • Definição de variáveis a meio de um bloco e na parte de inicialização da instrução for. • Biblioteca alternativa de entrada e saída de dados baseada em streams, mais segura e mais simples. • Tipo string (da biblioteca standard) mais fácil de usar do que as strings built-in herdadas do C. • Variáveis qualificadas com const podem ser usadas onde é esperada uma expressão constante (dispensa macros). • Tipo bool com valores true e false. • Operadores de conversão de tipos mais seguros. ADA / DEI - ISEP 2001/2000

  10. Resumo de extensões ao C (cont.)! • Referências e passagem de argumentos por referência. • Funções inline (dispensa macros). • Argumentos por omissão. • Nomes de funções sobrecarregados (overloaded). • Padrões (templates) de funções (dispensa macros). • Alocação e libertação de memória dinâmica com new e delete mais controlada do que com malloc e free (nomeadamente quando se usam classes - ver a seguir). • As palavras chave struct, union e enum não são necessárias ao usar um tipo definido com estas palavras (dispensa typedef). • Espaços de nomes (namespaces) como módulos lógicos mais flexíveis do que os módulos físicos (ficheiros com código fonte. ADA / DEI - ISEP 2001/2000

  11. Resumo Programação OO em C++ • A classe é a unidade de ocultação de dados e de encapsulamento • Classe como tipo abstracto de dados: a classe é o mecanismo que suporta abstracção de dados, ao permitir que os detalhes de representação sejam escondidos e acedidos exclusivamente através de um conjunto de operações definidas como parte da classe • A classe proporciona uma unidade de modularidade. • Reutilização de código promovida pelo mecanismo de herança • Polimorfismo (a capacidade de objectos de diferentes classes relacionadas por herança responderem diferentemente à chamada da mesma função-membro) é suportado através de classes com funções virtuais. ADA / DEI - ISEP 2001/2000

  12. Exemplo – Interface Stack // stack.htemplate <class T> class Stack {protected:int size; // capacidade da stackint top; // índice do elemento no topo da stackT *stackPtr; // apontador para a base da stack public: Stack(int = 100); // construtor ~Stack() { delete [] stackPtr; } // destrutorbool push(constT&); // coloca na stackbool pop(T&); // retira da stackbool isEmpty() const { return top == -1; } bool isFull() const { return top == size - 1; } }; ADA / DEI - ISEP 2001/2000

  13. Exemplo – Implementação da stack template <class T> Stack<T>::Stack(int s) { size = s; top = -1; // vazia stackPtr = new T[size];} template <class T> bool Stack<T>::push(constT &item) { if (isFull()) returnfalse; // insucesso stackPtr[++top] = item;returntrue; // sucesso} template <class T> bool Stack<T>::pop(T &item) { if (isEmpty()) returnfalse; item = stackPtr[top--];returntrue; // sucesso} ADA / DEI - ISEP 2001/2000

  14. Exemplo – Uso da stack #include <iostream.h>#include "stack.h" main(){Stack<int> intStack; // stack de inteirosint i = 1; cout << "\nPush elementos para a stack\n";while ( intStack.push(i) ) { // Enche a stack cout << i << ' ' ; i++; } cout << "Stack cheia; pop elementos da stack" << endl;while (intStack.pop(i)) // retira da stack cout << i << ' ' ; cout << "Stack vazia." << endl; return 0; } ADA / DEI - ISEP 2001/2000

More Related