Minicurso C++ orientado a objetos



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

Orientação a Objetos

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

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

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Programação Orientada a Objetos C++

Componentes da linguagem C++

Introdução a Java. Hélder Nunes

Introdução à Programação

Prof. Jhonatan Fernando

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

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Programação de Computadores - I. Profª Beatriz Profº Israel

Modelagemde Software Orientadaa Objetos com UML

Programação Orientada a Objetos em Java

Java 2 Standard Edition Como criar classes e objetos

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

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

NOVIDADES DO JAVA PARA PROGRAMADORES C

Implementando uma Classe e Criando Objetos a partir dela

Profº. Enrique Pimentel Leite de Oliveira

Polimorfismo. Prof. Leonardo Barreto Campos 1

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

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

PCS LABORATÓRIO DE PROGRAMAÇÃO ORIENTADA A OBJETOS PARA A ENGENHARIA ELÉTRICA

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Linguagem de Programação III

Orientação a Objetos com Java

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

INF 1005 Programação I

Guia de Fatores de Qualidade de OO e Java

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++

Java. Marcio de Carvalho Victorino

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

JSP - ORIENTADO A OBJETOS

Herança. Alberto Costa Neto DComp - UFS

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

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

1.6. Tratamento de Exceções

PHP INTRODUÇÃO CLASSES E OBJETOS

2 Orientação a objetos na prática

Computação II Orientação a Objetos

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

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

Programação Orientada a Objeto

Unidade IV: Ponteiros, Referências e Arrays

Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos

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

Programação Orientada a Objetos em java. Polimorfismo

DEFINIÇÃO DE MÉTODOS

Técnicas de Programação II

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

Análise e Projeto Orientados por Objetos

Aula 1 Tipo Abstrato de Dados

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

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

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

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

ESTRUTURA CONDICIONAL

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

Orientação a Objetos

Projeto de Software Orientado a Objeto

Prof. Esp. Adriano Carvalho

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

Programação aplicada de computadores Andréa Maria Pedrosa Valli

FBV - Linguagem de Programação II. Um pouco sobre Java

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Linguagem de Programação III

2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Reuso com Herança a e Composiçã

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

Lista de Exercícios da 3ª Unidade. ( Ponteiros, Alocação dinâmica, Arquivos, Estruturas de Dados)

Tópicos em Engenharia de Computação

Programação por Objectos. Java

Implementação de Classe e Auto-Relacionamento em Java

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira

Lógica de Programação

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

INFORMÁTICA APLICADA AULA 02 LINGUAGEM DE PROGRAMAÇÃO C++

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

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

CURSO DE PROGRAMAÇÃO EM JAVA

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

PROGRAMANDO EM C# ORIENTADO A OBJETOS

9 Comandos condicionais

Algoritmos e Programação Estruturada

17 - Funções e Procedimentos em C Programação Modular

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Programação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes

Programação por Objectos. Java

Programação Orientada a Objetos em Java. Herança

Programação Orientada a Objetos. Encapsulamento

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Transcrição:

Minicurso C++ orientado a objetos CompPET 2015

Sobre C++ - Desenvolvida por Bjarne Stroustrup em 1979; - Derivada da linguagem C; - Elementos principais adicionados a linguagem C para gerar C++ é a representação a objetos. - Linguagem compilada; - Tipagem estática;

Orientação a Objetos É um dos paradigmas de programação mais utilizados atualmente. Sendo que, paradigmas diferem nos conceitos e abstrações utilizadas para representar os elementos de um programa e as etapas que compõem um cálculo. Facilita a manutenção do sistema. Facilita o reuso de código. Facilita a comunicação entre os envolvidos na produção do sistema por permitir a modelagem dos dados. Aproxima o real do implementado.

Tipos de dados Todas as variáveis em C++ devem ser declaradas antes de serem utilizadas. Em C++ existem os seguintes tipos básicos de dados: int float double char string Os modificadores short, long, unsigned são aceitos.

