Conceito de classe em C++



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

Conceito de classe em C++

Composição de classes

Conceito de classe em C++

Linguagem de Programação III

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

Prof. Jhonatan Fernando

Passagem de parâmetros

3 Classes e instanciação de objectos (em Java)

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Passagem de parâmetros

INF 1005 Programação I

Tipos de Dados Simples

Introdução à Programação

Programação por Objectos. Java

Capítulo 2: Introdução à Linguagem C

Componentes da linguagem C++

Introdução a POO. Introdução a Linguagem C++ e POO

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

Esta apresentação ensinará os conceitos de Orientação a Objetos com C++, do mais básico para o mais avançado. É suposto que o aluno já tenha

Orientação a Objetos

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

Overloading de Operadores

Programação e Sistemas de Informação

Módulo 06 Desenho de Classes

Module Introduction. Programação. Cap. 10 Estruturas (Structs)

Técnicas de Programação I

Reuso com Herança a e Composiçã

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

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

Manipulação de Arquivos

Programação Orientada por Objetos

Orientação a Objetos com Java

Aula 1 Tipo Abstrato de Dados

Algoritmia e Programação APROG. Linguagem JAVA. Básico. Nelson Freire (ISEP DEI-APROG 2012/13) 1/31

Algoritmos e Programação

Engenharia de Software

Técnicas de Programação II

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Programação Orientada por Objectos - C++ jvo

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Do C ao C++: O C++ é um C melhor, bem vindo ao C++.

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

Algoritmos e Programação Estruturada

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Algoritmos e Programação II. Sobrecarga

Java 2 Standard Edition Como criar classes e objetos

Registros. Técnicas de Programação. Rafael Silva Guimarães

Conceitos Básicos de C

Pilhas. Profa Morganna Diniz

Programação com Acesso a BD. Programação com OO Acesso em Java

Programação Orientada a Objetos em Java

Implementando uma Classe e Criando Objetos a partir dela

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

Aula 1. // exemplo1.cpp /* Incluímos a biblioteca C++ padrão de entrada e saída */ #include <iostream>

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Computação e Programação Aula prática nº 5. Enunciados dos problemas

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Overloading de Operadores

Olimpíadas de Informática

Curso de Linguagem C

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

Tipo de Dados em Linguagem C

Programação por Objectos. Java

Programando em C++ Histórico da Linguagem C

Linguagem e Técnicas de Programação I Operadores, expressões e funções. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Guia de Fatores de Qualidade de OO e Java

Introdução a Computação

Programação: Tipos, Variáveis e Expressões

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Polimorfismo. Prof. Leonardo Barreto Campos 1

Conceitos de Linguagens de Programação

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Lição 9 Trabalhando com bibliotecas de classes

PADI 2015/16. Aula 1 Introdução à Plataforma.NET

Programação Orientada a Objetos C++

Estrutura de Dados Básica

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

#define SIM 1 equivale a definição de constantes; a palavra SIM é substituída por 1 toda vez que é utilizada no programa.

Noções sobre Objetos e Classes

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Capítulo 3. Programação por objectos em Java

Técnicas de Programação:

Introdução à linguagem de programação C++ Tulio Marcus R. Calixto Centro de Informática de Ribeirão Preto

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Pragmática das Linguagens de Programação 2004/2005

Diagrama de Classes. Um diagrama de classes descreve a visão estática do sistema em termos de classes e relacionamentos entre as classes.

Capítulo 13. Encapsulamento. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Programação científica C++

Transcrição:

Introdução à Programação com Classes em C++ Ana Paula Rocha, Luís Paulo Reis, João Pascoal Faria FEUP - MIEEC Programação 2-2008/2009 Conceito de classe em C++ Classe em sentido lato: tipo de dados definido pelo utilizador (programador) [Stroustrup] inclui enumerações (enum), uniões (union), estruturas (struct) e classes em sentido estrito (class) tipos de dados definidos em bibliotecas standard são classes tipos de dados pré-definidos (built-in) ou construídos com apontadores, arrays ou referências (mesmo que nomeados com typedef) não constituem classes Classe em sentido estrito: tipo de dados definido com class é uma generalização do conceito de estrutura em C Para além de dados (membros-dados), uma classe pode também conter funções de manipulação desses dados (membros-funções), restrições de acesso a ambos (dados e funções) e redefinições de quase todos os operadores de C++ para objectos da classe 2

