DEFINIÇÃO DE CLASSES EM C++

Documentos relacionados
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

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Programação Orientada a Objetos CLASSES E OBJETOS

Ponteiros de Variáveis

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

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

Classes e Encapsulamento

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

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

Passagem de parâmetros

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

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

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

Fundamentos de Programação

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

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

Fundamentos de Programação 2

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++

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

C com introdução a OO

Sub-rotinas em C. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Programação Orientada a Objetos

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

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

Linguagens de Programação

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

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

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

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Linguagem de Programação I. Aula 10 Funções

Linguagem de Programação

Estrutura de dados 1. Ponteiros

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

Construtores. Introdução

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

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

Algoritmos e Estruturas de Dados I 01/2013. Passagem de Parâmetros e Estruturas. Pedro O.S. Vaz de Melo

Técnicas de Programação:

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

ESTRUTURA DE DADOS (TCC )

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

Explicação do programa:

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Laboratório de programação II

Linguagem de Programação III

Estrutura de Dados Funções e Procedimentos

Linguagem de Programação C++

Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação. Cap. 9 Subprogramas II: Passagem de Parâmetros Subprogramas II

Sobrecarga de Operadores

Introdução. Ponteiros

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

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Linguagem C Princípios Básicos (parte 1)

Passagem de parâmetros

12. SOBRECARGA DE OPERADOR

Friends e Sobrecarga

Linguagem de Programação II Implementação

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

Programação Orientada a Objetos Introdução a POO

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

Uma função pode ser declarada como friend de mais do que uma classe.

Conceitos Básicos da Programação OO

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

Alocação Dinâmica em C

Programação. Cap. 12 Gestão de Memória Dinâmica

Aula 08: Funções (Parte II)

Programação Avançada C++ Slide 12 Nielsen Castelo Damasceno

Instituto de Informática Estrutura de Dados II

MC-102 Aula 13. Instituto de Computação Unicamp. 29 de Setembro de 2016

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

Linguagem de Programação C++

Programação Orientada a Objetos

Redefinição de Operadores

Programação científica C++

Programação Orientada a Objetos HERANÇA E COMPOSIÇÃO

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

Linguagem de Programação

Programação : Engenharia Informática 6619 : Tecnologias e Sistemas de Informação. Cap. 6 Subprogramas I Subprogramas I

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Linguagem de Programação C. Funções e Procedimentos

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

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

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

Introdução à Programação. Funções e Escopo de Variáveis

Modularidade - Funções e Procedimentos

Sobrecarga. Algoritmos e Programação II. Aula 3 Sobrecarga

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

Modulo 12: alocação dinâmica de memória

LINGUAGEM C: ALOCAÇÃO DINÂMICA

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

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

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

Estrutura de Dados. Aula 07 Alocação Dinâmica

Física Computacional 11 Classes

Transcrição:

DEFINIÇÃO DE CLASSES EM C++ Linguagem Compilada Orientada a Objectos, considerada como o C da próxima geração, criada em meados dos anos 80. Não nos debruçaremos sobre o paradigma da Programação Orientada para Objectos uma vez que já foi objecto de estudo em disciplinas anteriores. Referiremos sòmente alguns aspectos da linguagem de modo a permitir criar e manipular estruturas que serão a base dos tipos abstractos de dados que estudaremos ao longo da disciplina. Classes Class nome da classe private: membros privados protected: membros protegidos public: membros públicos Na declaração da classe são colocados os protótipos dos métodos, só em métodos com código reduzido é feita a definição dentro da estrutura class. Definição de métodos fora da estrutura class: [Tipo_retorno] nome_classe :: nome_método([parametros]) codigo do metodo EXEMPLO: #include <iostream.h> class circulo private: int coordx; int coordy; int raio; char * cor; public: circulo(); //construtor circulo(int x,int y,int r,char *c); //construtor circulo(const circulo c); //construtor cópia que se verá mais adiante ~circulo(); //destrutor que se verá mais adiante void listar(); Departamento de Engª Informática do ISEP 1

circulo::circulo() coordx=0; coordy=0; raio=0; cor=null; circulo::circulo(int x,int y,int r,char *c) coordx=x; coordy=y; raio=r; cor=new char[strlen(c) +1]; strcpy(cor,c); circulo::circulo (const circulo &c) //construtor cópia descrito mais tarde raio=c.raio; coordx=c.coordx; coordy=c.coordy; cor= new char [strlen(c.cor)+1] ; strcpy(cor,c.cor); circulo::~circulo () //destrutor descrito mais tarde delete [] cor; void circulo::listar() cout<<"cordenada x="<<coordx<<'\n'; cout<<"cordenada y="<<coordy<<'\n'; cout<<"raio="<<raio<<'\n'; cout<<"cor="<<cor<<'\n'; void main() circulo c1; circulo c2(10,15,33,"azul"); c1.listar(); c2.listar(); FUNÇÕES e PARÂMETROS Departamento de Engª Informática do ISEP 2