Operadores = +, -, *, /, % ++, - +=, -=, *=. /=, %= <, <=, >, >=, ==,!= &&,,!

A diretiva using Um namespace é uma coleção de definições de nome. É semelhante a um sobrenome. A maioria das bibliotecas padrão colocaram suas definições no namespace std. Portanto, para utilizar, por exemplo os comandos cout e cin teríamos que utilizar: std::cout<<"escrevendo na tela"; Por questão de praticidade utilizamos a diretiva using que permite que os nomes dentro de um namespace possam ser utilizados sem explicitar o qualificador. Utilizando using namespace std.

Entrada e saída padrão Em C++ a entrada e saída de informações se dão a partir de funções da biblioteca iostream. Para a entrada de dados (leitura de valores) utiliza-se o comando cin: Sintaxe: cin>>variavel; Pode-se utilizar o cin com múltiplas entradas: cin>>var1>>var2>>varn; O operador >> interpreta o " " como finalizador da entrada;

Entrada e saída padrão Para a impressão de dados utiliza-se o comando cout com o operador de inserção << : Sintaxe: cout<<"texto a ser escrito na tela"; Para saltar uma linha após a escrita utiliza-se o comando endl. Teríamos, portanto: cout<<"texto a ser escrito na tela"<<endl; Para imprimir uma variável e um texto coloca-se o operador de extração << entre eles: cout<<"texto "<<variavel<<endl;

Exemplo #include <iostream> using namespace std; int main() int n; cout<<"escrevendo na tela utilizando C++"; cout<<"digite um número"; cin>>n; cout<<"o número digitado é: "<<n<<endl; return 0; }

Tipo string Em C++ existe a classe string. Diversas funções para manipulação de strings estão na biblioteca iostream, entretanto também existem funções na biblioteca string (#include <string>) Variáveis do tipo string podem ser tratadas de maneira semelhante a tipos primitivos, portanto alguns operadores como + e == são válidos. Declaração: string str;

strings Como o cin identifica o como terminador, algumas vezes ele não é recomendado para leitura de strings. Usa-se portanto, a função getline. O getline precisa de dois parâmetros, o primeiro é o buffer de entrada e o segundo a variável onde será armazenada a string. getline(cin, str);

strings Algumas funções importantes para manipulação de strings são citadas abaixo: Considere duas strings str1 e str2: str1.size() - retorna o tamanho da string str1. str1.empty() - verifica se str1 é uma string vazia. str1.copy(str2) - copia o conteúdo da string str1 para a string str2.

strings str1.substr(pos, tam) - retorna a substring que começa na posição pos, de tamanho tam, da string str1. str1.replace(pos, tam, str2) substitui a substring que começa na posição pos, de tamanho tam, da string str1 pela string str2. str1.find(str2) - retorna a posição da primeira ocorrência da str2 na string str1, ou -1 se não encontrar.

Praticando com strings Exercício 1: Escreva um código que receba como entrada a sequência de DNA de N pessoas, um fragmento de DNA de outra pessoa e imprima quais dessas pessoas possuem o fragmento de DNA. Exercício 2: Incremente o código anterior para receber mais um fragmento de DNA. As pessoas que possuírem o primeiro fragmento (as que foram impressas no exercício 1) devem tê-lo substituído pelo segundo.

Praticando com strings Entrada Saída CGATGACGTC ATCGACTGCG TAGCATCGAC GATCAGATGC CATCTGACTG As pessoas 2, 5 possuem o fragmento CTG em seu DNA. CTG GACTACTGA CTAGTACTA TCGATGACT AGCTACGAT TCA Nenhuma das pessoas possuem o fragmento TCA em seu DNA.

Escopo de variáveis Escopo de uma variável nada mais é do que o alcance que essa variável tem. Uma variável pode ter escopo global, podendo ser acessada em qualquer parte do código, ou local, podendo ser acessada apenas em uma parte do código. Um escopo local é delimitado entre a abertura de chaves () e o seu fechamento (}) e pode ser definido em qualquer lugar do código.

