Classes C++

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

description

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 }. - PowerPoint PPT Presentation

Transcript of Classes C++

Page 1: Classes C++

ADA / DEI - ISEP 2001/2000 1

Classes C++

Class nome da classe{private:

membros privadosprotected:

membros protegidospublic:

membros públicos};

[Tipo_retorno] nome_classe :: nome_método([parametros]){

código do método}

Declaração de Classes

Declaração de métodos fora da estrutura da classes

Page 2: Classes C++

ADA / DEI - ISEP 2001/2000 2

Exemplo de uma Classe C++

#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();}

Interface (circulo.h) Implementação (circulo.cpp)

Page 3: Classes C++

ADA / DEI - ISEP 2001/2000 3

Funções (Métodos) e ParâmetrosPARÂ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

Page 4: Classes C++

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 (const circulo &c){

raio=c.raio;coordx=c.coordx;coordy=c.coordy;cor= new char [strlen(c.cor)+1] ;strcpy(cor,c.cor);

};

circulo();

circulo(int x, int y, int r, char *c );

circulo(int x=0, int y=0, int r=5, char * c="azul“ )

Page 5: Classes C++

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;}

Page 6: Classes C++

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;

}

Page 7: Classes C++

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)

Page 8: Classes C++

ADA / DEI - ISEP 2001/2000 8

Exemplo com classe derivada

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;};

Um Aluno é (is-a) uma Pessoa

Page 9: Classes C++

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.

Page 10: Classes C++

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.

Page 11: Classes C++

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.

Page 12: Classes C++

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(const T&); // coloca na stackbool pop(T&); // retira da stackbool isEmpty() const { return top == -1; } bool isFull() const { return top == size - 1; }

};

Page 13: Classes C++

ADA / DEI - ISEP 2001/2000 13

Exemplo – Implementação da stack

template <class T> Stack<T>::Stack(int s) { size = s;

top = -1; // vaziastackPtr = new T[size];

}

template <class T> bool Stack<T>::push(const T &item) { if (isFull()) return false; // insucesso

stackPtr[++top] = item;return true; // sucesso

}

template <class T> bool Stack<T>::pop(T &item) { if (isEmpty()) return false; item = stackPtr[top--];

return true; // sucesso}

Page 14: Classes C++

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;}