int f1(int x) int f2(int& y) int f3(const int& z) x parâmetro valor y parâmetro referência z parâmetro referência constante EXEMPLO: #include <iostream.h> #include<string.h> class circulo private: int coordx; int coordy; int raio; char *cor; public: circulo(); circulo(int x,int y,int r,char *c);......... void listar(); void testaparam1(int a); void testaparam2(int& a); void testaparam3(const int& a); circulo::circulo() coordx=0; coordy=0; raio=0; cor=null; circulo::circulo(int x,int y,int r,char *c) coordx=x; coordy=y; raio=r; cor=new char[strlen(c) +1]; strcpy(cor,c); void circulo::listar() cout<<"coordenada x="<<coordx<<'\n'; cout<<"coordenada y="<<coordy<<'\n'; cout<<"raio="<<raio<<'\n'; cout<<"cor="<<cor<<'\n'; Departamento de Engª Informática do ISEP 3

void circulo::testaparam1(int a) a=11; raio=a; void circulo::testaparam2(int& a) a=22; raio=a; void circulo::testaparam3(const int& a) //a=33; Erro, constante não admite atribuição raio=a; void main() int i; circulo c(10,15,100,"amarelo"); c.listar(); i=4; c.testaparam1(i); cout<<"i="<<i<<'\n'; c.listar(); c.testaparam2(i); cout<<"i="<<i<<'\n'; c.listar(); c.testaparam3(i); cout<<"i="<<i<<'\n'; c.listar(); RESULTADOS coordenada x=10 coordenada y=15 raio=100 cor=amarelo i=4 // i não foi alterado passagem por valor cordenada x=10 coordenada y=15 raio=11 cor=amarelo i=22 // i foi alterado passagem por referência Departamento de Engª Informática do ISEP 4

coordenada x=10 coordenada y=15 raio=22 cor=amarelo i=22 // i não admitiu alteração dentro do método coordenada x=10 coordenada y=15 raio=22 cor=amarelo PARÂMETROS VALOR Sempre que há uma passagem de parâmetros por valor é executado o construtor cópia do tipo de dados do parâmetro formal. Quando uma função termina destrutores dos tipos de dados dos parâmetros formais "destroem" os valores desses parâmetros. PARÂMETROS REFERÊNCIA Os parâmetros actuais são ligados aos parâmetros formais, não existe cópia dos parâmetros, como no caso anterior. O nome dos parâmetros formais substitui o nome dos parâmetros actuais. Poupa-se tempo. Qualquer alteração do parâmetro formal, altera o parâmetro actual. PARÂMETROS REFERÊNCIA CONSTANTE Neste caso o parâmetro formal substitui o actual,mas como é constante, não admite alteração de valor. Nota: Se não pretendemos alterar o valor do parâmetro actual usamos uma passagem por valor no caso de tipos de dados primitivos, no caso de outros tipos de dados dever-se-á usar referência constante. VALORES DE RETORNO Os valores de retorno podem ser do tipo valor, referência e referência constante No caso dos valores de retorno, se for devolvido um valor (objecto), aquilo que é devolvido é copiado no ambiente de retorno, recorrendo-se ao construtor cópia. Exemplo1: int circulo::retornaraio() return raio; Por questões de eficiência, no caso da devolução de tipos não primitivos, não Departamento de Engª Informática do ISEP 5

devemos usar o retorno por valor mas o retorno de referência, evitando-se a invocação do construtor cópia Exemplo2: int& circulo::retornaraio() return raio; NOTA1:Só podemos devolver referências de objectos globais à função. NOTA2:Há um alias entre a função e o objecto que ela devolve, no exemplo anterior podemos alterar o valor do raio invocando retornaraio()++. Se o valor a devolver for uma referência constante já não admite a invocação anterior. EXEMPLO3 const int& circulo::retornaraio() return raio; EXEMPLO4 class pequena private: int x; public: pequena(); pequena(int a); void listar(); int & obterx(); int& obtermembro(); pequena::pequena() x=5; pequena::pequena(int a) x=a; void pequena::listar() Departamento de Engª Informática do ISEP 6

cout<<"x="<<x<<'\n'; int& pequena::obter2x() x=2*x; return x; int& pequena::obtermembro() return x; void main() int i; pequena p(45); p.listar(); const int& y=p.obter2x(); cout<<"y="<<y<<'\n'; //y++;erro como a referência y é constante não admite atribuição cout<<p.obtermembro()<<'\n'; i=p.obter2x(); cout<<"y="<<y<<'\n'; // Se obter2x()devolvesse uma referencia constante isto não era possivel p.obter2x()++ p.listar(); RESULTADOS: x=45 Y=90 90 Y=180 x=361 FUNÇÔES CONSTANTES Métodos constantes não permitem que sejam alterados os objectos que os invocam. Void circulo::alteraraio() const raio=88; // ERRO,estamos a alterar um membro de dados do objecto circulo que invocou o método CONSTRUTORES Departamento de Engª Informática do ISEP 7