Comandos de decisão If: int idade; cin>>idade; if(idade<12) cout<<"criança"<<endl; else if(idade<25) cout<<"jovem"<<endl; else if(idade<60) cout<<"adulto"<<endl; else cout<<"idoso"<<endl;

Laços de repetição For: int i; for(i = 0; i<10; i++) cout<<i<<" "; While: while(i<10) cout<<i<<" "; i++; }

Array Podemos declarar um array em C++ da mesma forma que declaramos na linguagem C. int elem[10]; No entanto, em C++ temos a biblioteca de vectores (#include <vector>), que nos permite utilizar arrays dinâmicos. vector<int> elem; Para adicionar uma nova posição ao vector, utilizamos a função push_back. elem.push_back(3); Para remover a última posição do vector, utilizamos a função pop_back. elem.pop_back();

Array O acesso aos elementos do vector é feito da mesma forma que na linguagem C. elem[0] = 3; Há várias funções úteis para manipulação de arrays na biblioteca de vector. elem.size() - retorna o tamanho do vetor elem. elem.clear() - remove todos os elementos do vetor elem. elem.empty() - verifica se o vetor elem está vazio.

Praticando Vector Exercício 3: Altere o código escrito no exercício 2 de forma a utilizar um vector para armazenar as informações das pessoas.

Aula 2 CompPET 2015

Struct A estrutura é um dos tipos de dados que podem ser definidas pelo programador. Ela é uma coleção de variáveis de tipos diferentes que são tratadas como um único item. As variáveis em estruturas podem ser acessadas com o operador. Declaração da estrutura - ex: struct exemplo int a; void atribuivalor(int b) a = b; } };

Struct Declaração e chamada da estrutura: int main() struct exemplo e1; e1.atribuivalor(2); printf("%d", e1.a); return 0; }

Praticando estruturas Exercício 4: Implemente as seguintes estruturas: pessoa que tem as seguintes variáveis: nome, cpf, endereço. aluno tem como variáveis uma estrutura pessoa e mais um número de matrícula e um vetor de disciplinas. crie funções para atribuir valores às variáveis e exibílos.

Programação Orientada a Objetos Um paradigma de programação pode ser definido como sendo uma abordagem de modelagem de um problema. A complexidade da implementação da resolução é altamente impactada pela escolha do paradigma.

Programação Orientada a Objetos Existem diversos paradigmas de programação: Procedimental Orientado a objetos Funcional Lógico Orientado a aspectos Algumas linguagens são multiparadigma, o que confere flexibilidade ao programador.

Programação Orientada a Objetos A linguagem C++ oferece suporte a dois paradigmas muito usados: - Paradigma procedural: - Estabelece um processo - Facilita a modularização - Se baseia na chamada de funções (procedure call) - Paradigma orientado a objetos: - Evoução da PP - Mais próxima do mundo real - Maior aproveitamento do código

Programação Orientada a Objetos O paradigma de programação OO se baseia na decomposição e interação de unidades de software. Essas unidades de software são denominadas objetos. A abstração, ou seja, o molde dessas unidades de software é chamado de classe.

UML Existem diversos modelos para representação de diagramas de maneira visual. Um deles é a UML (Unified Modeling Language). Em uma representação simplificada da UML, a classe é representada da seguinte maneira:

UML

Classes Classe é a definição dos elementos que formam o sistema, indicando suas características e funcionalidades. Uma classe é formada por atributos e métodos: Atributos: Indicam as caracteristicas do elemento. - Modificadores (public, private, protected) Métodos: Indicam as funcionalidades do elemento.

Classes A classe Pessoa mostrada no exemplo pode ser representada com UML da seguinte maneira:

Classes Em C++ uma classe pode ser definida de maneira semelhante a struct. Observe: class Pessoa Atributos int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } }; Métodos

Atributos Atributos são as variáveis de uma classe A declaração de atributos é feita de maneira similar a declaração de variáveis comum.

