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

Documentos relacionados
Passagem de parâmetros

Passagem de parâmetros

Conceito de classe em C++

Composição de classes

Conceito de classe em C++

Conceito de classe em C++

Programação Orientada a Objetos CLASSES E OBJETOS

Introdução à linguagem C++

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

Fundamentos de Programação

Programação Orientada a Objetos

Física Computacional 7 Classes

Fundamentos de Programação

Fundamentos de Programação 2

Redefinição de Operadores

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

Overloading de Operadores

Estrutura de dados 1. Ponteiros

Linguagem de Programação III

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

Overloading de Operadores

Algoritmos e Estruturas de Dados 2009/2010

Física Computacional 11 Classes

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

Técnicas de Programação:

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

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

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

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 6: Polimorfismo

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

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

//conteúdo do arquivo pacote.h

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

Estrutura de Dados Funções e Procedimentos

# 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

Carlos Eduardo Batista. Centro de Informática - UFPB

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

Programação científica C++

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

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

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

CPP. C plus plus versus Java

Linguagem de Programação C++

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

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

Programação Orientada a Objetos

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

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

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

Elementos Básicos. C# - Elementos básicos. Primeiro programa Tipos de dados Variáveis Constantes Expressões e operadores Controlo de fluxo Tabelas

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

Construção de Classes

Laboratório de programação II

Programação Orientada a Objetos para Redes de Computadores

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

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

Algoritmos e Estruturas de Dados

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

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

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

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

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

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

ECT1203 Linguagem de Programação

Programação em C++: Introdução

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

Algoritmos II prof. Daniel Oliveira

Carlos Eduardo Batista. Centro de Informática - UFPB

Classes e Encapsulamento

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Puca Huachi Vaz Penna / José Américo T. Messias

Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação. Cap. 8 Endereçamento de Memória Endereçamento de Memória

Física Computacional

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

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

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

Linguagem de Programação III

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

Linguagem de Programação I

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

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos para Redes de Computadores

CMP Técnicas de Programação 2 a Lista de Exercícios - Passagem de parâmetros por referência e ponteiros Max Gontijo de Oliveira

Programação científica C++

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

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

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

Introdução à linguagem C++

Sintaxe da linguagem Java

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Aula 26: Estruturas heterogêneas

Programação por Objectos. Java

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

DEFINIÇÃO DE CLASSES EM C++

Física Computacional 15 Templates

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

C++ Orientado a Objetos

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Transcrição:

Programação Orientada por Objectos em C++ (alguns conceitos) Algoritmos e Estruturas de Dados 2009/2010 Mestrado Integrado em Engenharia Informática e Computação 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) AED - 2009/10 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 AED - 2009/10 3 Retorno por referência constante Exemplo: procurar a maior string num array OK const string &findmax(string *a, int n) int maxindex = 0; for (int i=1; i<n; i++) if (a[maxindex] < a[i]) maxindex = i; return a[maxindex]; const string &findmaxwrong(string *a, int n) string maxvalue = a[0]; for (int i=1; i<n; i++) if (maxvalue < a[i]) maxvalue = a[i]; return maxvalue; errado AED - 2009/10 4

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 AED - 2009/10 5 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 int *storedvalue; ; AED - 2009/10 6

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? AED - 2009/10 7 IntCell: definir os 3 grandes Problema 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 // 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); int *storedvalue; ; AED - 2009/10 8

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; AED - 2009/10 9 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 AED - 2009/10 10

Qualificador explicit class IntCell explicit IntCell (int initialvalue=0); int storedvalue; Sem explicit 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 AED - 2009/10 11 Objectos e membros constantes (const) Objecto constante: declarado com prefixo const especifica que o objecto não pode ser modificado como não pode ser modificado, tem de ser inicializado exemplo: const Data nascbeethoven (16, 12, 1770); não se pode chamar membro-função não constante sobre objecto constante AED - 2009/10 12

Objectos e membros constantes (const) Membro-dado constante: declarado com prefixo const especifica que não pode ser modificado (tem de ser inicializado) no construtor usar a seguinte notação, após a lista de argumentos mas antes do corpo: :dado_constante(valor_inicializar) Membro-função constante: declarado com sufixo const (a seguir ao fecho de parêntesis) especifica que a função não modifica o objecto a que se refere a chamada AED - 2009/10 13 Inicializadores de membros Quando um membro-dado é constante, um inicializador de membro (também utilizável com dados não constantes) tem de ser fornecido para dar ao construtor os valores iniciais do objecto class Pessoa Pessoa(int, int); long getidade() const; //... int idade; const long BI; ; // construtor // função constante // dado constante Pessoa::Pessoa(int i, long bi) : BI(bi) // inicializador de membro ^^^^^^^^,... idade = i; long Pessoa::getIdade() const return idade; AED - 2009/10 14

Membros estáticos (static) Membro-dado estático (declarado com prefixo static): variável que faz parte da classe, mas não faz parte dos objectos da classe tem uma única cópia (alocada estaticamente) (mesmo que não exista qualquer objecto da classe), em vez de uma cópia por cada objecto da classe permite guardar um dado pertencente a toda a classe parecido com variável global, mas possui âmbito (scope) de classe tem de ser declarado dentro da classe (com static) e definido fora da classe (sem static), podendo ser inicializado onde é definido AED - 2009/10 15 Membros estáticos (static) Membro-função estático (declarado com prefixo static): função que faz parte da classe, mas não se refere a um objecto da classe (identificado por apontador this nas funções não estáticas) só pode aceder a membros estáticos da classe Referência a membro estático (dado ou função): sem qualquer prefixo, a partir de um membro-função da classe, ou com operadores de acesso a membros a partir de um objecto da classe, ou com nome-da-classe::nome-do-membro-estático AED - 2009/10 16

Exemplo (membros estáticos) class Factura Factura(float v = 0); long getnumero() const return numero; float getvalor() const return valor; static long getultimonumero() return ultimonumero; const long numero; float valor; static long ultimonumero; // declaração ; long Factura::ultimoNumero = 0; // definição Factura::Factura(float v) : numero(++ultimonumero) valor = v; AED - 2009/10 17 Exemplo (membros estáticos) // Programa de teste 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 AED - 2009/10 18

Exemplo (membros estáticos) // 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 AED - 2009/10 19 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 //... char *nome; Data nascimento; // membro-objecto ; Pessoa::Pessoa(char *n, int d, int m, int a) : nascimento(d,m,a) /*... */ AED - 2009/10 20

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 AED - 2009/10 21 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; função que multiplica uma for (int i = 0; i<4; i++) matriz por um vector r.v[i] = 0; for (int j = 0; j<4; j++) r.v[i] += m.v[i].v[j] * v.v[j]; return r; AED - 2009/10 22

Funções Friend #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); AED - 2009/10 23 Funções Friend //Programa de Teste int main () CRectangle rect, rectb; rect.set_values (2,3); rectb = duplicate (rect); cout << rectb.area(); return 0; AED - 2009/10 24

Classes Friend #include <iostream> using namespace std; class CSquare; class CRectangle int width, height; int area () return (width * height); void convert (CSquare a); ; class CSquare int side; void set_side (int a) side=a; friend class CRectangle; //classe CRectangle é friend de CSquare ; void CRectangle::convert (CSquare a) width = a.side; height = a.side; AED - 2009/10 25 Classes Friend //Programa de Teste int main () CSquare sqr; CRectangle rect; sqr.set_side(4); rect.convert(sqr); cout << rect.area(); return 0; AED - 2009/10 26