Passagem de parâmetros

Documentos relacionados
Passagem de parâmetros

Programação Orientada por Objectos em C++ (alguns conceitos) Algoritmos e Estruturas de Dados 2009/2010. Três maneiras de passar parâmetros:

Composição de classes

Conceito de classe em C++

Introdução à Programação com Classes em C++

Conceito de classe em C++

Overloading de Operadores

Programação Orientada a Objetos CLASSES E OBJETOS

Introdução ao C++ Ambientes de Desenvolvimento Avançados. 2 de Outubro de 2002 ADA / DEI - ISEP 2002/2003 1

Overloading de Operadores

Fundamentos de Programação

Fundamentos de Programação 2

Herança em C++ Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2006/2007) Herança

Introdução à linguagem C++

Estrutura de dados 1. Ponteiros

Linguagem de Programação C++

Física Computacional 11 Classes

Conceito de classe em C++

Linguagem de Programação III

Programação Orientada a Objetos

Tratamento de Excepções. Introdução ao tratamento de excepções

Redefinição de Operadores

DEM-Sec.Sistemas Tipos Abstractos de Informação 2006 / Programação

Física Computacional 7 Classes

Técnicas de Programação:

Programação com Classes em C++ (Parte 2)

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

C++ - Funções. Forma geral das funções C++

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

Fundamentos de Programação

CPP. C plus plus versus Java

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Aula 24: Ponteiros e Alocação Dinâmica

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

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

DEFINIÇÃO DE CLASSES EM C++

Programação científica C++

PCS Laboratório de Programação Orientada a Objetos 1a. Prova. 02 de Setembro de 2015

Programação Orientada a Objetos

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

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

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

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

Computação e Programação (2007/2008-1º Semestre)

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

Introdução à Programação. Conceitos Básicos de Orientação a Objetos

Funções. definição, declaração e chamada

Parte IV. Linguagens de Programação. Relembrando da Última Aula... Empacotador de Préprocessadores. Primeiro Exemplo Usando Classes em C++

Linguagens de Programação

Aula 26: Estruturas heterogêneas

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Programação Orientada a Objetos para Redes de Computadores

Programação Orientada a Objetos para Redes de Computadores. Empacotador de Pré-processador. Empacotador de. Primeiro Exemplo Usando Classes em C++

3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)

O que é um apontador em C (type pointer in C)?

Programação estruturada em C++: extensões ao C. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005)

Classes e Encapsulamento

ECT1203 Linguagem de Programação

Programação Orientada a Objetos para Redes de Computadores

Programação Orientada a Objetos para Redes de Computadores. Fundamentos de Sobrecarga de Operadores. Sobrecarga de Operadores

Aula 25: Alocação Dinâmica

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes

//conteúdo do arquivo pacote.h

LINGUAGEM DE PROGRAMAÇÃO C++ CLASSES E OBJETOS

Algoritmos e Estruturas de Dados

Programação Estruturada em C++: Extensões ao C

Programação I Funções. Prof. Carlos Alberto

Objectivos. Iniciar a programação de funções. Estudar a chamada de funções. Estudar a forma como são executadas as funções

Estrutura de Dados Funções e Procedimentos

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Programação Orientada a Objetos Aula I Declaração de classes, métodos construtores. Prof.: Bruno E. G. Gomes IFRN

Laboratório de programação II

Ponteiros e Tabelas. K&R: Capítulo 5

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Introdução à linguagem C++

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

Algoritmos e Estruturas de Dados 2009/2010

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Programação por Objectos. Java

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

Classes e Objetos. Prof. Leonardo Barreto Campos 1

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

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Linguagens de Programação. Parte IV. Relembrando da Última Aula... Sobrecarga de Operadores. Fundamentos de Sobrecarga de Operadores

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Física Computacional 3 mem. estática e dinâmica

Controlo de Execução. K&R: Capitulo 3

Orientação a Objetos. Programação em C++

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Linguagem de Programação III

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Linguagem de Programação C++

12. SOBRECARGA DE OPERADOR

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

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição

C com introdução a OO

Carlos Eduardo Batista. Centro de Informática - UFPB

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