Atributos class Pessoa int idade; string nome; Atributos void atribuivalores(int i, string s) idade = i; nome = s; } };

Atributos Exercício: implemente uma classe carro com os seguintes atributos: - placa ano marca preço

Métodos Métodos são todas as funções definidas no escopo de uma classe. O método deve implementar uma operação ligada a sua classe. Ex: alteração de dados, operações envolvendo os atributos da classe, etc.

Métodos class Pessoa int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } }; Método

Exercício Crie o código de uma classe Carro. Ela deve representar a classe do diagrama a seguir:

Objetos Objeto: Exemplar (instância) de um elemento previamente definido por uma classe. Cada objeto armazena as informações específicas de um exemplar instanciado da classe.

Objetos Criação de um objeto no código: int main() Pessoa katty; katty.atribuivalores(30, Katheryn Elizabeth Hudson ); }

Objetos Exercício: implemente uma função main e nela crie um objeto carro com os seguintes valores: - placa: WOW-6031 ano: 2004 marca: Blizz Box preco: 29,90 Após criar e inicializar o objeto, imprima os valores na tela.

Aula 3 CompPET 2015

Objetos Alguns atributos pertencem a todos os objetos de uma classe. Eles são chamados atributos estáticos: Class Biblioteca static int numerodelivros; };

Objetos Em uma classe é possível deixar claro que o atributo a que se está referindo é aquele do objeto e não o passado como parâmetro. Para isso usamos o this: Class Biblioteca string codigobiblioteca; void setcodigobiblioteca(string codigobiblioteca) this->codigobiblioteca = codigobiblioteca; } };

Métodos Existem duas maneiras de implementar um método: Dentro da classe (chamado método inline); Fora da classe; Lembrando que pelo menos as declarações dos métodos devem estar dentro da classe.

Métodos class Carro void iniciadados(string p, int a, string m, float pr); }; Declaração do método void Carro::iniciaDados(string p, int a, string m, float pr) placa = p; ano = a; Implementação marca = m; do método preco = pr; }

Métodos class Carro void iniciadados(string p, int a, string m, float pr) placa = p; Declaração e ano = a; implementação marca = m; do método preco = pr; } };

Sobrecarga de métodos A linguagem C++ permite a sobrecarga de métodos. Fornecer duas ou mais definições diferentes para o mesmo nome de função. Quando se sobrecarrega um nome de função, as definições da função devem ter números diferentes de parâmetros ou alguns parâmetros de tipos diferentes. A linguagem resolve a sobrecarga de métodos de duas maneiras diferentes: Identidade perfeita; Identidade com conversão automática de tipo.

Sobrecarga de métodos class Sobrecarga public: double f(int n, double m) return n + m; } double f(double n, int m) return n * m; } }; int main() Sobrecarga c; std::cout << c.f(2,3); }

Exercício Crie uma classe funcionário que possua necessariamente os atributos remuneração diária e dias trabalhados. Crie nessa classe um método que calcule o salário do funcionário de acordo com os dias trabalhados. crie uma sobrecarga desse método de modo que possa somar uma bonificação ao salário calculado.

Construtores O construtor é um método que tem o mesmo nome da classe, é executado automaticamente toda vez que um objeto é criado e não pode ter retorno. O construtor de uma classe é um método utilizado para inicializar os atributos do objeto instanciado. Um método construtor pode ou não possuir argumentos.

Construtores Assim como os métodos, existem duas maneiras de implementar construtores: Construtores inline: Construtores implementados dentro da classe; Construtores: Construtores implementados fora da classe. Existe ainda a possibilidade de inicializar os atributos da classe na definição do construtor: class Carro Carro(): ano(2015) } };

Construtores class Pessoa int idade; string nome; void atribuivalores(int i, string s) idade = i; nome = s; } Pessoa(int i, string s) atribuivalores(i,s); } }; Construtor inline

