13/11/15. Incrementando C: C++ E na especificação de BigInt... Arquitetura da solução exemplo. O arquivo de declarações. Explorando a classe BigInt

Documentos relacionados
# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Estrutura de dados 1. Ponteiros

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

11a. Aula Ponteiros e Vetores

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Algoritmos e Estruturas de dados

Classes e Encapsulamento

Introdução a Programação. Tipos Estruturados de Dados

Módulo 5 Vetores e Alocação Dinâmica

C com introdução a OO

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Estruturas de Dados. Profa. Juliana Pinheiro Campos

BCC202 - Estrutura de Dados I

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Ponteiros e Alocação de Memória

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Programação Estruturada Prof. Rodrigo Hausen Ponteiros e Passagem de Parâmetros

Aula 17: Ponteiros e Alocação Dinâmica em C

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Entender o problema Encontrar um algoritmo para resolvê-lo. Implementar o algoritmo numa linguagem de programação

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Ponteiros de Variáveis

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

DAS5102 Fundamentos da Estrutura da Informação

Princípios de Desenvolvimento de Algoritmos MAC122

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação Estruturada Prof. Rodrigo Hausen Agregados de Dados Heterogêneos (structs)

Métodos Computacionais. Tipos Estruturados

Aula 27: Estruturas heterogêneas e alocação dinâmica

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Professora Jeane Melo

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Aula 24 Ponteiros, vetores e structs

Linguagem de Programação III

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

Introdução à Computação

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Instituto Federal da Bahia Análise e Desenvolvimento de Sistemas INF029 Laboratório de Programação Aula 03: Ponteiros

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Tipos Abstratos de Dados. Estrutura de Dados

Aula 25: Alocação Dinâmica

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Programação Orientada a Objetos para Redes de Computadores. Arrays. Arrays

Programação de Computadores II. Cap. 5 Vetores

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Tipos de Dados Definidos Pelo Usuário. Estruturas Uniões Enumerações O Comando sizeof O Comando typedef

Curso de Programação C em Ambientes Linux Aula 05

ESTRUTURA DE DADOS (TCC )

Alocação Dinâmica em C

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação C/C++ Slide 5 Nielsen Castelo Damasceno

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Introdução à Programação C

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Linguagem de Programação

Programação Orientada a Objetos para Redes de Computadores

Atividade de laboratório listas encadeadas simples

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Computação 2. Aula 7. Profª. Fabiany Ponteiros

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Técnicas de Programação:

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Fundamentos de Programação

Capítulo 5. Nomes, Vinculações e Escopos

Linguagens de Programação Departamento de Engenharia Eletrônica e de Computação - DEL-Poli/UFRJ Prof.: Miguel Elias Mitre Campista

Programação Orientada a Objetos CLASSES E OBJETOS

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Introdução à Disciplina de. Adair Santa Catarina Curso de Ciência da Computação Unioeste Campus de Cascavel PR

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Caracteres e Cadeias de Caracteres

Programação Estruturada

Métodos Computacionais. Listas Encadeadas

Algoritmos e Programação

Construtores. Introdução

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Ponteiros. Baseado nos slides do Prof. Mauro.

Programação: Vetores

Introdução ao Java. Marco A L Barbosa malbarbo.pro.br. Departamento de Informática Universidade Estadual de Maringá

Ponteiros. Introdução

Princípios de Desenvolvimento de Algoritmos MAC122

Transcrição:

Incrementando C: permite: Definir uma classe para números grandes; Manter o código bem parecido com o programa C. O mesmo programa em C (e até mesmo em Java) não são tão convenientes e elegantes. #include "BigInt.h" main() { BigInt b = "456023398798362"; BigInt c; c = a + b + 47; c.print(); printf("\n"); Janeiro 2014 Curso Rápido de 1 E na especificação de BigInt... A especificação de BigInt deve dizer como: 1. Criar objetos da classe BigInt (de strings!); 2. Somar BigInt x BigInt e BigInt x int/long; 3. Imprimir um BigInt. #include "BigInt.h" main() { BigInt b = "456023398798362"; BigInt c; c = a + b + 47; 2 c.print(); 3 printf("\n"); Janeiro 2014 Curso Rápido de 2 1 Arquitetura da solução exemplo Similares aos TADs; Porém com abstrações mais adequadas. BigInt.cpp BigInt.h BigInt.o Linker O arquivo de declarações #include <stdio.h> class BigInt { char* digitos; unsigned ndigitos; public: BigInt(char*); BigInt(BigInt&); Atributos Construtores Sobrescrita = e + Client.cpp Client.o Client.exe void operator=(bigint&); BigInt operator+(bigint&); void print(file* f = stdout); Impressão Janeiro 2014 Curso Rápido de 3 ~BigInt() { delete digitos; ; Destrutor Janeiro 2014 Curso Rápido de 4 Classes são similares a structs; BigInt possui um vetor de chars (ponteiro) e um contador do número de dígitos; O número é armazenado de trás para frente; Ex.: o BigInt 654321 seria: digitos 6 ndigitos 1 2 3 4 5 6 Atributos (variáveis membro) privadas, métodos (funções membro) públicas: print() BigInt(char*) (construir) char* digitos int ndigitos operador+(bigint&) (somar) BigInt(BigInt&) (inicializar) BigInt a = 218 BigInt c = a + b +47; c.print(); Janeiro 2014 Curso Rápido de 5 Janeiro 2014 Curso Rápido de 6 1

Sobrecarga como em Java: o mesmo nome é permiado, desde que os parâmetros sejam diferentes: BigInt(char*); BigInt(BigInt&); Construtor default Mesma regra de Java: Se nenhum construtor é dado, um construtor default (sem argumentos) é adicionado pelo ; Se algum construtor for dado, o construtor sem argumentos não é adicionado automaacamente; Em BigInt, um dos construtores serve de construtor default (sem argumentos), pois seu argumento tem valor default: Janeiro 2014 Curso Rápido de 7 Janeiro 2014 Curso Rápido de 8 Funções podem ter argumentos default: void print(file* f = stdout); Se forem chamadas sem argumento, o valor default é ualizado; Instâncias diretas e ponteiros Em Java, instâncias eram sempre referências (ponteiros). possui os dois apos; Os já conhecidos. e -> de C são usados para acessar membros da classe: a.print(); BigInt* p; p = &a; p->print(); Janeiro 2014 Curso Rápido de 9 Janeiro 2014 Curso Rápido de 10 Construtores Mais versáteis que Java // Chama o construtor default: BigInt (unsigned n = 0): BigInt a, vetor[10]; // Chama o mesmo construtor, só que especificando valor: BigInt b = 123; // O mesmo construtor também é chamado para conversão: BigInt c = a + b + 47; Construtor de Cópia O construtor de cópia é chamado (automaacamente não explicitamente pelo programador quando): Um objeto é passado por valor para uma função Um objeto é retornado por valor Um objeto é declarado e inicializado com um objeto da mesma classe /* Acima, o construtor BigInt (BigInt&) também é acionado para criar um BigInt a partir de outro. */ // Chama o construtor BigInt (char*): BigInt d = "456"; BigInt e("789"); Janeiro 2014 Curso Rápido de 11 Janeiro 2014 Curso Rápido de 12 2

