Matéria das Aulas de Programação de Computadores 3 ( Segundo Ano )
Aula 01 (Dia 27/07/06)
Um objeto é uma coleção de atributos e/ou uma coleção de métodos.
->Os atributos de um objeto representam sua estrutura.
->Os métodos de um objeto acessão seus atributos e representam o comportamento do objeto.
Uma classe é a descrição de todos os stributos e todos os métodos de um determinado tipo de objeto.
Um objeto é uma instância de uma classe. Um objeto de uma classe conterá durante toda sua vida os atributos e métodos descritos na classe.
Uma mensagem é uma solicitação feita à um objeto para que este execute uma das operações definidas nba classe do objeto.
->Genéricamente o formato de uma mensagem é x.m(args), onde x é uma referência ao objeto receptor da mensagem; m é o seletor da mensagem; args é a lista(possívelmente vazia ) de argumentos da mensagem.
->O obejeto referanciado por x invocando o método m, definida em sua classe, cujos parâmetro casam em numero e tipo com os argumentos da mensagem. Este mecanismo é denominado aclopamento mensagem-método.
->Em programção orientada à objetos a computação ocorre em um universo contituido de objetos que trocam mensagens entre si, dentro deste universo objetos são criados, possuem um tempo de vida ultíl e são destruuidos dentro da computação.
Construção e Destruição de Objetos em C++
Seja a classe X:
struct X
{
int a;
void m(int);
};
Objetos em C++ podem ser criados: estática e dinamicamente.
Criar um objeto significa:
1) alocar memória para armazenamento dos atributos do objeto(declarados em sua classe) e, em determinados casos, imformações sobre os tipos dos objetos.
2)executar operações responsáveis pela inicialização dos odjetos(atribuir valores iniciais a atributos, enviar mensagens a outros objetos, alocar memória para uso interno, abrir arquivos,etc). Essas operações são definidas em métodos especias da classe do objeto chamados construtores.
Para criar estáticamente um objeto da classe X basta declarar:
X x;
A área de memória ocupada pelo objeto x é alocada estáticamente no segmento de dados(se a declarção for global) ou no segmento de pilha(se a declaração for local).
No primeiro caso o tempo de vida do objeto é igual ao tempo de vida do programa e seu escopo é global. No segundo caso o tempo de vida e o escopo são restritos ao bloco(tudo q começa{}) do objeto instanciado.
Alocada a memória para o objeto um método construtor deve ser invocado para sua inicialização, poprém na classe x nenhum construtor é declarado. Neste e somente neste caso o compilador provê um construtor automaticamente. Este não possui tipo de retorno, e tem nome identico ao da classe(aliás como todos os construtores em C++) e não possui parâmetros. Este construtor e chamado "default". O construtor default provido pelo compilador no caso da classe X não faz nada. É como se tivessemos declarado uma classe:
struct X
{
X(){};
int a;
void m(int);
};
Um objeto criado estáticamente é destruido automaticamente pelo programa quando seu escopo termina. A destruição de um objeto envolve:
1)Executar operações de finalização do objeto(liberação de memória para uso interno, fechamento de arquivos, etc, isto é,limpeza da cas). Essas operações são codificadas em um método especial definido na classe do objeto, chamado destrutor. Se o destrutor não é declarado o compilador provê.
2)Liberação da memória ocupada pelo objeto.
Aula 02 (Dia XX/XX)
Aula 03 (Dia XX/XX)
Templates
Vamos considerar a classe a seguir:
Struct Banana
{
float L;
float D;
Banana * Next;
}
Class
ListBanana
{
public:
ListBanana();
void Add(Banana*);
void Remove(Banana*);
int
GetNumberOfElements() const;
boll
IsEmpty() const;
void Clean();
Banana*
PeekHead() const;
~ListBanana();
private:
Banana * Head;
Banana * Tail;
int
NumberOfElements;
ListBanana(const
ListBanana &);
ListBanana & operator = (const
ListBanana & );
};
Se você quiser não só bananas, mas fazer um "hortifrutigrangeiro" você tem que de templates ( Oferecido pelo C++ ). Para termos uma implementação desse tipo - Generica -, ficaria assim:
Template
Class List
{
public:
List();
void Add(T*);
void Remove(T*);
int GetNumberOfElements() const;
boll IsEmpty() const;
void Clean();
T* PeekHead() const;
~List();
private:
T * Head;
R * Tail;
int NumberOfElements;
List(const List &);
List & operator = (const List & );
};
Ao instânciar um template estamos criando uma classe... Após isso, ao instânciar uma classe, estamos criando um objeto, cuja o qual é uma instância da classe que está sendo instânciada.
Para declarar um objeto a partir de um Template, fazemos ( usando o exemplo anterior );
List B;
Neste caso, "List" é o nome do Template; "Banana" é o tipo ao qual estamos submetendo o Template para a criação da classe "List"; e "B" é o objeto da classe "List".
Temos que antentar ao fato de que o tipo T tem de ser uma struct pois para termos uma lista, temos de ter dentro da estrutura do tipo um ponteiro para o próxio elemento ou seja, o tipo T tem de ter um valor que aponte para o proximo elemento da lista. Então teriamos:
Template
struct ListElement
{
T value;
ListElement* Next;
ListElement(const T& value):Value(value);
{}
}
Template
Class List
{
public:
void Add(const T&);
void AddAtHead(const T&);
bool Remove(const T&);
bool Contains(const T&) const;
bool IsEmpty() const;
void Clear();
int GetNumberOfElements() const;
// List();
// ~List();
private:
ListImp > Imp;
List(const List &);
List(const List &);
List & operator=(const List &);
};
// Não sei da onde é isso a diante.
No template ListImp o tipo T deve ser uma classe que declara como atributo público Next. Esta exigência impede que usemos ListImp para gerar uma lista de inteiros, por exemplo. Isto pode ser contornado com os seguintes templates. O template List Gera Classes cujos objetos são listas de elementos cujo valor é do tipo T . Suponha agora que sobre o tipo T sejam definidas as operações de cópia e comparação ( VERIFIQUE ) .
Um exemplo de como usar templates + replica manual de classes é o arquivo Exemplo1.txit . Ou seja, isto é usado quando não é viavel pelo custo a implementação por templates porém, é melhor esta implementação ao invés de replicar a classe toda manualmente várias vezes.
%CC_by_nc_sa_pequeno%
Copyright 2024 by contributing authors
Revisão: r1 - 06 Jan 2012 - 01:09:14 -
UnknownUser
Tópico: CacomUfms/ProgComp3