Construtores class Pessoa int idade; string nome; Pessoa(int i, string s); void atribuivalores(int i, string s); }; Pessoa :: Pessoa(int i, string s) atribuivalores(i,s); } Construtor fora da classe

Construtores class Pessoa int idade; string nome; Pessoa(int i, string s); void atribuivalores(int i, string s); }; Pessoa :: Pessoa(): idade(30),nome( Katheryn Elizabeth Hudson ) } Construtor Inicializador

Construtores class Pessoa int idade; string nome; Pessoa(): idade(30), nome( Katheryn Elizabeth Hudson ) } void atribuivalores(int i, string s) idade = i; Construtor inicializador nome = s; inline } };

Construtores Utilizando construtores no código: int main() Pessoa pablo(24, Pablo Henrique ); }

Destrutores Destrutores são métodos utilizados para destruir (liberar memória) objetos instanciados. Destrutores são executados automaticamente ao final do bloco de execução em que o objeto se encontra, porém caso seja preciso pode-se destruir um objeto manualmente utilizando o operador delete.

Destrutores class Pessoa int idade; string nome; Pessoa(): idade(30), nome( Katheryn Elizabeth Hudson ) } void atribuivalores(int i, string s) idade = i; nome = s; } ~Pessoa() Destrutor } };

Destrutores Utilizando delete no código: int main() Pessoa katty; katty.atribuivalores(30, Katheryn Elizabeth Hudson ); delete katty; } Chama o destrutor

Sobrecarga de Construtores É possivel sobrecarregar métodos construtores, desde que cada um tenha argumentos diferentes. class Pessoa int idade; string nome; Pessoa(): idade(30),nome( Katheryn Elizabeth Hudson ) Pessoa(int i, string s); void atribuivalores(int i, string s); }; Sobrecarga Pessoa :: Pessoa(int i, string s) atribuivalores(i,s); }

Exercício Adicione um atributo departamento à classe funcionário. Crie um construtor que preencha os atributos de um objeto da classe funcionário. Crie uma sobrecarga do construtor para criar objetos de funcionários que ainda não foram alocados a nenhum departamento.

Aula 4 CompPET 2015

Encapsulamento Um dos fundamentos da orientação a objetos é restringir o acesso de uma classe a códigos que não tenham a ver com sua lógica. Esconder detalhes da implementação evita que o código de classes usuárias se torne dependente das classes usadas.

Modificadores de acesso Podemos evitar que uma classe faça alteração direta aos atributos de outras. Para isso, utilizamos os modificadores de acesso. São eles: public: qualquer código externo à própria classe possui acesso aos membros da classe com este modificador. private: nenhum código externo à própria classe possui acesso aos membros da classe com este modificador. protected: apenas as classes que herdam a própria classe possuem acesso aos membros da classe com este modificador.

Getters e Setters Para permitir o acesso aos atributos privados e/ou protegidos de uma classe, cria-se os métodos getters e setters. Getters são métodos que apenas retornam o valor de um atributo. Setters são métodos para atribuir um valor a um atributo.

Getters e Setters class Pessoa private: int idade; string nome; public: int getidade() return idade; } Método de acesso público

Getters e Setters string getnome() return nome; } void setidade(int idade) this->idade = idade; } void setnome(string nome) this->nome = nome; } }

Herança É o processo que permite criar uma classe que herde todas as características de outra já existente. É uma relação do tipo é-um. Uma classe que herda outra é chamada de classe derivada (classe filha) e a classe existente de classe base (classe pai). A definição de uma função-membro herdada pode ser alterada na definição da classe derivada.

Tipos de herança Classes filhas não possuem acesso à membros privados. Os modificadores mencionados se aplicam apenas aos membros públicos e protegidos. Herança pública: Membros da classe filha terão seus modificadores iguais aos da classe pai, exceto os membros privados. class Filha : public Pai

Tipos de herança Herança privada: Membros públicos e protegidos da classe pai serão membros privados na classe filha. class Filha : private Pai Herança protegida: Membros públicos e protegidos da classe pai serão membros protegidos na classe filha. class Filha : protected Pai

