140 likes | 264 Views
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 }.
E N D
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
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
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
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
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
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
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
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
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
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
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
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
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
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