Transcrição:

Programação com Classes em C++ (cont.) João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006) FEUP - MIEEC Prog2-2006/2007 Passagem de parâmetros Três maneiras de passar parâmetros: Por valor, para objectos pequenos que não são alterados pela função Por referência constante, para objectos grandes que não são alterados pela função Por referência,, para objectos que podem ser alterados pela função Ex: double avg(const vector<int> &a, int n, bool & errorf) 2

Retorno em funções-membro Três possibilidades: Por valor, quando o objecto a retornar é construído numa variável automática Por referência (pouco usado), evita cópia possível quando o objecto a retornar não é local à função Por referência constante a referência retornada não pode ser modificada pelo chamador 3 Retorno por referência constante Exemplo: procurar a maior string num vector OK const string &findmax(const vector<string> &a) int maxindex = 0; for (int i=1; i<a.size(); i++) if (a[maxindex] < a[i]) maxindex = i; return a[maxindex]; const string &findmaxwrong(const vector<string> &a) string maxvalue = a[0]; for (int i=1; i<a.size(); i++) if (maxvalue < a[i]) maxvalue = a[i]; return maxvalue; errado 4

Conversão de tipos e qualificador explicit C++ permite conversão implícita de tipos ex: se d é do tipo double e i do tipo int, é válido: d = i ; ou i = d; Tipos definidos com classes construtores de 1 parâmetro definem uma conversão implícita de tipo Exemplo: IntCell c1 = 54; equivale a chamar o construtor IntCell(int) para criar objecto c1 Para impedir conversão implícita usar qualificador explicit nos construtores de 1 argumento 5 Qualificador explicit class IntCell explicit IntCell (int initialvalue=0); private: int storedvalue; Semexplicit IntCell c1; c1=20; IntCell c2 = IntCell(20); IntCell c3, c4(20); c3 = c4; Com explicit IntCell c1; c1=20; IntCell c2 = IntCell(20); IntCell c3, c4(20); c3 = c4; // OK // OK // OK // errado // OK // OK 6

Qualificador friend Declarar uma função como friend função tem acesso aos membros privados da classe Contraria encapsulamento Alternativa: usar funções de acesso para obter os valores dos membros privados a usar na função externa Declarar uma classe como friend todos os membros-função são friend 7 Qualificador friend class MyVector float v[4]; friend MyVector multiplica(const MyMatrix &, const MyVector &); ; class MyMatrix MyVector v[4]; friend MyVector multiplica(const MyMatrix &, const MyVector &); ; MyVector multiplica(const MyMatrix &m, const MyVector &v) MyVector r; for (int i = 0; i<4; i++) r.v[i] = 0; for (int j = 0; j<4; j++) r.v[i] += m.v[i].v[j] * v.v[j]; return r; função que multiplica uma matriz por um vector 8

Funções Friend // friend functions #include <iostream> using namespace std; class CRectangle int width, height; void set_values (int, int); int area () return (width * height); friend CRectangle duplicate (CRectangle); ; //função duplicate é friend da classe CRectangle void CRectangle::set_values (int a, int b) width = a; height = b; CRectangle duplicate (CRectangle rectparam) CRectangle rectres; rectres.width = rectparam.width*2; rectres.height = rectparam.height*2; return (rectres); 9 //Programa de Teste Funções Friend int main () CRectangle rect, rectb; rect.set_values (2,3); rectb = duplicate (rect); cout << rectb.area(); return 0; 10

Classes Friend ///Friend class #include <iostream> using namespace std; class CSquare; class CRectangle int width, height; int area () return (width * height); void convert (CSquare a); ; class CSquare private: int side; void set_side (int a) side=a; friend class CRectangle; //Class CRectangle é freind de CSquare ; void CRectangle::convert (CSquare a) width = a.side; height = a.side; 11 //Programa de Teste Classes Friend int main () CSquare sqr; CRectangle rect; sqr.set_side(4); rect.convert(sqr); cout << rect.area(); return 0; 12