Exemplo Herança class Veiculo protected: int qtdpassageiros; string modelo; public: void setvalores(int qtdp, string model) qtdpassageiros = qtdp; modelo = model; } };

Exemplo Herança class Aviao : public Veiculo int nroasas = 2; int qtdturbinas; public: Aviao(int qtdt, int qtdp, string model) qtdturbinas = qtdt; qtdpassageiros = qtdp; modelo = model; } };

Exemplo Herança class Caminhao : protected Veiculo string carga; double massacarga, precocarga,precototal; public: setpreco() precototal = precocarga*massacarga; } };

Herança Quando manipula-se herança, ao implementarmos um construtor na classe derivada, devemos utilizar um construtor da classe-base, caso nenhum construtor seja especificado o construtor padrão será utilizado. class Veiculo Veiculo() } Veiculo(int qtdpassageiros) this->qtdpassageiros = qtdpassageiros; } };

Exemplo Herança class Caminhao : protected Veiculo Caminhao(double mc, double pc) massacarga = mc; precocarga = pc; } };

Exemplo Herança class Caminhao : protected Veiculo Caminhao(double mc, double pc, int qtdpassageiros): Veiculo(qtdPassageiros) Chamada do massacarga = mc; construtor da precocarga = pc; classe-base } };

Exercício Exercício 5 - Implemente as seguintes classes: pessoa que tem os seguintes atributos privados: nome, cpf, endereço. aluno que tem os atributos de pessoa e possui um número de matrícula e um conjunto de disciplinas, todos privados. crie métodos para atribuir valores aos atributos dessas classes e métodos para os imprimir na tela (getters e setters). Implemente os respectivos construtores inicializando os atributos com um valor padrão.

Herança Muitas vezes ao utilizar a classe-base, nem sempre os métodos desta classe atendem completamente a necessidade da classe derivada. Entretanto, alterar a classe pai não é uma boa ideia, porque provavelmente não é apenas uma classe filha que a utiliza. Devemos então redefinir o método, ou seja, criar um método na classe derivada com o mesmo nome da classebase e reescrevê-lo ou alterá-lo.

Sobrescrita de métodos Consiste em criar um novo método na classe filha contendo a mesma assinatura e mesmo tipo de retorno do método sobrescrito. O compilador sempre tentará utilizar o método mais próximo ao objeto em execução, ou seja, se existir o método na classe-base e na classe derivada, o compilador executará o da classe derivada. Não confundir com sobrecarga de métodos.

Sobrescrita de métodos Quando um método for redefinido na classe derivada ele pode chamar ou não o método da classe-base. Caso seja necessário chamá-lo, o fazemos por meio do operador de resolução de escopo (::).

Exercício Exercício 6 - Implemente as seguintes classes Funcionario com um método que calcule o salário do funcionário de acordo com os dias trabalhados. Gerente que herde a classe Funcionario e sobrescreva o método de cálculo do salário, atribuindo ao gerente 60% a mais.

Aula 5 CompPET 2015

Polimorfismo Polimorfismo (poli: muitas, morfismo : formas). Permite chamar um método de um objeto sem saber a classe exata desse objeto. Em C++, isso significa que uma única instrução pode chamar diferentes métodos.

Polimorfismo

Métodos virtuais É um método cujo comportamento pode ser sobrescrito em uma classe herdeira por uma função com a mesma assinatura. class Jogador virtual void imprimetipojogador(...) cout << Eu sou um jogador indeciso. <<endl; } };

Métodos virtuais class JogadorVolei: public Jogador void imprimetipojogador(...) cout << Eu jogo volei. <<endl; } };

Métodos virtuais class JogadorDota: public Jogador void imprimetipojogador(...) cout << Eu jogo dota. <<endl; } };

Métodos virtuais A diferença de sobrescrição de um método comum e de um método virtual, é que sempre será chamada a implementação da classe derivada e não da classe base em tempo de execução.