Sobrescrita permite sobrescrever qualquer operador, exceto o operador de seleção (.) e a expressão condicional (?:); // Na classe BigInt: void operator=(bigint&); BigInt operator+(bigint&); // No cliente: BigInt b = "456023398798362"; BigInt c; c = a + b + 47; Obviamente, o desenvolvedor deve implementar os métodos operator= e operator+. Destrutores Em, o desenvolvedor deve destruir as instâncias que criou, não há coletor de lixo; O irá, no entanto, destruir instâncias diretas criadas na pilha. Portanto, destrutores são sempre chamados (diferente do Java, que não garante o finalize()); Destrutores devem liberar memória dinâmica alocada pela classe durante a construção da instância. // No exemplo, o destrutor foi declarado e definido: ~BigInt() { delete digitos; // free() no C -> delete no. Janeiro 2014 Curso Rápido de 13 Janeiro 2014 Curso Rápido de 14 Arquitetura da solução exemplo O arquivo header está OK! Falta agora a implementação. BigInt.cpp BigInt.o Linker BigInt.h Client.cpp Client.o Client.exe [ Curso Rápido de ] DEFININDO CLASSES (IMPLEMENTAÇÃO) Janeiro 2014 Curso Rápido de 15 Janeiro 2014 Curso Rápido de 16 Implementação/definição Similar a um TAD, o arquivo de definição deve: Importar o arquivo de declaração (header); #include "BigInt.h"; Prover uma implementação para todas as funções (métodos) declaradas no header. A declaração de uma classe diz o que as instâncias da classe podem fazer (contrato); A definição/implementação de uma classe diz como as instâncias da classe farão o que encontra-se no contrato. Janeiro 2014 Curso Rápido de 17 Vamos ver algumas caracterísacas de presentes na implementação da classe BigInt: BigInt:: BigInt (char* digitstring) { unsigned n = strlen(digitstring); if (n!= 0) { digitos = new char[ndigitos = n]; char* destino = digitos; char* origem = &digitstring[n]; // Converte o digito ASCII para binário. while (n--) *destino++ = *--origem - '0 ; else { // String vazia. digitos = new char[ndigitos = 1]; digitos[0] = 0; Janeiro 2014 Curso Rápido de 18 3