1. Sem Parâmetros circulo(); 2. Com Parâmetros e Parâmetros por defeito circulo(int x,int y,int r,char *c) circulo(int x=0,int y=0,int r=5,char * c="azul") Os valores por defeito (0,0,5,azul) só são indicados na declaração do método. 3. Cópia circulo(const circulo& c) Tem a mesma designação da classe Não devolvem quaisquer valores NOTA: Temos que implementar o construtor cópia sempre que na classe existem membros de dados não primitivos ou que exigem alocação dinâmica de memória. CONSTRUTOR CÓPIA Este construtor caracteriza-se por ter um só parâmetro, parâmetro esse que é do mesma classe a que pertence o construtor ou em que o 1º parâmetro (no caso de ter mais do que um parâmetro) é do mesmo tipo que a classe. Quando se passa um objecto por valor a uma função o compilador invoca de forma automática o construtor cópia. Assim, na construção de construtores cópia não podemos passar o objecto, senão cairíamos numa recursividade infinita, logo há que passar uma referência para o objecto. Se tal não fizermos o compilador de C++ assinala erro. Atendendo a que não se pretende alterar o objecto que é passado por referência essa referência deverá ser constante Quando uma função devolve um objecto também é invocado o construtor cópia. Se passarmos e devolvermos referências para objectos em vez dos próprios objectos eliminamos o overhead de invocação do construtor cópia. Se o construtor cópia não estiver definido, sempre que numa função há a passagem ou retorno de um objecto, o compilador gera um construtor cópia automàticamente, criando um novo objecto através de uma operação de cópia membro a membro do objecto que é passado. Isto tem problemas sempre que o objecto tem um atributo que exige alocação de memória porque são igualados apontadores, passando a ter a mesma área de memória referenciada por dois apontadores pertencentes a objectos distintos. Exemplo: Voltemos à classe circulo //construtor cópia circulo::circulo (const circulo &c) raio=c.raio; coordx=c.coordx; coordy=c.coordy; cor= new char [strlen(c.cor)+1] ; strcpy(cor,c.cor); Departamento de Engª Informática do ISEP 8

Este tipo de construtor não seria gerado automàticamente, há necessidade do programador o construir, porque na geração automática seriam igualados os apontadores cor e c.cor. Dispondo de construtor cópia, podemos criar um objecto à custa de outro já criado, do seguinte modo: circulo circ1(8,5,30, rosa ); circulo circ2(circ1); Assim circ2 é um círculo inicializado com os mesmos dados de circ1, para tal recorreu ao construtor cópia. Um objecto pode ainda ser criado dinamicamente através do operador new que além de alocar espaço na memória invoca o respectivo construtor. Assim, poderíamos ter o seguinte código: circulo * apcirc1; apcirc1=new circulo(10,11,12,"verde"); //cria o objecto e invoca o construtor com parâmetros apcirc1->listar(); OU circulo *apcic1= new circulo(10,11,12,"verde"); Para libertar o espaço ocupado pele objecto far-se-ia delete apcirc1, que automaticamente invocaria o destrutor de circulo DESTRUTORES 1. Tem a mesma designação da classe precedidos de ~ ~circulo(); 2. Não tem parâmetros 3. Não devolvem quaisquer valores 4. Não são invocados explicitamente. 5. São invocados automaticamente sempre que termina o âmbito de um objecto da classe ou que é feito delete de um ponteiro para um objecto da classe. 6. É necessário implementar os destrutores sempre que os membros de dados fazem alocação dinâmica de memória, para libertarem o espaço alocado por esses membros. No exemplo do círculo o destrutor teria o seguinte código: circulo::~circulo() delete [ ] cor; Departamento de Engª Informática do ISEP 9

Neste programa considerou-se ainda implementado no destrutor a libertação do ponteiro cor. Quando o âmbito de um objecto finaliza é invocado o destrutor e assim é libertado o espaço de memória, que tinha sido alocado para a cor através de new no respectivo construtor. SOBRECARGA DE OPERADORES 1. Permite reescrever codigo para operadores de modo a manipularem operandos de classe diferente da que estão predefinidos. 2. Não é possível alterar a precedência nem o número de operandos. EXEMPLO: Sobrecarregar o operador + para a classe circulo, supondo que o circulo resultado, mantem a origem do primeiro operando e o raio é a soma dos raios. Circulo circulo::operator +( const circulo& c) circulo temp; temp.coordx=this->coordx; temp.coordy=this->coordy; temp.raio=this->raio + c.raio; return temp; Nas aulas práticas serão implementadas outras classes e feitos outros operadores, como o de atribuição, os de comparação,... Há operadores que não admitem sobrecarga, tal é ocaso de :. ::?: # Quando um operador é definido como método de uma classe, tem menos um parâmetro do que se fosse definido como uma função normal fora da classe. Isto porque o primeiro parâmetro de um operador definido como função membro de uma classe é o objecto que invoca o método,que é passado como parâmetro implícito. No exemplo anterior, soma de dois círculos, só consideramos um parâmetro correspondente ao 2º operando do operdor +, o primeiro operando será o objecto referenciado por this. Departamento de Engª Informática do ISEP 10