Métodos virtuais int main () vector <Jogador*> jogadores; JogadorVolei jv; JogadorDota jd; jogadores.push_back(&jv); jogadores.push_back(&d); for (int i = 0; i < jogadores.size(); i++) jogadores[i]->imprimetipojogador(); } }

Métodos virtuais Resultado: Eu jogo volei. Eu jogo dota.

Métodos virtuais E se o método imprimetipojogador não fosse declarado como virtual?

Métodos virtuais Resultado: Eu sou um jogador indeciso. Eu sou um jogador indeciso.

Métodos virtuais puros Um método virtual é tido um método virtual puro quando a classe não especifica sua implementação. Ex.: class Jogador public: virtual void imprimetipojogador() = 0; };

Polimorfismo - Exercício Problema: Um fórum virtual oferece um serviço de chats para os jogadores. Existem diversos tipos de jogadores, mas todos possuem em comum: nome, idade e a quantidade em horas semanais que passa jogando. Os jogadores podem ser jogadores de futebol ou de Temple Run. Os jogadores de Temple Run possuir as informações: dispositivo movel que usam e maior pontuação. Cada jogador deve ser apresentado mostrando a seguinte tela quando invocado o método dadosjogador:

Polimorfismo - Exercício Exemplo jogador de Futebol de botão: Nome do jogador: Katy Perry Idade: 81 anos. Horas jogando por semana: 4 horas. Nome do jogo: Futebol de Botão. Exemplo jogador de Temple Run: Nome do jogador: Leeroy. Idade: 30 anos. Horas jogando por semana: 20 horas. Maior pontuação: 3600. Nome do jogo: Temple Run. Dispositivo: Android.

Classes Abstratas Uma classe abstrata é uma classe que não pode ser instanciada, mas que seus descendentes podem ser.

Classes Abstratas Em C++, uma classe abstrata é criada pela declaração de pelo menos um método abstrato (pure virtual). virtual void metodoabstrato(...) = 0; Toda operação abstrata utiliza acoplamento dinâmico, ou seja, sua execução é decidida em tempo de execução. Classes abstratas que possuem pelo menos um método virtual puro não pode ser utilizadas para instanciar objetos, e são utilizadas apenas como Interface.

Herança Múltipla Na linguagem C++ a herança múltipla é aceita, ou seja, uma classe pode herdar as características de mais de uma classe-base. É preciso bastante cuidado ao implementar códigos com herança múltipla para evitar a ambiguidade. Se uma classe filha herdar de classes pai que tem métodos e/ou atributos com o mesmo nome, erros de incompatibilidade são gerados.

Herança Múltipla A sintaxe da herança múltipla é similar a herança simples, observe: class X }; class Y }; class Z: public X, public Y };

Herança Múltipla Se por acaso houver ambiguidade devido a herança múltipla, pode-se corrigir utilizando o operador de resolução de escopo: class X void imprime(); }; class Y void imprime(); }; class Z: public X, public Y };

Herança Múltipla int main() Z obj; Z.print(); //Gera erro de ambiguidade Z.X::imprime(); Z.Y::imprime(); }

Exemplo Herança Múltipla

Aula 6 CompPET 2015

Exceções Uma exceção é um erro que acontece durante a execução do programa. Uma possibilidade para verificar erros é com if e else, porém não é muito viável, existem maneiras melhores.

Exceções int main() int a,b,divisao; cin>> a; cin>>b; divisão = a/b; cout<< resultado <<divisao<<endl; } O código irá parar de funcionar caso seja atribuído 0 à variável b.

Exceções int main() int a,b,divisao; cin>> a; cin>>b; if(b==0) cout<< divisão por zero <<endl; else divisao = a/b; cout<< resultado <<divisao<<endl; } }

Exceções Uma forma melhor de evitar erros inesperados é utilizar o tratamento de exceções. Vantagens de utilizar exceção: Separação do código que identifica o erro e o código que trata o erro; Tratamento de erros localizada; Aumento da confiabilidade da aplicação.