Resolução de escopo A implementação de um método é prefixada com o operador de resolução de escopo (::): BigInt:: BigInt (char* digitstring) { Moavo: diferente de Java, o método não encontra-se obrigatoriamente dentro do escopo da classe; Pode-se usá-lo também para variáveis: int var = 0; int main(void) { int var = 0; ::var = 1; // Altera a variável global. var = 2; // Altera a variável local. O operador new Subsatui o malloc() de C: // C: struct BigInt* p; p = (struct BigInt*) malloc(sizeof(struct BigInt)); // : BigInt* p; p = new BigInt; // Sem cast ou sizeof! Assim como em Java, new chama o construtor da classe, inicializando o objeto; Diferente de Java, () não é obrigatório; Diferente dos construtores de instâncias diretas vistos anteriormente, o new retorna um ponteiro. Janeiro 2014 Curso Rápido de 19 Janeiro 2014 Curso Rápido de 23 Veja a implementação do construtor que recebe um inteiro. Note que não é preciso repear o valor default: BigInt:: BigInt(unsigned n) { char d[3 * sizeof(unsigned) + 1]; char *dp = d; ndigitos = 0; do { *dp++ = n % 10; // guarda dígito menos signif n /= 10; // eliminar o dígito menos signif ndigitos++; while (n > 0); // agora que sabemos o tamanho, podemos alocar digitos digitos = new char[ndigitos]; for (register i = 0; i < ndigitos; i++) digitos[i] = d[i]; E o construtor cópia: BigInt::BigInt(BigInt& n) { unsigned i = n.ndigitos; digitos = new char[ndigitos = i]; char *destino = digitos; char *origem = n.digitos; while (i--) *destino++ = *origem++; Como em Java, o acesso ao atributo privado n.digitos é permiado por estarmos no escopo de BigInt. Janeiro 2014 Curso Rápido de 24 Janeiro 2014 Curso Rápido de 25 Passagem por referência O construtor cópia ualiza passagem por referência: BigInt::BigInt(BigInt& n) { Em C, a passagem é sempre feita por valor: void inc(int x) { x++; int y = 1; inc(y); printf("%d\n", y); // 1 Pode-se contornar passando o valor de um ponteiro: void inc(int* x) { *x++; int y = 1; inc(&y); printf("%d\n", y); // 2 Passagem por referência Em existe a passagem por referência: void inc(int& x) { x++; int y = 1; inc(y); printf("%d\n", y); // 2 Note que: A variável x não precisou ser derreferenciada em inc(); A variável y foi passada como argumento normalmente, e não seu endereço &y. Janeiro 2014 Curso Rápido de 26 Janeiro 2014 Curso Rápido de 27 4

Referências Portanto, além de ponteiros, possui referências: int i; int* p = &i; // Um ponteiro para i. int& r = i; // Uma referência para i. r++; // Incrementa o valor de i. Você pode usar r em lugar de *p (ou seja, i) e &r em lugar de p (como se fosse &i) Porém, referências: Devem ser inicializadas quando declaradas; Não podem apontar para um objeto diferente do qual foram inicializadas. Referências são como apelidos, aliases para objetos (sintaxe mais segura do que ponteiros). Janeiro 2014 Curso Rápido de 28 Uso do this Assim como em Java, this pode ser usado para diferenciar entre parâmetro e atributo: class Objeto { long attr; public: Objeto(long attr = 0) { this->attr = attr; void setattr(long attr) { this->attr = attr; void print() { printf("%ld\n", attr); ; int main () { Objeto c(10); c.print(); // 10 c.setattr(20); c.print(); // 20 this é sempre um ponteiro! Janeiro 2014 Curso Rápido de 29 Construtor cópia vs. sobrescrita do = BigInt::BigInt(BigInt& n) { unsigned i = n.ndigitos; digitos = new char[ndigitos = i]; char* p = digitos; char* q = n.digitos; while (i--) *p++ = *q++; void BigInt::operator=(BigInt& n) { if (this == &n) return; // Para o caso x = x; delete digitos; // Porque this já existe! unsigned i = n.ndigitos; digitos = new char[ndigitos = i]; char* p = digitos; char* q = n.digitos; while (i--) *p++ = *q++; Atribuições múlaplas de BigInt Da forma como foi declarado/definido, não é possível fazer atribuições múlaplas de BigInt: void BigInt::operator=(const BigInt& n) { // No cliente: BigInt c = 243; BigInt a, b; a = b = c; // Erro! (b = c) retorna void! Para isso, é necessário retornar um valor: BigInt& BigInt::operator=(const BigInt& n) { return *this; Janeiro 2014 Curso Rápido de 35 Janeiro 2014 Curso Rápido de 36 Retorno de objetos/ponteiros/referências É perfeitamente possível; Ao retornar objetos, o construtor de cópia da referida classe é chamado. Ao retornar ponteiros e referências, deve-se ter o cuidado de garanar que o referido objeto sobreviva: Ponto* f() { Ponto a; //... return &a; // Objeto apontado será desalocado! Ponto& f() { Ponto a; //... return a; // Objeto referido será desalocado! Janeiro 2014 Curso Rápido de 37 O Operador delete Como já visto, delete é o contrário de new e libera a memória alocada para um objeto (como free em C); delete aciona o destrutor da classe: BigInt* a = new BigInt("9834567843"); // [...] Chama a->~bigint(); delete a; Ao liberar vetores, é preciso usar colchetes: BigInt* b = new BigInt[10]; delete b; // Erro! delete[] b; // OK! Janeiro 2014 Curso Rápido de 38 5

Usando referências para criar factory // user must deallocate Ponto& criaponto () { Ponto* p = new Ponto; return *p; int main() { Ponto& ponto = criaponto(); ponto.usaponto(); delete &ponto; Usando referências para manipular objetos (esalo Java) int main() { Ponto& ponto = *(new Ponto); // note que ainda é diferente que Java // pois somos forçados a inicializar // ou seja Ponto& ponto; é inválido ponto.usaponto(); delete &ponto; Janeiro 2014 Curso Rápido de 39 Janeiro 2014 Curso Rápido de 40 Funções inline Assim como os #defines de C, funções inline são copiadas para o local de suas chamadas na compilação; Aumento de desempenho por evitar chamada de função; Podem ser definidas de duas maneiras: Definindo sua implementação no arquivo de definição (header), como feito com ~BigInt(); Usando a palavra reservada inline. Deve-se ter cuidado ao definir funções inline. Recomenda-se usar apenas para funções bem simples. Janeiro 2014 Curso Rápido de 41 6