Conceito de classe em C++ Classe novo tipo de dados que pode ser usado de forma semelhante aos tipos de dados built-in Um tipo de dados é uma representação concreta de um conceito Exemplo: o tipo float (built-in) de C++ com as suas operações +, -, *, etc., proporciona um aproximação concreta ao conceito matemático de número real Os detalhes da representação interna de um float (1 byte para a expoente, 3 bytes para a mantissa, etc.) são escondidos 3 Conceito de classe em C+ Novos tipos de dados projectados para representar conceitos da aplicação que não têm representação directa nos tipos built-in Exemplo: tipo Data Interessa poder usar os operadores -, ==, +=, <<, >>, etc. para subtrair, comparar, incrementar, escrever e ler datas sobrecarga (overloading) de operadores Interessa poder esconder os detalhes da representação interna de uma data (três inteiros para o dia, mês e ano, ou um único inteiro com o número de dias decorridos desde uma data de referência) encapsulamento Outro Exemplo: tipo IntCell objecto que representa um inteiro 4

Classe e objectos Conceito de objecto em sentido lato: região de armazenamento capaz de albergar um valor de um dado tipo inclui variáveis, objectos alocados dinamicamente, objectos temporários que são produzidos durante a avaliação de expressões, etc. Conceito de objecto em sentido estrito: instância de uma classe em vez de variáveis (do tipo T) fala-se em objectos (da classe ou tipo T) Um objecto tem identidade, estado e comportamento A identidade é representada pelo endereço do objecto (ver apontador this) O estado é representado pelos valores dos membros-dados (também chamados atributos noutras linguagens) O comportamento é descrito pelos membros-função (também chamados métodos noutras linguagens), incluindo funções que definem operadores 5 #include <iostream.h> Membros class Data { membros-dados int dia; int mes; int ano; void escreve() { cout << dia << '/' << mes << '/' << ano; membros-função void le() { char barra1, barra2; cin >> dia >> barra1 >> mes >> barra2 >> ano; ; membro do objecto a que se refere a chamada da função main() { Data d = {1, 12, 2000; d.escreve(); d.le(); d.escreve(); return 0; um membro-função é chamada para um objecto da classe, com operadores de acesso a membros 6

As funções definidas dentro da classe (como no slide anterior), são implicitamente inline Membros-função Funções maiores devem ser apenas declaradas dentro da classe, e definidas fora da mesma, precedendo o nome da função do nome da classe seguido do operador de resolução de âmbito :: A função vê os membros da classe da mesma forma, quer seja definida dentro ou fora da classe Permite separar o interface (o que interessa aos clientes da classe, normalmente colocado em "header files") da implementação (normalmente colocada em "sourcecode files") // Interface (data.h) class Data { int dia, mes, ano; void escreve(); void le(); ; // Implementação (data.cpp) void Data::escreve() { cout << dia << '/' << mes << '/' << ano; void Data::le() { char barra1, barra2; cin >> dia >> barra1 >> mes >> barra2 >> ano; 7 Controlo de acesso a membros class Data { função // funções de escrita (set) void setdia(int d) { if (d >= 1 && d <= 31) dia = d; void setmes(int m) { if (m >= 1 && m <= 12) mes = m; void setano(int a) { if (a >= 1 && a <= 9999) ano = a; // funções de leitura (get) int getdia() { return dia; int getmes() { return mes; int getano() { return ano; Os membros seguintes são visíveis por qualquer Facilita manutenção da integridade dos dados! Permite esconder detalhes de implementação que não interessam aos clientes da classe! private: int dia; // 1-31 Os membros seguintes só são visíveis pelos int mes; // 1-12 membros-função e amigos da classe int ano; // 1-9999 ;... Data d; d.dia = 21; /* PROIBIDO! */; d.setdia(21); /* OK */ 8

Diferença entre estruturas e classes Numa estrutura (definida com palavra chave struct) todos os membros são públicos por omissão Numa classe (definida com palavra chave class) todos os membros são privados por omissão De resto são equivalentes 9 Construtores Um membro-função com o mesmo nome da classe é um construtor construtores não podem especificar tipos ou valores de retorno O construtor serve normalmente para inicializar os membrosdados podem-se definir construtores com argumentos para receber valores a usar na inicialização Construtores podem ser overloaded desde que difiram em número ou tipos de argumentos para se poder saber a que versão corresponde cada chamada implícita ou explícita 10

