1 Aula 5 Instâncias dinâmicas. 2003/2004 Programação Orientada para Objectos 2 Instâncias… int j = 20; int f() { int const i = 10; // … } Constante automática.

Slides:



Advertisements
Apresentações semelhantes
TIPOS ABSTRATOS DE DADOS
Advertisements

Programação Orientada a Objetos*
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 04 Aquiles Burlamaqui UERN
Capítulo 1 – Conceitos Básicos 1 Segunda-feira, 22 de Outubro de 2007 UNIBRATEC – Ensino Superior e Técnico em Informática Aula 15 – Tipos de Dados Avançados.
Java - Interfaces Prof. Msc. Flávio Viotti.
Listas encadeadas Prof. Rosana Palazon.
1. Classes 2. Membros estáticos 1.1. Palavra chave this
Vamos abordar o exemplo
Programação Orientada aos Objectos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra Out/2005 Core C++: Uma abordagem.
Algoritmos e Programação Linguagens de Programação Teoria Aula 7 (19/05) Universidade Federal do Vale do São.
Ponteiros em C.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo II Confecção de Tabelas.
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
Funções.
Matrizes clássicas e vectores em C++
1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.
Aula 7 Instrução de iteração while. 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição.
2002/2003 Programação Orientada para Objectos 1 Aula 7 - Herança Herança pública: relação é um. A relação tem um. A relação é composto por um. Ponteiros,
Aula 11 Tipos Abstractos de Dados II. 2003/2004 Introdução à Programação 2 Estrutura global do programa #include using namespace std; int mdc(int const.
Aula 10 Tipos Abstractos de Dados I. 2003/2004 Introdução à Programação 2 Flashback Lembram-se da Aula 4?
2002/2003 Programação Orientada para Objectos 1 Aula 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica.
Modularização: funções e procedimentos (continuação)
Programação Orientada para Objectos
1 Aula 3 Listas e iteradores (cont.). 2003/2004 Programação Orientada para Objectos 2 ListaDeInt : interface class ListaDeInt { public: typedef int Item;
Aula 8 Polimorfismo.
Metodologia de Dijkstra para desenvolvimento de ciclos
Programação Baseada em Objectos Desenho de TAD
Aula 6 Instruções de selecção e instruções condicionais.
1 Aula 7 Herança. 2003/2004 Programação Orientada para Objectos 2 Conceitos fundamentais: Herança Polimorfismo Ligação dinâmica.
1 Aula 6 Classes que reservam recursos externos. 2003/2004 Programação Orientada para Objectos 2 PilhaDeInt : interface /** Representa pilhas de int.
Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas
Aula 13 Tipos Abstractos de Dados IV. 2003/2004 Introdução à Programação 2 Estrutura global do programa (I) Construtores Inspectores.
Aula 9 Fases do desenvolvimento de software UML Diagramas de classes
2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas.
Fases do desenvolvimento de software UML
2002/2003 Programação Orientada para Objectos 1 Aula 4 Memória, unidade básica de memória e conceito de endereço Ponteiros Relação de ponteiros com matrizes.
2002/2003 Programação Orientada para Objectos 1 Aula 3 Utilização de listas Melhorando a implementação das listas e iteradores Reflexão sobre interfaces.
Aula 2 Listas e iteradores.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Estrutura de Dados Avançada
APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.
Revisão /*======================================================*/
Ponteiros Variáveis do tipo “ponteiro” armazenam endereços de memória
Aula 07.
Linguagens Orientadas a Objeto
Interfaces.
Construção de Algoritmos AULA 04
Linguagem de Programação II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de Programação II
Atributos, Encapsulamento e Interface em Java
Argumentos por valor Passagem de valor da variável indicada Não permite alteração de variável indicada Exemplo: int quadrado_de(int ); //protótipo int.
VETORES Roteiro da aula Referência ao Programa: Estrutura de Dados
Linguagem de programação
Compilação de Linguagens OO Marco Simões (macs3) André Santos (alms)
Estruturas de Dados Aula 5: Matrizes
Procedural vs. OO (Figuras Geométricas: Área do triângulo)
Ambiente de Execução - Rotinas
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Programação orientada a objectos em C++
2002/2003 Programação Orientada para Objectos 1 Aula 6 Classes que reservam recursos externos Problemas comuns Construtores e destrutores Construção por.
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 07) Prof. Alessandro Bernardo.
Regras de escopo Escopo: trecho de codificação no qual o identificador possui significado Escopo de função: identificador válido dentro do trecho de uma.
2002/2003 Programação Orientada para Objectos 1 Aula 2 Noção de lista e de iterador Operações com listas e iteradores Classes embutidas.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo VII Variáveis Indexadas Numéricas.
Implementação Orientada a Objetos – Aula 06 Conversão de tipos e métodos estáticos Prof. Danielle Martin Universidade de Mogi das Cruzes
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 09) Prof. Alessandro Bernardo.
Programação orientada a objetos Com Visual Studio.
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 08) Prof. Alessandro Bernardo.
Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista POO para Redes de Computadores.
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
Transcrição da apresentação:

1 Aula 5 Instâncias dinâmicas

2003/2004 Programação Orientada para Objectos 2 Instâncias… int j = 20; int f() { int const i = 10; // … } Constante automática. Variável estática.

2003/2004 Programação Orientada para Objectos 3 Instâncias… Racional operator+(Racional um_racional, Racional const& outro_racional) { um_racional += outro_racional; return um_racional; } int main() { Racional r1(1, 3); Racional r2(2, 3); cout << r1 + r2 << endl; } Aparece 1 no ecrã. Valor devolvido é variável temporária!

2003/2004 Programação Orientada para Objectos 4 Instâncias (I) Características: Tipo Valor VariáveisConstantes Valor alterávelValor fixo

2003/2004 Programação Orientada para Objectos 5 Instâncias (II) DeclaradasNão-declaradas Características: nome tipo valor Características: sem nome tipo valor AutomáticasEstáticasTemporáriasDinâmicas Construídas quando a instrução de definição é atingida e destruídas no final do respectivo bloco. Construídas no início do programa ou quando a sua instrução de definição é atingida pela primeira vez e destruídas no final do programa. Construídas durante o cálculo de uma expressão e destruídas no final da expressão completa em que são criadas. Construídas e destruídas sob o domínio integral do programador.

2003/2004 Programação Orientada para Objectos 6 int* p = new int(10); int const* p = new int const(10); Criação de instâncias dinâmicas (I) p : int* 10 : int p : int const* 10 : int {frozen}

2003/2004 Programação Orientada para Objectos 7 Aluno class Aluno { public: Aluno(string const& nome, int número); string const& nome() const; int número() const; private: string nome_; int número_; }; Aluno::Aluno(string const& nome, int const número) : nome_(nome), número_(número) {} string const& Aluno::nome() const { return nome_; } int Aluno::número() const { return número_; }

2003/2004 Programação Orientada para Objectos 8 Aluno* pa = new Aluno(Zé, 77); Aluno const* pac = new Aluno const(Zé, 77); Criação de instâncias dinâmicas (II) pa : Aluno* nome_ = Zé número_ = 77 : Alunopac : Aluno const* nome_ = Zé número_ = 77 : Aluno {frozen}

2003/2004 Programação Orientada para Objectos 9 Utilização e destruição de instâncias dinâmicas Como escrever o aluno no ecrã? cout nome() número() << endl; Como destruir uma instância dinâmica? delete pa; delete pac; A partir deste momento pa e pac contêm lixo.

2003/2004 Programação Orientada para Objectos 10 Qual a duração da instância dinâmica? Exemplo de código, conceptualmente incorrecto: void f(int* p) { cout << *p << endl; delete p; } int main() { int* pi = new int(10); f(pi); } Construção Destruição

2003/2004 Programação Orientada para Objectos 11 Regras 1. Todas as instâncias dinâmicas têm de ser destruídas uma e uma só vez! 2. Quem constrói, destrói

2003/2004 Programação Orientada para Objectos 12 Políticas de gestão de instâncias dinâmicas Quem constrói destrói ou, posse única da instância dinâmica Quem possui destrói, ou posse única mas transferível da instância dinâmica O último fecha a porta, ou posse partilhada da instância dinâmica

2003/2004 Programação Orientada para Objectos 13 Erros mais comuns (I) Fugas de memória instâncias dinâmicas construídas e nunca destruídas for(int i = 0; i != ; ++i) int* p = new int(i);

2003/2004 Programação Orientada para Objectos 14 Fuga de memória int const* p = new int const(10); p = new int const(20); : int 24 p: int*

2003/2004 Programação Orientada para Objectos 15 Fuga de memória int const* p = new int const(10); p = new int const(20); : int 20 : int 28 p: int* Memória ocupada não acessível.

2003/2004 Programação Orientada para Objectos 16 Erros mais comuns (II) Outros casos: double* p = new double(1.1); delete p; : double 24 p: double* Erro!

2003/2004 Programação Orientada para Objectos 17 Aluno class Aluno { public: Aluno(string const& nome, int número); ~Aluno(); string const& nome() const; int número() const; private: string nome_; int número_; }; Aluno::Aluno(string const& nome, int const número) : nome_(nome), número_(número) {} Aluno::~Aluno() { cout << Arghhh! << endl; } string const& Aluno::nome() const { return nome_; } int Aluno::número() const { return número_; }

2003/2004 Programação Orientada para Objectos 18 Destruição int main() { Aluno* pa = new Aluno; delete pa; } Erro: o contrutor de aluno tem dois parâmetros. Deveria ser (por exemplo): Aluno* pa = new Aluno(Zé, 1); Aparece no ecrã: Arghhh!

2003/2004 Programação Orientada para Objectos 19 Matrizes dinâmicas: operadores new[] e delete[] int* p = new int[10]; for(int i = 0; i != 10; ++i) p[i] = i; for(int i = 0; i != 10; ++i) cout << p[i] << endl; delete[] p;

2003/2004 Programação Orientada para Objectos 20 Criação de matriz dinâmica Como são construídos os elementos da matriz? Construtor por omissão Excepto se forem de tipos básicos Tipos básicos não são inicializados

2003/2004 Programação Orientada para Objectos 21 E quando não há memória? Lançamento de excepção Alternativa (a evitar): #include … int* p = new(nothrow) int(20); if(p == 0) { cerr << Não havia memória! << endl; … } Nenhum objecto tem o endereço 0.

2003/2004 Programação Orientada para Objectos 22 PilhaDeInt : interface /** Representa pilhas de (questão de implementação). */ class PilhaDeInt { public: typedef double Item; /** Constrói pilha estaVazia(). */ PilhaDeInt(); /** Devolve o item que está no topo da topo idêntico ao item no topo de *this. */ Item const& topo() const;

2003/2004 Programação Orientada para Objectos 23 PilhaDeInt : interface /** Indica se a pilha está estaVazia = *this está vazia. */ bool estáVazia() const; /** Devolve altura da altura = altura de *this. */ int altura() const;

2003/2004 Programação Orientada para Objectos 24 PilhaDeInt : interface /** Põe um novo item na pilha (no *this contém um item adicional no topo igual a novo_item. */ void põe(Item const& novo_item); /** Tira o item que está no topo da ¬ *this contém os itens originais menos o do topo. */ void tiraItem();

2003/2004 Programação Orientada para Objectos 25 Memória dinâmica em classes (I) class PilhaDeInt { public: typedef int Item; … private: static int const capacidade_inicial = 32; int capacidade_actual; Item* itens; int número_de_itens; bool cumpreInvariante() const; };

2003/2004 Programação Orientada para Objectos 26 Memória dinâmica em classes (II) Construtor: inline PilhaDeInt::PilhaDeInt() : capacidade_actual(capacidade_inicial), itens(new Item[capacidade_actual]), número_de_itens(0) { assert(cumpreInvariante()); }

2003/2004 Programação Orientada para Objectos 27 Memória dinâmica em classes (III) void PilhaDeInt::põe(Item const& novo_item) { assert(cumpreInvariante()); if(número_de_itens == capacidade_actual) { Item* novos_itens = new Item[capacidade_actual * 2]; for(int i = 0; i != número_de_itens; ++i) novos_itens[i] = itens[i]; capacidade_actual *= 2; delete[] itens; itens = novos_itens; } itens[número_de_itens] = novo_item; ++número_de_itens; assert(cumpreInvariante()); }

2003/2004 Programação Orientada para Objectos 28 Memória dinâmica em classes (IV) Evitar fuga de memória: é necessário um destrutor inline PilhaDeInt::~PilhaDeInt() { assert(cumpreInvariante()); delete[] itens; }

2003/2004 Programação Orientada para Objectos 29 Problemas PilhaDeInt p; p.põe(2); p.põe(3); p.põe(4); PilhaDeInt cópia = p; cópia.tira(); PilhaDeInt outra; outra = p;

2003/2004 Programação Orientada para Objectos 30 Aula 5: Sumário Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas Problemas comuns Matrizes dinâmicas Introdução à memória dinâmica em classes: Construtores e destrutores Problema da cópia e da atribuição