Composição de classes Uma classe pode ter como membros objectos doutras classes Membros-objecto são inicializados antes dos objectos de que fazem parte Os argumentos para os construtores dos membros-objecto são indicados através da sintaxe de inicializadores de membros Exemplo: class Pessoa Pessoa(char *n, int d, int m, int a); // construtor //... private: char *nome; Data nascimento; // membro-objecto ; Pessoa::Pessoa(char *n, int d, int m, int a) : nascimento(d,m,a) /*... */ 13 O apontador this Cada membro-função (não estático) tem como argumento implícito um apontador para o objecto para o qual a função é chamada, designado this usado implicitamente em todas as referências a membros do objecto também pode ser usado explicitamente O apontador this não pode ser alterado pela função tipo: nome-da-classe * const this (apontador constante) Se a função for constante, o objecto apontado não é alterado pela função tipo: nome-da-classe const * const this (apontador constante para objecto constante) Exemplo: a seguinte função da classe Data int Data::getDia() const return dia; pode escrever-se de forma equivalente: int Data::getDia() const return this->dia; 14

O apontador this (cont.) Caso de uso de this: para permitir encadear chamadas de funções sobre um dado objecto class Data Data & setdia(int d); Data & setmes(int m); Data & setano(int a); //... private: int dia, mes, ano; ; // actualiza o dia e devolve referência para mesmo // objecto, para poder ser usada de forma encadeada Data & Data::setDia(int d) dia = d; return *this; Data d; d.setdia(27).setmes(3).setano(2000); 15 Criação e destruição de objectos com new e delete Criação de objecto: Tipo *tipoptr; tipoptr = new Tipo; cria um objecto do tamanho apropriado, chama o construtor para o objecto (se existir) e devolve um apontador do tipo correcto ou 0 (se não há espaço) podem ser usados inicializadores (são passados ao construtor): Data *dataptr = new Data (27, 3, 2000); Destruição de objecto: delete dataptr; invoca o destrutor para o objecto (se existir) e só depois liberta a memória Criação de array de objectos: Data *p = new Data[12]; invoca o construtor por omissão (sem argumentos) para cada objecto do array não admite inicializadores Destruição de array de objectos: delete [] p; invoca o destrutor para cada objecto do array 16

Destrutores Um membro-função com o mesmo nome da classe precedido do til (~) é um destrutor Destrutores não recebem parâmetros e não retornam valor O destrutor da classe é invocado automaticamente sempre que um objecto deixa de existir para objectos globais e objectos locais estáticos, o destrutor é chamado no fim da execução do programa para objectos locais automáticos, o destrutor é chamado quando estes saem do âmbito (scope) (quando a execução sai do bloco em que são definidos) para objectos temporários embebidos em expressões, o destrutor é chamado no final da avaliação da expressão completa Destrutores servem normalmente para libertar recursos (memória dinâmica, etc.) associados ao objecto 17 Exemplo com destrutor class Pessoa Pessoa(const char *nm); // construtor ~Pessoa(); // destrutor const char *getnome(); // consulta o nome (devolve // apontador só para consulta) void setnome(const char *); // muda o nome private: char *nome; // apontador p/ array de caracteres alocado à medida ; Pessoa::Pessoa(const char *nm) nome = new char [strlen(nm)+1]; strcpy(nome, nm); Pessoa::~Pessoa() delete [] nome; const char *Pessoa::getNome() return nome; void Pessoa::setNome(const char *n) delete [] nome; nome = new char [strlen(n)+1]; strcpy(nome, n); 18