Construtores Se o construtor não é definido, o compilador cria um construtor por omissão (construtor sem argumentos) O construtor é invocado automaticamente sempre que é criado um objecto da classe para objectos globais, o construtor é chamado no início da execução do programa para objectos locais (automáticos ou estáticos), o construtor é chamado quando a execução passa pelo ponto em que são definidos Construtores também podem ser invocados explicitamente 11 #include <stdio.h> Exemplo com construtores //para usar sscanf class Data { Data(int d, int m, int a=2006); // um construtor Data(char *s); // outro construtor //... private: int dia, mes, ano; ; Data::Data(int d, int m, int a) { dia = d; mes =m; ano = a; Data::Data(char *s) { // formato dia/mes/ano sscanf(s, "%d/%d/%d", &dia, &mes, &ano); void f(data d); Data d1 ("27/3/2006"); // OK - chama Data(char *) Data d2 (27, 3, 2006); // OK - chama Data(int, int, int) Data d3 (27, 3); // OK - chama Data(int, int, int) c/ a=2006 Data d4; // Erro: não há construtor sem argumentos Data d5 = {27,3,2006; // Erro: ilegal na presença de construtores d1 = Data(1,1,2006); // OK (chamada explícita de construtor) f(data(27,3,2006)); // OK (chamada explícita de construtor) 12

Conversão de tipos 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 13 #ifndef _IntCell_H_ #define _IntCell_H_ Exemplo : IntCell // a class for simulating an integer memory cell class IntCell { IntCell (int initialvalue = 0); int read() const; void write(int x); private: int storedvalue; ; #endif Interface ficheiro IntCell.h 14

#include IntCell.h Exemplo : IntCell // Construct the IntCell with initialvalue IntCell::IntCell(int initialvalue) : storedvalue(initialvalue) { // Return the stored value int IntCell:: read() const { return storedvalue; // Store x in IntCell void IntCell::write(int x) { storedvalue = x; Implementação ficheiro IntCell.cpp 15 #include IntCell.h Exemplo : IntCell // Write a Value in IntCell and Read it int main() { IntCell m; m.write(5); cout << Cell contents: << m.read() << endl; return 0; Teste 16

Exemplo Classe Rectangulo Declara uma classe CRectangle e um objecto (i.e. uma variável) desta classe chamado rect Classe contém quatro membros: Dois membros dados de tipo int (x e y) com acesso privado (acesso por omissão) Dois membros funções (set_values() e area()) com acesso público Notar diferença entre classe e objecto (semelhante a int i em que int é o tipo - classe e i é a variável - objecto) class CRectangle { int x, y; void set_values (int,int); int area (void); rect; 17 Exemplo Classe Rectangulo No programa podemos utilizar membros públicos rect.set_values (3,4); myarea = rect.area(); x e y só podem ser referidos por outro membros da classe (são privados) Definição completa da classe (notar a utilização de ::) : #include <iostream> using namespace std; class CRectangle { int x, y; void set_values (int,int); int area () {return (x*y); ; void CRectangle::set_values (int a, int b) { if (a>=0) x = a; y = b; 18

Exemplo Classe Rectangulo Exemplo de utilização da Classe com 2 objectos: int main () { CRectangle rect1, rect2; rect1.set_values (3,4); rect2.set_values (5,10); cout << "areas: " << rect1.area() << e, rect2.area(); return 0; Operador de Scope :: utilizado para definir um membro de uma classe, fora da declaração da própria classe Diferença principal em definir funções dentro e fora da classe é que funções definidas dentro são automaticamente consideradas inline 19 Exemplo Classe Rectangulo Exemplo com Construtor removendo set_values() // example: class constructor #include <iostream> using namespace std; class CRectangle { int width, height; CRectangle (int,int); int area () {return (width*height); ; CRectangle::CRectangle (int a, int b) { width = a; height = b; int main () { CRectangle rect1 (3,4), rect2 (5,6); cout << "rect1 area: " << rect1.area() << endl; cout << "rect2 area: " << rect2.area() << endl; return 0; 20

Objectos e membros constantes (const) Aplicação do princípio do privilégio mínimo (Eng. de Software) aos objectos 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 21 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 22

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; private: //... 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; 23 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 24

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 25 Exemplo com membros estáticos class Factura { Factura(float v = 0, string no); long getnumero() const { return numero; float getvalor() const { return valor; static long getultimonumero() { return ultimonumero; private: const long numero; float valor; string nome; static long ultimonumero; // declaração ; long Factura::ultimoNumero = 0; // definição Factura::Factura(float v, string no) : numero(++ultimonumero) { valor = v; nome = no; 26

Exemplo com membros estáticos // Programa de teste main() { Factura f1(100, luis ), f2(200, paulo ), f3( joao ); 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 << "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 ultimo numero=3 27