Exceções A captura e tratamento de exceções é feita com os comandos try, catch, throw : try: delimita o bloco de código que será protegido; catch: delimita o final de um bloco protegido e o início das instruções de tratamento de exceções; throw: gera novas exceções ou propaga uma já existente

Exceções try //Código passivo de gerar exceção throw (exceção) } catch(int e) // código que será executado caso // haja lançamento de exceção }

Exceções int main() int a,b,divisao; try cin>> a; cin>>b; if(b==0) throw b; divisao = a/b; cout<< resultado <<divisao<<endl; } catch(int e) cout<< valor <<e<< inválido para b ; }

Exceções - Exercício Suponha que a empresa que mantém o fórum de jogadores do exercício anterior tenha recebido muitas queixas contra jogadores de mais de 89 anos. Eles estão incomodando os jogadores de Temple Run, dizendo que eles só ficam olhando para o celular. Como os jogadores de Temple Run são maioria, a diretoria pediu para que você impeça os velhinhos de entrar no fórum. Dessa forma, crie uma exceção que impeça que jogadores maiores de 80 anos se cadastrem no fórum.

Classes de Exceções O comando throw pode lançar qualquer tipo de exceção. Pode-se pegar uma exceção qualquer utilizando... como parâmetro do catch. Dessa forma é comum definir uma classe de exceções cujo objeto contém a informação que se deseja capturar no bloco catch.

Classes de Exceções class ByZero private: string a = divisão por zero ; public: void imprimeerro() cout<< Ocorreu um erro: <<a<<endl; } }; Observe o comando throw que a exceção da classe: throw ByZero();

Exceções int main() int a,b,divisao; try cin>>a>>b; if(b==0) throw ByZero(); divisao = a/b; cout<<"resultado = "<<divisao<<endl; } catch(byzero e) e.imprimeerro(); } return 0; }

Classes de Exceções Assim como podemos definir nossa próprias classes de exceção, existem as classes de exceções padrões: exception: a classe base para todas as exceções lançadas. logic_error: Informa erros lógicos (por exemplo: erros de tamanho, argumentos inválidos). runtime_error: Informa erros de runtime que só poderiam ter sido detectados durante a execução (por exemplo: overflow).

Classes de Exceções - Exercício Crie uma classe de exceção para o exercício anterior.

Templates Templates são ferramentas que permitem definir funções e classes que possuem como parâmetros variáveis de tipos não especificados. Desta forma, podemos fazer: Funções com argumentos mais genéricos. Classes muito mais generalizadas.

Templates - Funções Função para soma de inteiros: int soma(int var1,int var2) int res = var1 + var2; return res; } Função para soma de strings: string soma(string var1, string var2) string res = var1 + var2 return res; }

Templates - Funções Função para soma de quaisquer tipos: template <class tipo> tipo soma(tipo var1,tipo var2) tipo res = var1 + var2; return res; }

Templates - Funções Outro exemplo: template <class X> void trocavalores(x &var1,x &var2) X temp; temp = var1; var1 = var2; var2 = temp; }

Templates - Classes Classe genérica: template <class tipo> class calculadora tipo multiplica(tipo x, tipo y) return x*y; } tipo soma(tipo x, tipo y) return x+y; } };

Templates - Classes Instanciação da classe: int main() calculadora<int> calc; int n1 = 3, n2 = 5; cout << calc.multiplica(n1, n2) << endl; cout << calc.soma(n1, n2) << endl;; return 0; }

Exercício de Templates Continue o exemplo do jogador. Implemente uma nova classe de usuário que será o moderador do fórum. Usando a ideia de templates, faça um método que receba qualquer tipo de usuário do fórum e imprima uma saudação com seu nome. Ex: Olá fulano de tal!

Funções e bibliotecas interessantes istream::ignore(qtd, delim): retira caracteres de entrada, até que qtd caracteres sejam retirados ou um caracter seja igual a delim cin.ignore(1,'\n'); Stack Queue Algorithm