Construtor de cópia Um objecto de uma classe pode ser inicializado com uma cópia doutro objecto da mesma classe Exemplo: Data d1 (27, 3, 2000); Data d2 = d1; O comportamento por omissão é uma cópia membro a membro Para especificar outro comportamento: escrever um construtor que tem como argumento uma referência para um objecto da mesma classe (construtor de cópia), o qual é automaticamente usado para tratar atribuição sem ser na inicialização - com sobrecarga de operador = Por exemplo, na classe Pessoa já apresentada, o comportamento por omissão não é seguro, devido à alocação dinâmica do nome. Alternativa: class Pessoa Pessoa(Pessoa & p); //... ; Pessoa::Pessoa(Pessoa & p) nome = new char [strlen(p.nome)+1]; strcpy(nome, p.nome); 19 Exemplo com construtor de cópia // Programa de teste da classe Factura main() Factura f1(100), f2(200), f3, f4 = f2 /*legal apesar de const*/; /* f4 = f2; ilegal devido a const */ cout << "n=" << f1.getnumero() << " v=" << f1.getvalor() << endl; cout << "n=" << f2.getnumero() << " v=" << f2.getvalor() << endl; cout << "n=" << f3.getnumero() << " v=" << f3.getvalor() << endl; cout << "n=" << f4.getnumero() << " v=" << f4.getvalor() << endl; cout << "ultimo numero=" << Factura::getUltimoNumero() << endl; return 0; Resultados produzidos pelo programa de teste: n=1 v=100 n=2 v=200 n=3 v=0 n=2 v=200 -> Não gerou um novo número para f4!! ultimo numero=3 20

Exemplo com construtor de cópia (cont.) // Correcção da classe factura class Factura Factura(Factura & f); //... ; // copia o valor mas dá um novo número Factura::Factura(Factura & f) : numero(++ultimonumero) valor = f.valor; main() Factura f1(100), f2(200), f3, f4 = f2 /*usa constr. de cópia*/; /* f4 = f2; ilegal devido a const e não usa constr. de cópia*/ //... Resultados produzidos pelo programa de teste: n=1 v=100 n=2 v=200 n=3 v=0 n=4 v=200 -> Gerou um novo número para f4!! ultimo numero=4 21 Os 3 grandes Classes possuem 3 funções já definidas: Destrutor libertação recursos que foram alocados durante uso objecto invocado quando objecto deixa de ser válido ou é sujeito a delete por omissão: aplica destrutor a cada membro-dado Construtor de cópia construção de um novo objecto, inicializado com uma cópia de outro do mesmo tipo por omissão: aplica construtor de cópia a cada membro-dado; atribuição para tipos primitivos Operador de atribuição (=) copia o estado de um objecto para outro do mesmo tipo, quando = é aplicado a dois objectos por omissão: aplica operador = a cada membro-dado 22

IntCell IntCell : membro-dado é um apontador // Data member is a pointer; defaults are no good class IntCell explicit IntCell( int initialvalue = 0) storedvalue = new int(initialvalue); int read() const return *storedvalue; void write(int x) *storedvalue = x private: int *storedvalue; ; 23 IntCell: comportamento indesejado // simple function that exposes problems int f IntCell a(2); IntCell b = a; IntCell c; c = b; a.write(4); cout << a.read() << endl << b.read() << endl << c.read() << endl; return 0; Resultado? 24

Problema IntCell: comportamento indesejado construtor de cópia e operador = por omissão o que é copiado é o apontador a.storedvalue, b.storedvalue, e c.storedvalue apontam para o mesmo valor inteiro // the defaults for the big three IntCell::~IntCell() IntCell::IntCell(cont IntCell & rhs) : storedvalue(rhs.storedvalue) const IntCell & IntCell:: operator= (const IntCell & rhs) if (this!= & rhs) storedvalue = rhs.storedvalue; return *this; 25 IntCell: definir os 3 grandes // Data member is a pointer; big three needs to be written class IntCell explicit IntCell( int initialvalue = 0); IntCell (const IntCell & rhs); ~IntCell(); const IntCell & operator= (const Intcell & rhs); int read() const; void write(int x); private: int *storedvalue; ; 26

IntCell: definir os 3 grandes IntCell::IntCell (int initialvalue) storedvalue = new int(initialvalue); IntCell::IntCell (const IntCell & rhs) storedvalue = new int(*rhs.storedvalue); IntCell::~IntCell() delete storedvalue; const IntCell &Intcell::operator= (const IntCell &rhs) if (this!=&rhs) *storedvalue=*rhs.storedvalue; return *this; int IntCell::read() const return *storedvalue; Void IntCell::write(int x) *storedvalue = x; 27 Conclusões 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 em particular, uma classe apenas com membros estáticos proporciona uma facilidade semelhante ao conceito de "módulo": um conjunto nomeado de objectos e funções no seu próprio espaço de nomes. 28