60
1 C+ + Orientado a Objetos Flávio de Oliveira Silva 1 C+ + ORI ENTADO A OBJETOS FLÁVI O DE OLI VEI RA SI LVA [email protected] [email protected] C+ + Orientado a Objetos Flávio de Oliveira Silva 2 1. I NTRODUÇÃO A POO POO – Paradigma Baseado em objetos Paradigma – Modelo, padrão para especificação de um problema Paradigmas existentes na programação de computadores: Procedimental; Funcional; Lógico e Orientado a Objetos(OO)

1. INTRODUÇÃO A POO - facom.ufu.brflavio/ed1/files/C++ ORIENTADO A OBJETOS.pdf · 3 C++ Orientado a Objetos Flávio de Oliveira Silva 5 LÓGICA Computação baseada em fatos e regras

  • Upload
    voliem

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

1

C+ + Orientado a Objetos Flávio de Oliveira Silva 1

C+ +ORIENTADO A OBJETOS

FLÁVIO DE OLIVEIRA [email protected]

[email protected]

C+ + Orientado a Objetos Flávio de Oliveira Silva 2

1. INTRODUÇÃO A POO

� POO – Paradigma Baseado em objetos� Paradigma – Modelo, padrão para

especificação de um problema� Paradigmas existentes na programação

de computadores: Procedimental; Funcional; Lógico e Orientado a Objetos(OO)

2

C+ + Orientado a Objetos Flávio de Oliveira Silva 3

PROCEDIMENTAL (Algorítmica)� Computação ocorre através da execução de

instruções passo a passo. Ex: C; Pascalint fatorial(int n){int fat;fat = 1;if (n == 0)return 1;

while (n >= 1){fat = fat * n;n = n -1;

}return fat;

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 4

FUNCIONAL� Computação baseada em calculo de funções.

Ex: LISP; HASKELL;LISP(defun fatorial (n)(cond ((= n 0) 1) (t (* n (fatorial (- n 1))))

))-- Haskellfatorial :: Integer -> Integerfatorial 0 = 1fatorial n = n * fatorial (n - 1)

3

C+ + Orientado a Objetos Flávio de Oliveira Silva 5

LÓGICA� Computação baseada em fatos e regras. Ex: Prologfactorial(0,1).factorial(N,X):- M is N - 1,

factorial(M,Y), X is N * Y.

ORIENTADO A OBJETOS (OO)� Computação baseada em objetos que se

intercomunicam. Objetos contém dados e métodos. Ex: C++; Java

public class Numero {private long valor = 0;public long Fatorial() {

if (valor == 0) { return 1;

} else { return valor*Fatorial(valor-1);

}}

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 6

PARADIGMAS

� Cada paradigma representa uma forma de propor uma solução a um dado problema.

� A utilização de um ou outro paradigma depende de vários fatores.

4

C+ + Orientado a Objetos Flávio de Oliveira Silva 7

PROGRAMAÇÃO ORIENTADA A OBJETOSConceitos Básicos

1. OBJETO2. MÉTODOS3. MESSAGEM4. CLASSE 5. CLASSIFICAÇÃO

1. GENERALIZAÇÃO2. ESPECIALIZAÇÃO

6. HERANÇA7. ENCAPSULAMENTO8. POLIMORFISMO

C+ + Orientado a Objetos Flávio de Oliveira Silva 8

OBJETO� Entidades que possuem dados e instruções sobre como

manipular estes dados� Os objetos estão ligado à solução do problema.

Software Gráfico – Objetos: Circulos; Linhas; etc.Software Engenharia – Cargas Elétricas; Circuitos Elétricos; Motores; etc.Software Comercial: Pedidos; Produtos; Clientes; etc.

� Na POO a solução do problema consiste em um primeiro momento estabelecer quais os objetos serão necessários.

� Um ponto sempre contém dados relacionados ao mesmo que o identificam – Exemplos:Círculo – ponto_centro, raioLinha – ponto_inicio; ponto_finalCliente – Nome; Endereco; TelefoneCircuito Elétrico – Nome; Potência (W); Pontênia(VA)Exemplos:

/ /criação de objetosCircle c;Cliente pessoa;

5

C+ + Orientado a Objetos Flávio de Oliveira Silva 9

MÉTODOS� Métodos são procedimentos que determinam

como o objeto se comporta. Através dos métodos é possível manipular os dados contidos no objeto.

� Os métodos estão ligados ao comportamento do objetoExemplos:

� Um círculo poderia possuir os métodos: draw; move; getArea; getPerimeter; setCenter

� Um circuito elétrico poderia ter os seguintesmétodos: setCarga; addCarga; setPotenciaW; setPotênciaVA

C+ + Orientado a Objetos Flávio de Oliveira Silva 10

MENSAGEM� Objetos se comunicam entre si através de

mensagens. Uma mensagem é uma chamada de um método. A mensagem possui os seguintes componentes:Receptor – nome do objeto que irá receber a mensagemMétodo – Método do receptor que será utilizadoArgumentos – Informação adicional para a execução do

métodoExemplos

Point p(0,0), pNewCenter(2,3);Circle c(p,3);c.getArea(); / /Exemplo Mensagemc.setCenter(pNewCenter); / /Exemplo Mensagem

6

C+ + Orientado a Objetos Flávio de Oliveira Silva 11

CLASSE� Classe é um agrupamento de objetos� A classe consiste nos métodos e nos dados

que um determinado objeto irá possuir.� Objetos são criados quando uma mensagem

solicitando a criação é recebida pela sua classe.

� A classe contém as informações para criar, manipular e destruir o objeto

� Um objeto é uma instância da classe.

C+ + Orientado a Objetos Flávio de Oliveira Silva 12

CLASSIFICAÇÃO� Na POO classificação consiste em criar

classes a partir dos objetos envolvidos em um determinado problema

� Ex: Diferentes tipos de pessoas interagem com um Empresa

COMPORTAMENTO CLASSEPessoas interessadas nos produtos ???Pessoas que já compraram os produtos ???Pessoas que são responsáveis por um grupo de trabalhadores ???Pessoas responsáveis pela demonstração de produtos e sua venda ???

Trabalhadores da linha de produção ???

7

C+ + Orientado a Objetos Flávio de Oliveira Silva 13

GENERALIZAÇÃOESPECIALIZAÇÃO� GENERALIZAÇÃO

A generalização consiste em obter similaridades entre as várias classes e partir destas similaridades, novas classes são definidas Estas classes são chamadas superclasses

� ESPECIALIZAÇÃOA especialização por sua vez consiste em observar diferenças entre os objetos de uma mesma classe e dessa forma novas classes são criadas. Estas classes são chamadas subclasses.

C+ + Orientado a Objetos Flávio de Oliveira Silva 14

EXEMPLO

8

C+ + Orientado a Objetos Flávio de Oliveira Silva 15

HERANÇA� Herança é a capacidade de uma subclasse de

ter acesso as propriedades da superclasse relacionada a esta subclasse.

� Dessa forma as propriedades de uma classe são propagadas de cima para baixo em um diagrama de classes.

� Neste caso dizemos que a subclasse herda as propriedades e métodos da superclasse

C+ + Orientado a Objetos Flávio de Oliveira Silva 16

� A relação de herança entre duas classes é uma relação da seguinte forma: A “e um tipo de” B, onde A e B são classes. Caso a relação entre as classes não puder ser construída, em geral, também não se tem uma relação de herança entre a classe A a partir da classe B.

� Exemplos: Um Carro de Passeio “é um tipo de ” veículo; Um caminhão “é um tipo de” veículo; Um círculo “é um tipo de” uma figura geométrica; Um quadrado “é um tipo de” figura geométrica; Um vendedor “é um tipo de”Empregado; Um empregado “e um tipo de” pessoa.

� Herança Múltipla – Uma subclasse herda características de mais de uma classe

� Exemplos: Um gerente de vendas “é um tipo” de vendedor e “é um tipo de” gerente;

HERANÇA

9

C+ + Orientado a Objetos Flávio de Oliveira Silva 17

� Além da relação de herança entre as classes existe a relação de uso

� HERANÇAclasse A “é um tipo de” B

� USO / AGREGAÇÃO (Relação de Conteúdo)classe C “contém” classe D”classe C “usa” classe D”classe C “é parte da” classe D”

Ex.: Uma placa de circuito eletrônico contém resistores;capacitores e CIs

HERANÇA x USO

C+ + Orientado a Objetos Flávio de Oliveira Silva 18

HERANÇA x USO

10

C+ + Orientado a Objetos Flávio de Oliveira Silva 19

ENCAPSULAMENTO� Encapsulamento é um termo que indica que os dados

contidos em um objeto somente poderão ser acessados através de seus métodos. Dessa forma não é possível alterar os dados diretamente, somente através de métodos. Ex: O raio somente pode ser alterado/recuperado pelos métodos setCenter/getCenter.

CIRCULO

Ponto centerRaio r

getAreagetPerimetergetCentergetRadiussetCentersetRadius

C+ + Orientado a Objetos Flávio de Oliveira Silva 20

POLIMORFISMO� Os objetos respondem às messagens que eles

recebem através dos métodos. A mesma mensagem pode resultar em diferentes resultados. Esta propriedade é chamada de polimorfismoEx: getSalario()

Para um empregado qualquer Æ getsalario() = Salario;Para o gerente Æ getsalario() = salario + bonificacao;

Ex: draw()Para uma figura qualquer desenha uma forma não definidaPara o retângulo, triângulo e círculo o mesmo método responde de uma forma diferente

11

C+ + Orientado a Objetos Flávio de Oliveira Silva 21

POLIMORFISMO - Exemplo

RETÂNGULO TRIÂNGULO CÍRCULO

FIGURA

draw()

draw()

draw() draw()

?

C+ + Orientado a Objetos Flávio de Oliveira Silva 22

ANÁLISE ORIENTADA A OBJETOS (OOA)� Objetivo básico – Identificar classes a partir das

quais objetos serão representados como instâncias

� Envolve as seguintes tarefas� Identificação de Objetos� Especificação de Atributos� Definição de métodos� Comunicações entre objetos

� Em uma especificação:� NOMES são potenciais objetos � VERBOS são potenciais métodos

12

C+ + Orientado a Objetos Flávio de Oliveira Silva 23

ANÁLISE ORIENTADA A OBJETOS (OOA)� IDENTIFICAÇÃO DE OBJETOS – CRITÉRIOS

1. RETENÇÃO DE INFORMAÇÃO – Objeto deve guardar informação que será utilizada pelo sistema

2. SERVIÇOS NECESSÁRIOS – Conjunto de operações identificáveis que podem mudar o valor de seus atributos

3. MÚLTIPLOS ATRIBUTOS – Objeto deve conter mais de um atributo

4. ATRIBUTOS COMUNS – Conjunto de atributos deve ser aplicado a todos os objetos

5. OPERAÇÕES COMUNS – Conjunto de operações devem ser aplicáveis a todos os objetos.

6. REQUISITOS ESSENCIAIS – Entidades externas que aparecem no espaço problema que consomem e/ou produzem informação

C+ + Orientado a Objetos Flávio de Oliveira Silva 24

RESUMO:ANÁLISE E PROJETO ORIENTADO A OBJETOSOs seguintes passos são necessários para a solução de umproblema utilizando a programação orientada a objetos

� ENTENDER O PROBLEMA� IDENTIFICAR OS OBJETOS / CLASSES� ESPECIFICAR OS ATRIBUTOS (DADOS) DOS OBJETOS

� Quais dados são necessários para descrever o objeto?� DEFINIR OS MÉTODOS(PROCEDIMENTOS) NECESSÁRIOS

PARA O OBJETO� Quais as responsabilidades do objeto? Qual ações deve executar?

� IDENTIFICAR A COMUNICAÇÃO ENTRE OS OBJETOS� EX.: Objeto Tela irá solicitar ao objeto Retângulo que o mesmo se

desenhe.� IMPLEMENTAR AS CLASSES

� Criação do código do programa utilizando uma linguagem Orientada a objetos

13

C+ + Orientado a Objetos Flávio de Oliveira Silva 25

UTILIZANDO DO DevC+ + Será utilizado o ambiente DevC+ + . Versão 4.9.7.0

� Ambiente gráfico; Em português; Gratuito� Utiliza compiladores da família gcc

Criando um novo Projeto� Arquivo Æ Novo Æ Projeto...� Um projeto contém todas as informações necessárias para compilar e

criar programas. Em um projeto são armazenados todos os arquivos necessários (arquivos .cpp; .h e .rc)

� O projeto (hello.dev) deve ser salvo de preferência em uma pasta específica para o mesmo.

C+ + Orientado a Objetos Flávio de Oliveira Silva 26

UTILIZANDO O DevC+ + Criando um novo Projeto / Salvando Arquivos

� Um projeto “Console Application” consiste de um programa que será executado no terminal do S.O em modo texto.

� Após criar o projeto automaticamente será criada a função main, necessária para a execução do mesmoint main(int argc, char *argv[])

� Além disso um arquivo main.cpp será criado. Neste arquivo existe o código básico de uma “Console Application”. Este arquivo deve ser salvo na pasta criada para o projeto.

� Para salvar um arquivo utilize a opção do menu Arquivo Æ Salvar (Ctrl + s) ou então a barra de ferramentas

14

C+ + Orientado a Objetos Flávio de Oliveira Silva 27

UTILIZANDO O DevC+ + Editando programas

� O editor de programas possui recursos interessantes como: navegador de classes; diferentes cores para diferentes partes do código; complemento de código; entre outras.

� Cada parte do código possui uma cor específica:� Palavras reservadas da linguagem – preto / negrito� Texto (Strings) – vermelho� Números – roxo� Preprocessador - verde� Comentário – azul

/ /console application - código básico# include < iostream># include <stdlib.h>int main(int argc, char * argv[ ] ){

printf("Hello World!\n\n");system("PAUSE");return 0;

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 28

Editor

Códigomain.cpp

Headerstdlib.h

Preprocessador

Compilador

Arquivo Objeto

Arquivo Executávelhello.exe

Linker

hello.o

Bibliotecaslibgcc.a*.o

Arquivos Objeto

g++.exe

UTILIZANDO O DevC+ + Compilando programas

� Para compilar os programas utilizar o menu Executar ÆCompilar (Ctrl + F9)

15

C+ + Orientado a Objetos Flávio de Oliveira Silva 29

CONFIGURANDO O DevC+ + Um problema muito comum é o compilador e o linker não

encontrar os arquivos .h e as bibliotecas necessárias Para Configurar o DevC+ + para utilização do código em C+ +

inicialmente deve ser utilizado o menu: Ferramentas ÆOpções do Compilador

Em seguida deve-se clicar no tab DI RETÓRI OS. No tab BI NÁRI OS deve existir a seguinte informação:

� C:\Dev-Cpp\Bin� Esta é a pasta que contém os executáveis (compilador;

linker; etc.) No tab BI BLI OTECAS deve existir a seguinte informação:

� C:\Dev-Cpp\ lib� Esta é a pasta que contém as bibliotecas que serão

utilizadas pelo linker

C+ + Orientado a Objetos Flávio de Oliveira Silva 30

CONFIGURANDO O DevC+ + No tab “C I NCLUDES” deve existir a seguinte informação:

� C:\Dev-Cpp\ include� Esta é a pasta que contém arquivos .h básicos utilizados

normalmente por um programa que utiliza apenas C padrão No tab “C+ + I NCLUDES” deve existir as seguintes

informações:� C:\Dev-Cpp\ include\c+ +� C:\Dev-Cpp\ include� C:\Dev-Cpp\ include\c+ + \mingw32� C:\Dev-Cpp\ include\c+ + \bits� Estas pasta que contém arquivos .h básicos utilizados

normalmente por um programa que utiliza C+ + Nos exemplos acima é considerado que o DevC+ +

está instalado na pasta: “C:\Dev-cpp”. Caso a pasta seja outra o nome deve ser substituido .

16

C+ + Orientado a Objetos Flávio de Oliveira Silva 31

CONFIGURANDO O DevC+ + A figura abaixo mostra a tela de configuração. Para adicionar

ou remover pastas deve ser utilizado os botões localizados na parte inferior da tela.

C+ + Orientado a Objetos Flávio de Oliveira Silva 32

DEPURANDO PROGRAMAS Um recurso importante do compilador é a possibilida de

depurar (debug) o código. Para isto inicialmente é necessário informar ao compilador que gere informações adicionais que serão utilizadas pelo debugger.

Para configurar deve-se utilizar o menu Projeto Æ Opções do Projeto. Em seguida deve-se clicar no tab e marcar “YES” em “Gerar informação de depuração”, conforme mostrado abaixo.

17

C+ + Orientado a Objetos Flávio de Oliveira Silva 33

DEPURANDO PROGRAMAS Feito isto além de gerar o código será também gerada a

informação para depuração. O próximo passo é criar “BreakPoints” que são pontos de

parada durante a execução do código. Para criar um “breakpoint” basta clicar na faixa preta ao lado de cada linha, conforme mostrado abaixo:

As linhas que contém “breakpoints” são destacadas Para iniciar o processo de depuração utiliza-se o menu DEBUG

ÆDEBUG (F8)

C+ + Orientado a Objetos Flávio de Oliveira Silva 34

DEPURANDO PROGRAMAS Após o processo de debug ser iniciado pode utilizar o painel

inferior para executar o programa passo a passo(opção “Próximo passo”)

Para inspecionar métodos deve-se utilizar a opção “passar por dentro” antes da execução do mesmo. Dessa forma o debugger irá passar o controle para o método, sendo possível assim, observar o seu funcionamento.

Para inspecionar o conteúdo de variáveis e objetos, deve-se selecionar a variável e clicar no botão “Adicionar Marcador”

18

C+ + Orientado a Objetos Flávio de Oliveira Silva 35

C+ + CARACTERÍSTICAS C

� Linguagem compilada� ANSI C – Padrão e Portabilidade� Programação em Alto nível e baixo nível� Programação Estruturada� Utilização da memória: Ponteiros

C++� Criado por Stroustroup em 1980� Novos conceitos em procedimentos

(Sobrecarga; Templates; exceções; converões de tipos)� Programação orientada a objetos

(Classes; Herança; Encapsulamento; Polimorfismo)

C+ + Orientado a Objetos Flávio de Oliveira Silva 36

Aplicação Console – Código Básico/ /Preprocessador inclui o arquivo stdio.h - definição da função printf#include <stdio.h>/ / Inclue funções básicas, neste caso a função system#include <stdlib.h>/ /Definição da função main. Uma aplicação console deve possuir uma / / função mainint main(int argc, char *argv[])/ / Inicio do bloco da função main{

/ / Imprime o texto - Hello World! – e duas quebras de linhaprintf("Hello World!\n\n");

/ /Chama um comando do console, neste caso o comando PAUSEsystem("PAUSE");

/ /Finaliza o processamento da função main e retornareturn 0;

/ / fim do bloco da função main}

19

C+ + Orientado a Objetos Flávio de Oliveira Silva 37

COMANDOS e EXPRESSÕES Comando é a menor unidade de um programa C++ e pode

conter uma ou mais linhas Os comandos são finalizados por ; Um bloco contém uma sequência de comandos que são

executados sequencialmente e inicia com o caracter { e termina com o caracter }

É possível a criação de blocos dentro de blocos de programa Uma expressão representa uma operação executada pelo

programa. Ex: Definição de Variável; Expressão Aritmética ou lógica; Mensagem entre objetos

{expr1;expr2;{exprI1;exprI;

}...expr3;

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 38

TIPOS BÁSICOS Tipos de dados são abstrações utilizadas e manipuladas por uma

linguagem. Tipos fundamentais fazem parte da linguagem e estão sempre

disponíveis para serem utilizados Quando uma classe é criada um novo tipo fica disponível para o

programa A tabela abaixo mostras os tipos fundamentais (plataforma 32 bits)

bool booleano 1 0 1char signed char caracteres 1 -128 127

unsigned char caracteres sem sinal 1 0 255short short int; signed short int inteiro pequeno 2 -32768 32767

unsigned sort unsigned short int inteiro pequeno sem sinal 2 0 65535int signed; signed int inteiros 4 -2.147.483.648 2.147.483.648

unsigned int unsigned inteiro sem sinal 4 0 4.294.967.295long long int; signed long int inteiro grande 4 -2.147.483.648 2.147.483.648

unsigned long unsigned long int inteiro grande sem sinal 4 0 4.294.967.295float ponto flutuante; precisão simples 4 -3.4e-37 3.4e+38

double ponto flutuante; precisão dupla 8 -1.7e-307 1.7e+308long double ponto flutuante; precisão dupla 8 -1.7e-307 1.7e+308

Tamanho (bytes)

Valor Mínimo Valor MáximoTipo CaracterísticaTambém conhecido como

20

C+ + Orientado a Objetos Flávio de Oliveira Silva 39

VARIÁVEIS Toda variável deve ser declarada sendo necessário a definição do

seu tipoint iX;dobule dX, dY;bool bValue;

Durante a declaração é possível inicializar a variável, definindo um valor inicial para a mesma

int iX = 200; / /Sintaxe C padrãoint iX(200), iY(244) / /Sintaxe C+ +

Uma varíavel declarada dentro um bloco é válida somente dentro daquele bloco. Neste caso ela possui um “escopo LOCAL”

Uma varíavel declarada fora de um bloco possui um “escopo”GLOBAL”

A keyword const especifica uma variável cujo valor não pode ser modificado

const double PI = 3.14159;

C+ + Orientado a Objetos Flávio de Oliveira Silva 40

OPERADORES� ARITMÉTICOS – "+ " "-" "* " "/ " "%"

int iA = 13; //declara e inicializaint iV(7); //declara e inicializafloat f1; //declara a variávelf1 = 13; //Inicializa variáveliA+iV //retorna 20iA-iV //retorna 6iA*iV //retorna 91iA/iV //retorna 1f1/iV //retorna 1.8571428f1%iV //operador módulo – retorna resto

//inteiro da divisão de f1 por iV//neste caso o valor é zero.

21

C+ + Orientado a Objetos Flávio de Oliveira Silva 41

OPERADORES� INCREMENTO ("+ + ") E DECREMENTO("--")

� Funcionam como operadores unáriosint iY, iX = 10 //iY indefinido e iX igual a 10//Incremento prefixado – incrementa primeiro iX

//e depois Atribui a iY

iY = ++iX;

//Neste ponto iY = 11 e iX = 11;//Incremento pós-fixado – Primeiro atribui iX a

//iY e depois incrementa iX;

iY = iX++;

//Ao final iY = 11 e iX = 12;

C+ + Orientado a Objetos Flávio de Oliveira Silva 42

OPERADORES� LÓGICOS – "&&" (AND) "| | " (OR) "!" (NOT)int bX, bY;

� Em C+ + se uma expressão é false, o seu retorno equivale a zero de tipo int - int false(0). Uma expressão é true se retorna um valor diferente de zero.

bX bY bX && bY bX || bY !bXtrue true true truetrue false false truefalse true false truefalse false false false

false

true

22

C+ + Orientado a Objetos Flávio de Oliveira Silva 43

OPERADORES� RELACIONAIS

Exemplos:int iH = 4, iJ = 4, iK = 6;

iH == iJ //Retorna 1

iH == iK //Retorna 0iK == iK //Retorna 1

iH < iK //Retorna 1

iH < iJ //Retorna 0

iH <= iJ //Retorna 1

IGUALDADE == MENOR OU IGUAL QUE <=DESIGUALDADE != MENOR OU IGUAL QUE <=

MENOR QUE < MAIOR OU IGUAL QUE >=

C+ + Orientado a Objetos Flávio de Oliveira Silva 44

OPERADORES� OPERADORES BINÁRIOS

Exemplos:int c = 4; //binário 00000100int d = 6; //binário 00000110int bytRes; bytRes = c & d; //retorna 4 00000100bytRes = c ^ d; //retorna 2 00000010bytRes = c | d; //retorna 6 00000110bytRes = ~c; //retorna -5 11111011bytRes = d >> 2; //retorna 1 00000001bytRes = d << 2; //retorna 24 00011000

"AND" BINÁRIO & "OR" INCLSUIVO BINÁRIO |"OR" EXCLUSIVO BINÁRIO ^ COMPLEMENTO BINÁRIO ~

23

C+ + Orientado a Objetos Flávio de Oliveira Silva 45

OPERADORES� OPERADOR CONDICIONAL( ? : )Exemplo:a ? b : c / / retorna o valor b se a é true,

/ /caso contrário retorna o valor c

C+ + Orientado a Objetos Flávio de Oliveira Silva 46

OPERADORES� Associatividade da esquerda para direita� Regras de Precedência

Exemplos:a/b*c interpretado como (a/b)*ca+b*c/d interpretado como a+((b*c)/d)

[] . e++ e---e !e ~e ++e --e

new* / %

+ -== !=

&^|

&&||

? := += *= /= %= >>= <<= &= ^= !=

24

C+ + Orientado a Objetos Flávio de Oliveira Silva 47

OPERADORES IMPORTANTES� ATRIBUIÇÃO DE VALORES(Operador = )

Variável (v e v1) à esquerda irá conter o valor E, especificado à direita.v = E;v = v1 = E; equivale a v = (v1 = E); / /Evitar!!!

� ATRIBUIÇÃO COM OPERADOR (op= )Sendo op um operadorv op= f; equivale a v = v op f;Ex: a + = 2; equivale a a = a + 2;

C+ + Orientado a Objetos Flávio de Oliveira Silva 48

OPERADORES IMPORTANTES� ASSESSANDO UM MÉTODO DE UM OBJETO

Utiliza-se o operador ponto "." ou então o operador "-> "Exemplo:Circle* pC = new Circle(); / /No caso acima pC é um ponteiro para um circle

pC-> getName();Circle c(3); / /Neste caso Circle não é um ponteiro,

c.getArea(); / /mas sim uma variável estática!

25

C+ + Orientado a Objetos Flávio de Oliveira Silva 49

ESTRUTURA DE UM PROGRAMA EM C+ +# include# defineDefinições de Variáveis globaisProtótipos de funções/classesFunções criadas pelo programa / Métodos de classesint main(){...return 0;

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 50

ARQUIVOS INCLUDE� A diretiva # include informa que um arquivo de

cabeçalho (* .h) deverá ser incluido, pelo processador, no ponto indicado

� Os arquivos de cabeçalho (header files) pode conter protótipos de funções; definições de constantes e definições de classes juntamente juntamente com seus atributos e métodos

� Para incluir um arquivo somente é necessário informar o nome do arquivo sem a necessidade de indicar sua localização, para que a compilação ocorra corretamente é necessário que as pastas de arquivos INCLUDE esteja corretamente configura no projeto ou então no ambiente de desenvolvimento.

� Para configurar as pastas onde estão os arquivos de includes no DEVC+ + deve ser utilizado o menu:

FERRAMENTAS Æ OPÇÕES DO COMPILADOR Æ DIRETÓRIOS

26

C+ + Orientado a Objetos Flávio de Oliveira Silva 51

DIRETIVA # DEFINE E VARIÁVEIS GLOBAIS� A diretiva # define é utilizada para dar um nome a

um valor constante que será utilizado em todo o programa.

� Após a definição de uma constante através da diretiva # define, em todas as ocorrências subsequentes no código, após a definição, o nome utilizado, serásubstituido pela constante no momento da compilação

� Com a diretiva # define é possível também criarmacros que são utilizados pelo programa

� Exemplos:#define PI 3.141519

#define maior(x,y)((x>y) ? x : Y)

C+ + Orientado a Objetos Flávio de Oliveira Silva 52

ESPOCO (VISIBILIDADE) EM UMA CLASSE� Dentro de uma classe os métodos e atributos

possuem o seguinte escopo:� public: Método ou atributo visível a todas as

classes� protected: Método ou atributo visível nas

subclasses� private: Método ou atributo visível somente

na classe onde é utilizado

27

C+ + Orientado a Objetos Flávio de Oliveira Silva 53

SOBRECARREGAMENTO (Overloading)� Consiste em possuir mais de um método com o

mesmo nome, porém com diferentes parâmetros (número, ordem e tipos)

� Este recurso é utilizado para métodos que realizam tarefas semelhantes porém sobre tipos de dados diferentes

� Normalmente este recurso também é utilizado no construtor da classe

� O sobrecarregamento facilita a reutilização de códigoExemplo: Circle c = new Circle();c.move(x,y);/ /Recebe a coordenada x e yc.move(p); / /Recebe o objeto ponto

C+ + Orientado a Objetos Flávio de Oliveira Silva 54

CRIANDO UMA CLASSE EM C+ +� Definição classe - Necessário keyword class� Corpo da Classe – Delimitado por { e po r }� A classe contém dados (atributos ou variáveis

membro) e métodos(procedimentos)� Dados (Variáveis Membro)

� Dados que representam o objeto; Podem ser acessados, diretamente, semelhante a uma “variável global” em qualquer método

� MÉTODOS� CONSTRUTORES� DESTRUTORES� MODIFICADORES� ACESSORES� OUTROS MÉTODOS

28

C+ + Orientado a Objetos Flávio de Oliveira Silva 55

CRIANDO UMA CLASSE EM C+ +� MÉTODOS CONSTRUTORES

� Método especial. Deve possuir o mesmo nome da classe

� Inicializa os dados (variáveis membro) do objeto. Pode também alocar memória e fazer usos de outros recursos (arquivo, por exemplo)

� Garante que objetos iniciem em um estado consistente

� Construtores normalmente são sobrecarregados

� Construtores não podem retornar um valor

C+ + Orientado a Objetos Flávio de Oliveira Silva 56

CRIANDO UMA CLASSE EM C+ +� MÉTODO DESTRUTOR

� A idéia do destrutor é devolver os recursos para o sistema no momento de sua chamada

� O método destrutor não tem parâmetros e não retorna valor.

� Sua assinatura é: ~ NOMECLASSE()� O programa deve liberar todos os recursos utilizados,

como por exemplo a memória pelo construtor da classe� Sempre que um objeto sai de seu escopo seu destrutor

será automáticamente chamado� Exemplo de uso: Fechar arquivos abertos / Liberar

Memória

29

C+ + Orientado a Objetos Flávio de Oliveira Silva 57

CRIANDO UMA CLASSE EM C+ +� MÉTODOS MODIFICADORES (setXXX)

� Permitem a modificação dos dados (variáveis membro) do objeto

� Devem ser do tipo public, pois são acessados de forma externa ao objeto

� Normalmente começam com o “set” a fim de facilitar o entendimento de seu objetivo.

� MÉTODOS ACESSORES (getXXX)� Permitem a recuperação dos dados (variáveis

membro) do objeto� Devem ser do tipo public, pois são acessados de

forma externa ao objeto� Normalmente começam com o “get” a fim de facilitar

o entendimento de seu objetivo.

C+ + Orientado a Objetos Flávio de Oliveira Silva 58

CRIANDO UMA CLASSE EM C+ +� OUTROS MÉTODOS

� Executam tarefas que são de responsabilidade do objeto e que irão representar o comportamento do mesmo.

� Estes métodos podem ser públicos (public) ou privados(private), conforme sua utilização

� Para que o método seja acessado externamente o mesmo de ser do tipo público (public)

� Caso o método seja apenas auxiliar à classe sem uma ligação direta com o comportamento do objeto o mesmo deve ser do tipo privado (private). Normalmente este métodos são utilizados por um outro método público

30

C+ + Orientado a Objetos Flávio de Oliveira Silva 59

DECLARAÇÃO DE UMA CLASSE EM C+ +class NomeClasse {

modificadorAcesso:[ tipoVariavel] tipo variavel_membro1;[ tipoVariavel] tipo variavel_membroN;

modificadorAcesso:/ /ConstrutoresNomeClasse();NomeClasse(T0, T1,...);/ /Destrutor~NomeClasse();/ /ModificadorestipoRetorno setXXX(T0, T1,...);/ /AcessorestipoRetorno getXXX (T0, T1,...);/ /Outros métodos (privados e públicos)tipoRetorno Metodo(T0, T1,...)

} ;

C+ + Orientado a Objetos Flávio de Oliveira Silva 60

DECLARANDO UMA CLASSE EM C+ +class Circle{

private:double dRaio, dXCenter, dYCenter;

public://Construtores (sobrecarregado)

Circle(double);

Circle(double, double, double);

//Destrutor

~Circle();

//Métodos Modificadores

void setRaio(double);

void setCenter(double, double);

//Métodos Acessores

double getRaio();

double getXCenter();

double getYCenter();

//Outros métodos

double getArea();

};

31

C+ + Orientado a Objetos Flávio de Oliveira Silva 61

DECLARANDO UMA CLASSE EM C+ +� A declaração da uma classe é sempre feita em um arquivo

* .h, que é um arquivo de cabeçalho.� A implementação da classe é feita em um arquivo * .cpp,

onde necessariamente deverá ser incluido o arquivo .h correspondente

� A forma de trabalho acima não é obrigatória mas é um interessante padrão de trabalho a fim de facilitar o compartilhamento dos objetos. Exemplo:

� Circle.h / /Declaração da classe Circle� Circle.cpp / / Implementação da classe Circle

� O arquivo * .h é um código em C+ + como outro qualquer logo é possível em seu interior utilizar as diretivas # define e # include, caso seja necessário incluir a definição de algum outro objeto definido anteriormente. Exemplo//Arquivo Circle.cpp

#include "Circle.h"

C+ + Orientado a Objetos Flávio de Oliveira Silva 62

IMPLEMENTANDO UMA CLASSE EM C+ +//Includes necessários#include <iostream> #include "Circle.h"using namespace std;#define PI 3.141592653589793 Circle::Circle(){

dRaio = dXCenter = dYCenter = 0;cout << "Construindo(1) objeto Circle!" << endl; }

Circle::Circle(double dR){dRaio = dR;dXCenter = dYCenter = 0;cout << "Construindo(2) objeto Circle!" << endl; }

//Construtor SobrecarregadoCircle::Circle(double dR, double dX, double dY){

dRaio = dR;dXCenter = dX;dYCenter = dY;cout << "Construindo(3) objeto Circle!" << endl; }

32

C+ + Orientado a Objetos Flávio de Oliveira Silva 63

IMPLEMENTANDO UMA CLASSE EM C+ +//DestrutorCircle::~Circle(){

dRaio = dXCenter = dYCenter = 0;cout << "Destruindo o objeto Circle!" << endl; }

//Métodos Modificadores//Ajusta o raio do círculovoid Circle::setRaio(double dR){

dRaio = dR; }//Ajusta a coordenada X do Centrovoid Circle::setXCenter(double dX){

dXCenter = dX; }//Ajusta a coordenada Y do Centrovoid Circle::setYCenter(double dY){

dYCenter = dY; }void Circle::setCenter(double dX, double dY){

dXCenter = dX;dYCenter = dY; }

C+ + Orientado a Objetos Flávio de Oliveira Silva 64

IMPLEMENTANDO UMA CLASSE EM C+ +//Métodos Acessores//Recupera o raio o Círculodouble Circle::getRaio(){

return dRaio; }//Recupera a coordenada X do Centrodouble Circle::getXCenter(){

return dXCenter; }//recupera a coordenada Y do Centrodouble Circle::getYCenter(){return dYCenter; }

//Outros métodos//Calcula área do círculodouble Circle::getArea(){

return PI * dRaio * dRaio;} double Circle::getPerimeter(){

return 2 * PI * dRaio;}

33

C+ + Orientado a Objetos Flávio de Oliveira Silva 65

UTILIZANDO UMA CLASSE EM C+ +//Includes necessários#include <iostream> #include "Circle.h"using namespace std; int main (int argc, char *argv[]){

//cout imprime uma linha de texto na saida padrãocout << "Hello C++ World!" << endl;//Cria os objetos utilizando diferentes construtoresCircle c1;Circle c2(4);Circle c3(3,4.5,5.5);c1.setCenter(5,5);c1.setRaio(10);cout << "A area de c1 e " << c1.getArea() << endl;cout << "A area de c2 e " << c2.getArea() << endl;cout << "A area de c3 e " << c3.getArea() << endl;cout << "O perimetro c1 e " << c1.getPerimeter() << endl;//continua...

C+ + Orientado a Objetos Flávio de Oliveira Silva 66

UTILIZANDO UMA CLASSE EM C+ +//Cria um bloco de código{cout << "Novo bloco de codigo " << endl;Circle *c1 = new Circle();c1->setRaio(3);cout << "O perimetro c1 e " << c1->getPerimeter()

<< endl;Circle c2(2);cout << "O perimetro c1 e " << c1->getPerimeter()

<< endl;delete c1; cout << "Finalizando o bloco de codigo. Ao sair c2

será destruido!" << endl; }cout << "Digite 0 para finalizar..." << endl;int iRet(0);cin >> iRet; return iRet;

}

34

C+ + Orientado a Objetos Flávio de Oliveira Silva 67

ESTRUTURAS DE CONTROLE� ESTRUTURA DE SELEÇÃO – if / if-else

� Uma instrução (ou bloco de instruções) somente será executada caso uma condição (expressão condicional E) resultar em verdadeiro (true)if (E)S;

� Uma variação da estrutura acima é a estrutura if-else. Onde uma escolha é feita. Se a expressão condicional (E) for verdadeira (true) então um o bloco de instruções logo após a expressão será executado. Caso contrário, sendo a expressão falsa (false) então o bloco que se encontra após a palavra else será executado.if (E)

S;elseR;

� EXEMPLOif (nota >= 60)cout << “Aprovado” << endl;

elsecout << “Reprovado” << endl;

C+ + Orientado a Objetos Flávio de Oliveira Silva 68

ESTRUTURAS DE CONTROLE� ESTRUTURA DE SELEÇÃO MÚLTIPLA – switch

� A estrutura if/ else permite a seleção no máximo entre 2 blocos diferentes.

� Caso seja necessário um número maior de opções então deve ser utilizado a estrutura switch. Exemplo:switch (E) {case c1 : S1;

break;case c2 : S2;

break;...default : Sd;

� Inicialmente a expressão E é avaliada. Caso a expressão E, resulte na constante c1 , o bloco de instruções S1 será executado, até que a palavra break seja encontrada. Neste caso o próxima instrução após o switch será executada. Da mesma forma caso E, resulte na constante c2 o bloco S2 será executado. E assim, sucessivamente.

� Caso a expressão E não resulte em nenhum valor constante presente no swith (c1, c2, ...) então o bloco padrão (default) Sd seráexecutado

� O bloco default (Sd) é opcional, não sendo necessário sua presença.

35

C+ + Orientado a Objetos Flávio de Oliveira Silva 69

ESTRUTURAS DE CONTROLE� Os valores constantes utilizados no switch podem ser do tipo btye; short;

int, long e char (em geral números inteiros) . Exemplo:int a = 2;switch (a){ case 1 : {

cout << "A é igual a 1“ << endl;

cout << "Ok!“ << endl;

break;}

case 2 : {

cout << "A é igual a 2“ << endl;

cout << "Ok!“ << endl;

break;}

case 3 : {

cout << "A é igual a 3“ << endl;

cout << "Ok!“ << endl;

break;}

default : {

cout << "A é diferente de 1,2e3“ << endl;

}

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 70

ESTRUTURAS DE CONTROLE� ESTRUTURA DE REPETIÇÃO – while

� Esta estrutura indica que a instrução ou bloco de instruções (S) que se encontra logo após uma expressão condicional (E) será executado ENQUANTO tal expressão por verdadeira (true) ou seja diferente de zero.while (E)S;

� Quando a última instrução do bloco é executada a expressão (E) seránovamente executada e caso continue verdadeira o bloco seráexecutado mais uma vez, e assim, sucessivamente.

� A fim de evitar que a execução do bloco de instruções (S) execute indefinidamente é necessário que dentro deste bloco o valor da expressão condicional seja em algum momento alterado para falso (false).

� No caso da instrução while, sempre é feito um teste antes da execução do bloco. Dessa forma para que o bloco seja executado, pelo menos uma vez, o resultado da expressão inicialmente seja verdadeiro.

� Ao terminar a repetição a primeira instrução após a instrução while éexecutada.

36

C+ + Orientado a Objetos Flávio de Oliveira Silva 71

ESTRUTURAS DE CONTROLE� ESTRUTURA DE REPETIÇÃO – while

� Exemplo:int a;

a = 0;

//A instrução abaixo fosse executada não permitiria a repetição

//a = 10

while (a < 10)

{

cout << “A ainda é menor que 10!” << endl;

//Sem a instrução abaixo a repetição nunca terminaria

a++;

}

//Primeira instrução a ser executada após o while

cout << “Agora, a é igual a 10!” << endl;

C+ + Orientado a Objetos Flávio de Oliveira Silva 72

ESTRUTURAS DE CONTROLE� ESTRUTURA DE REPETIÇÃO – do / while

� Esta estrutura é semelhante ao while, porém sempre o bloco de instruções (S) será executado pelo menos uma vez. Em seguida a expressão condicional (E) é avaliada e o bloco de instruções seráexecutada ENQUANTO seu valor for verdadeiro.do {

S;

} while (E);� Caso a expressão seja verdadeira a primeira instrução do bloco será

executada novamente� ESTRUTURA DE REPETIÇÃO – for

� Neste caso a repetição e controlada por um contador da seguinte forma:for (C; E; I)

S;� O bloco de instruções S, será executado enquanto a expressão

condicional E, for verdadeira. O contador é inicializado pela expressão Ce a expressão I é responsável por alterar o valor do contador.

37

C+ + Orientado a Objetos Flávio de Oliveira Silva 73

ESTRUTURAS DE CONTROLE� ESTRUTURA DE REPETIÇÃO – for

� Exemplo:int i;for (i = 0; i < 10; i++){

cout << “O contador I ainda é menor que 10!” << endl;

}� No exemplo acima, o contador é um número inteiro i. A instrução

será executada enquanto a expressão for verdadeira (i < 10) e iserá incrementado de 1 em 1.

� No laço pode ser utilizada instrução break que irá finalizar o mesmo desviando o controle para fora do laço for

� A instrução continue desvia o controle para o ínicio do laço for, não executando o restante das instruções do laço. A diferença entre continue e break, é que a instrução continue não finaliza a repetição.

� break e continue podem ser utilizados também com while; do/ while

C+ + Orientado a Objetos Flávio de Oliveira Silva 74

ARRAYS (VETORES)� Importante estrutura de dados. Consiste em um grupo de

“OBJETOS” do mesmo tipo, onde a cada objeto éassociado um “ÍNDICE” único.

� Estes objetos estão armazenados em uma posição contígua da memória. O número de objetos contidos édefinido como sendo o TAMANHO do vetor. A seguir émostrada a sintaxe para a criação de um array.Exemplos: //O código abaixo declara um array de 50 //posições

int iNotas[50];//Na declaração abaixo o tamanho é//calculado pelo compilador

int iPrimos[] = {1, 3, 5, 7, 11};//Cria um array de objetos da classe Circle

Circle aCircle[10];

38

C+ + Orientado a Objetos Flávio de Oliveira Silva 75

ARRAYS (VETORES)� O acesso da cada elemento pode ser feito da seguinte

forma:aNotas[0] = 15 //Primeiro elemento...

aNotas[49] = 34 //Último elemento� Os vetores são estruturas “estáticas”, sendo que uma vez

criados não podem ter o seu tamanho alterado. Porém sua criação é feita de forma dinâmica, durante a execução do código.

� Para um array de comprimento n, seus índices variam de 0 a n-1.

� Um índice equivale a um deslocamento a partir do início do vetor.

� Em c+ + é possível deslocar após o final do vetor. Isto deve ser sempre evitado!!!

C+ + Orientado a Objetos Flávio de Oliveira Silva 76

ARRAYS (VETORES)� Exemplos de manipulação de elementos: É possível manipular

em expressões tanto o índice do vetor, quanto cada elemento.//Soma de elementos

int iSoma = aNotas[0] + aNotas[3] + aNotas[3+1];

int iPrimeiro, iSegundo, iTerceiro, iResultado ;

iPrimeiro = 0;

iSegundo = 1;

iTerceiro = 2;

//adiciona 7 a quarto elemento do vetor (0+1+2=3)

aNotas[iPrimeiro + iSegundo + iTerceiro ] += 7;

iResultado = aNotas[5]/2 + aNotas[3/3]*3

39

C+ + Orientado a Objetos Flávio de Oliveira Silva 77

ARRAYS (VETORES)� O comprimento de um vetor pode ser obtido utilizando-se o

operador sizeof. � O operador sizeof retorna o tamanho em bytes do operando.int iSizeOfInt = sizeof(int);

int iSizeOfCircle = sizeof(Circle);� Para calcular o número de elementos do vetor, basta calcular o

tamanho em bytes do vetor e dividir pelo tamanho de um elemento deste vetor da seguinte forma:

int iArraySize(0);

iArraySize =(sizeof aNotas)/(sizeof aNotas[0]);

iArraySize =(sizeof aCircle)/(sizeof aCircle[0]);

C+ + Orientado a Objetos Flávio de Oliveira Silva 78

ARRAYS (VETORES)� Percorrendo todos os elementos de um vetorint iArraySize(0);

iArraySize =(sizeof aNotas)/(sizeof aNotas[0]);

for (int ii = 0; ii < iArraySize ; ii++){

if (aNotas[ii] >= 60)

cout << “Aprovado" << endl;

else

cout << “Reprovado" << endl;

}

40

C+ + Orientado a Objetos Flávio de Oliveira Silva 79

ARRAYS (VETORES)� VETORES MULTIDIMENSIONAIS – Neste caso cada

elemento do vetor possui mais de um índice associado ao mesmo.

� Uma matriz ou tabela é um vetor de duas dimensões. Neste caso pode ser dito que a informação estáorganizada em linhas e colunas. Exemplo:int aMatriz[2][3];

aMatriz[0][0] aMatriz[0][1] aMatriz[0][2]aMatriz[1][0] aMatriz[1][1] aMatriz[1][2]

C+ + Orientado a Objetos Flávio de Oliveira Silva 80

ARRAYS (VETORES)� Exemplo: Um vetor com três dimensõesint aCuboInteiros[3][3][3];

� Percorrendo todos os elementos de um vetor bidimensional(matriz)for (int i = 0; i < iRowSize; i++)

{

for (int j = 0; j < iColSize; j++)

cout << “Percorrendo a matriz” << endl;

}

41

C+ + Orientado a Objetos Flávio de Oliveira Silva 81

� Em c+ + as sequências de caracters (Strings) são tratadas como um vetor de caracteres, ou seja de elementos do tipo char

� Inicializando um vetor de caractereschar sNome[] = "Flavio", sCurso[4]= "C+ + ";char sLinhaDeTexto[256];

� O tamanho do vetor equivale o número de bytes do mesmo, visto que cada elemento do tipo char, possui um byte.

� Um vetor de caracteres sempre é finalizado pelo caracter NULL ('\0')

� Ao percorrer um vetor de caracteresdeve-se parar esta operação aoencontrar um caracter NULL

ARRAYS (VETORES) DE CARACTERES

[0] = ’C’[1] = ’+’[2] = ’+’[3] = ’\0’[4] = ’?’

C+ + Orientado a Objetos Flávio de Oliveira Silva 82

� O código abaixo mostra como criar um método que éresponsável por “concatenar” dois vetores de caracteres:

//Definição da classe que irá manipular //vetores de caracteres (MyString.h)#define MAX_SIZE 256class MyString {

private:char sData[MAX_SIZE];

public:MyString();MyString(char[]);void append(char sOther[]);int length();void print();

};

ARRAYS (VETORES) DE CARACTERES

42

C+ + Orientado a Objetos Flávio de Oliveira Silva 83

ARRAYS (VETORES) DE CARACTERES//Arquivo MyString.cpp#include <stdio.h>#include "MyString.h"MyString::MyString(){

int ii(0);while (ii < MAX_SIZE){

sData[ii]= ’\0’;ii++;

}}//Construtor que copia uma string para outraMyString::MyString(char pSource[]){int ii(0);while (ii < MAX_SIZE){

sData[ii]= ’\0’;ii++;

}//continua...

C+ + Orientado a Objetos Flávio de Oliveira Silva 84

ARRAYS (VETORES) DE CARACTERES//continuando...

ii=0;

while (sData[ii] = pSource[ii])ii = ii++;

}

int MyString::length(){

int ii(0);

while (sData[ii] != ’\0’){ii = ii++;

}

return ii;

}

void MyString::print(){printf("%s\n", sData);

}

43

C+ + Orientado a Objetos Flávio de Oliveira Silva 85

ARRAYS (VETORES) DE CARACTERES//O método abaixo realiza a junção da string contida

//no objeto MyString com a string pSource

void MyString::append(char pSource[]){int ii(0);

while (sData[ii] != '\0'){

ii = ii++;

}

int jj(ii);ii = 0;

while (pSource[ii] != '\0'){

sData[jj+ii] = pSource[ii];

ii = ii++;

}sData[jj+ii]='\0';

}

C+ + Orientado a Objetos Flávio de Oliveira Silva 86

ARRAYS (VETORES) DE CARACTERES//O código abaixo mostra o uso da classe MyString//Includes necessários#include <iostream> #include "MyString.h"using namespace std; int main (int argc, char *argv[]){

//Cria um objeto da classe MyString MyString str(“TRABALHANDO");//Cria um vetor de caractereschar str2[] = " COM VETORES DE CARACTERES";str.append(str2);//Imprime a string que representa MyString + str2str.print(); cout << "Digite 0 para finalizar..." << endl;int iRet(0);cin >> iRet; return iRet;

}

44

C+ + Orientado a Objetos Flávio de Oliveira Silva 87

� Ponteiro é um tipo de varíavel que contém um endereço de memória.

� Sendo assim, estea varíavel “aponta” para um outra varíavel ou objeto

� O uso de ponteiros é um recurso poderoso da linguagem C+ + . Ponteiros para variáveis podem ser alocados de forma dinâmica, ou seja, durante a execução do programa.

� Como o ponteiro representa o endereço do objeto é mais eficiente passar para um método um ponteiro para aquele objeto do passar uma cópia do objeto, que utiliza maior quantidade de memória.

� Declarando ponteiros: Para declarar um ponteiro basta colocar um * antes entre o tipo e o nome da variável:

int *pValor; //contém o endereço de um intdouble *pCorrente,*pVoltagem;

char* pString;

PONTEIROS

C+ + Orientado a Objetos Flávio de Oliveira Silva 88

� O operador &(endereço de) retorna o endereço de uma varíavel, desta forma para atribuir a um ponteiro um valor énecessário o seguinte código:int iValor(34); //declar um inteiro

int *pValor; //declara um ponteiro

pValor = &iValor; //ponteiro recebe o endereço � Um ponteiro sempre é incializado com um endereço qualquer. É

possível atribuir o valor NULL a um ponteiro desta forma ele não contém nenhum endereço válidochar* pString = NULL;

PONTEIROS

34Endereço1000100110021003

VariáveliValor

pValor

Valor

1000

45

C+ + Orientado a Objetos Flávio de Oliveira Silva 89

� O ponteiro pode apontar para qualquer tipo básico da linguagem e também para objetos de qualquer classe. Sendo assim um ponteiro está sempre associado a algum tipo.

� C+ + suporta um tipo especial de ponteiro, chamado ponteiro void, que pode apontar para objetos de qualquer tipo.void* pQualquer;void* pVetorVariosTipos[32];

� É possível a criação de vetores de ponteiros. Um vetor de ponteiros pode ser manipulado da mesma forma que qualquer outro vetor. Porém o que este vetor contém é endereços de outros objetos

� Para acessar métodos de um ponteiro para um objeto deve ser utilizado operador ponteiro (-> ), conforme mostrado abaixo:

Circle c(3);Circle *pC = &C;p->area();

PONTEIROS

C+ + Orientado a Objetos Flávio de Oliveira Silva 90

� O ponteiro é inicializado com um valor qualquer. Uma outra forma de atribuir um valor a um ponteiro consiste fazer o acesso direto à varíavel que o ponteiro aponta e então realizar a atribuição

� Exemplo de atribuição em um ponteiro:int *pValor; //declara um ponteiro para inteiro

...

*pValor = 34;//Atribui á variavel seu valor� Sempre que colocamos no código *varName estamos

fazendo uma referência direta ao objeto.� Neste caso estamos obtendo o objeto para o qual o ponteiro

aponta.

PONTEIROS

46

C+ + Orientado a Objetos Flávio de Oliveira Silva 91

� A alocação dinâmica de memória é um meio eficiente, porém perigoso, de se trabalhar em C+ + .

� Ao alocar somente a memória necessária o programa utiliza somente a memória que vai efetivamente necessitar.

� A alocação estática, por sua vez, pode trazer problemas, por exemplo: Ao alocar 256 posições de memória para uma string pode acontecer de nunca se utilizar mais que 20 posições ou então pode ocorrer um estouro. Exemplo: char sNom[256];

� Para alocar a memória utiliza-se o operado new, conforme mostrado abaixo:int *pValor = new int;

Circle* pCircle = new Circle(3);

char* sNome = new char[256];� Ao utilizar o operador new , o método construtor do objeto é

automaticamente chamado

ALOCAÇÃO DINÂMICA DE MEMÓRIA

C+ + Orientado a Objetos Flávio de Oliveira Silva 92

� Toda memória alocada pelo programa dever ser necessariamente liberada pelo mesmo!

� Para liberar a memória alocada utiliza-se o operador deleteint *pValor = new int;Circle* pCircle = new Circle(3);

char* sNome = new char[256];...

delete pValor;

delete pCircle;delete sNome;

� As variáveis estáticas, alocadas pelo programa, são liberadas automaticamente, não sendo necessária sua remoção

� Ao utilizar o operador delete, o método destrutor do objeto échamado

ALOCAÇÃO DINÂMICA DE MEMÓRIA

47

C+ + Orientado a Objetos Flávio de Oliveira Silva 93

� Uma referência pode ser entendida com um “apelido” para um objeto

� Após inicializar uma referência, qualquer alteração no objeto e na referência ao mesmo serão percebidas em ambos.

� Abaixo é mostrado como criar uma referência:int iNumber(43);int &iNumberRef = iNumber; //declarando e inicializando

iNumber = 2;

cout << "iNumberRef: " << iNumberRef << endl; //imprime 2

iNumberRef = 3;

cout << "iNumber: " << iNumber << endl; //imprime 3� A referência deve ser sempre inicializada isto pode ser feito

somente uma vez.

REFERÊNCIAS

C+ + Orientado a Objetos Flávio de Oliveira Silva 94

� Um importante uso de referências é a passagem de parâmetros para métodos. O uso de referência permite que o método utilize a variável diretamente e não sua cópia, aumentando a eficiência e economizando memória.

� Sempre que um argumento é passado por referência sua modificação dentro do método será percebida ao sair do mesmo, visto que não há uma cópia e sim uma manipulação direta do objeto.

� Para evitar que uma referência seja modificada dentro de um método pode ser utilizada a palavra reservada constdessa forma mantém-se os benefícios e evita-se a modificação da variável. Neste caso não é permitida a alteração da variável dentro do método, qualquer tentativa será rejeitada pelo compilador

REFERÊNCIAS COM PARÂMETROS

48

C+ + Orientado a Objetos Flávio de Oliveira Silva 95

� O uso de ponteiros como parâmetros também é muito eficiente quando o objeto a ser passado representa uma grande quantidade de memória

� Outro interessante uso do ponteiro ocorre quanto énecessário a modificação do objeto dentro do método.

� Quando um ponteiro é passado para o método, na realidade é passado apenas o endereço de um outro objeto. Sendo assim qualquer modificação dentro do método será refletida no objeto.

PONTEIROS COMO PARÂMETROS

C+ + Orientado a Objetos Flávio de Oliveira Silva 96

� A seguir são mostrados exemplos de protótipos de método que utilizam as várias formas de passagem de parâmetros

� PASSAGEM POR VALOR – Outra cópia é feita; Menos eficiente

� void ClassName::metodo(int);� PASSAGEM POR REFERÊNCIA – O próprio objeto é passado;

alteração dentro do método é refletida fora do mesmo; Mais eficiente

� void ClassName::metod(int&);� PASSAGEM POR REFERÊNCIA CONSTANTE - O próprio

objeto é passado; alteração dentro do método não érefletida fora do mesmo; Mais eficiente

� void ClassName::metod(const int&);� PASSAGEM POR PONTEIRO – O endereço do objeto é

passado; alterações afetam o objeto original� void ClassName::metod(int*);

PASSAGEM DE PARÂMETROS

49

C+ + Orientado a Objetos Flávio de Oliveira Silva 97

� Definição dos métodos na classevoid ClassName::metodoV(int i){i = 10;

}

void ClassName::metodoR(int& i){

i = 20;}

void ClassName::metodoRC(const int& i){

//i = 30; compilador não aceita modificação!

}void ClassName::metodoP(int* i){

*i = 40;

}

PASSAGEM DE PARÂMETROS - EXEMPLO

C+ + Orientado a Objetos Flávio de Oliveira Silva 98

int i(0);int &iRef = i;const int &iConstRef = i;int* pI = &i;ClassName p;p.metodoV(i);cout << "i: " << i << endl; //imprime 0//Passagem por referênciap.metodoR(iRef);cout << "i: " << iRef << endl; //imprime 20//Passagem por referência constantep.metodoRC(iConstRef );cout << "i: " << iConstRef << endl; //imprime 20//Passagem por ponteirop.metodoP(pI);cout << "pI: “ << pI <<endl; //imprime o endereço de icout << "*pI: " << *pI << endl; //imprime 40

PASSAGEM DE PARÂMETROS - EXEMPLO

50

C+ + Orientado a Objetos Flávio de Oliveira Silva 99

� A biblioteca padrão do C+ + oferece uma classe muito útil para a manipulação de sequências de caracteres (strings)

� O nome da classe é string. Para utiliza-la é necessário o seguinte include: #include <string>

� O primeiro caracter da string está na posição 0 e o último na posição .length()-1

� CONSTRUTORES PRINCIPAISstring s1; //Cria uma string vazia

string s2("C++ Orientado a Objetos");

string s3 = "C++";

string s4(s2);//string com 10 posições iguais ao a 'c'

string s5(10,'c');

string s6("Espaço para 32 caracteres",32);

CLASSE STRING

C+ + Orientado a Objetos Flávio de Oliveira Silva 100

� MÉTODOS PRINCIPAISsize_type size() const – Retorna o tamanho da string bool empty() const – Retorna true, caso a string esteja vazia.string substr(size_type pos, size_type n) const – Retorna uma string com n caracteres, iniciando na posição pos.size_type find(const string& str, size_type pos) const – Retorna a posição de inicio, caso a string str esteja inserida no objeto.size_type copy(string *s, size_type n, size_type pos) const- Copia até n elementos da string s, iniciando na posicao pos do objeto.

CLASSE STRING

51

C+ + Orientado a Objetos Flávio de Oliveira Silva 101

� MÉTODOS PRINCIPAISstring& insert(size_type pos, const string *s)- Insere a partir da posição pos a string s

� O operador + pode ser utilizado para concatenar dois objetos da classe string.string s1("C++ "), s2("Orientado a Objetos");s1 = s1 + s2;

//s1 contém "C++ Orientado a Objetos"� O operador = (atribuição) pode ser utilizado com os objetos

da classe stringstring s1("C++ "), s2;s2 = s1 // contém "C++ "

CLASSE STRING

C+ + Orientado a Objetos Flávio de Oliveira Silva 102

string s1; string s2("C++ Orientado a Objetos");string s3 = "ESTUDO";string s4(s2);string s6("Espaço para 32 caracteres",32);//imprime: Tamanho - string s6: 32cout << "Tamanho - s6: " << s6.size() << endl;Tamanho - string s2: 23cout << "Tamanho - s2: " << s2.size() << endl;//imprime: String s1 e vaziaif (s1.empty())cout << "String s1 e vazia\n";

else cout << "String s1 não é vazia\n";

CLASSE STRING - EXEMPLOS

52

C+ + Orientado a Objetos Flávio de Oliveira Silva 103

//continua ...

//imprime: substr de s2: Orientadocout << "substr de s2: " << s2.substr(4,9) << endl;

//insere no final de s3 uma string em branco

s3.insert(s3.length()," ");//insere no final de s3 a string s2

s3.insert(s3.length(),s2);

//imprime:

//s3 apos insert: ESTUDO C++ Orientado a Objetoscout << "s3 apos insert: " << s3 << endl;

CLASSE STRING - EXEMPLOS

C+ + Orientado a Objetos Flávio de Oliveira Silva 104

� A linguagem C+ + possui uma biblioteca padrão que foi criada seguindo os princípos da programação orientada a objetos. Desta forma vários objetos já estão prontos para serem utilizados e incorporados.

� A biblioteca para entrada e saída (I /O) possui uma série de classes que permitem adicionar uma série de funcionalidades aos programas escritos em C+ +

� A biblioteca de entrada e saída(I/O) utilizada pelo C+ + simplifica a sintaxe em relação ao C tradicional.

� Para entrada e saída e utilizado o conceito de uma STREAM de bytes.

� Para utilizar a biblioteca de I/O deve ser utilizado o seguinte include: #include <iostream>

ENTRADA E SAÍDA(I/O)

53

C+ + Orientado a Objetos Flávio de Oliveira Silva 105

� O conceito de Stream pode ser entendido como um fluxo de informação que pode entrar ou sair de um programa para uma fonte de informação que pode ser um arquivo, a memória, o teclado ou o vídeo

� Desta forma a escrita para qualquer um destes meios utiliza-se basicamente a mesmas classes, falicitando seu uso.

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 106

� BUFFER – O buffer consiste em uma área de memória onde as informações são lidas ou escritas. O acesso ao buffer ocorre na velocida da RAM enquanto os dispositivos de entrada e saída (teclado; disco; etc.) trabalham em uma velocidade de acesso muito menor.

� Quando parte de um arquivo é necessária, normalmente um maior volume de informações e lido e transferido para o buffer, quando uma próxima parte desta informação énecessária o seu conteúdo já se encontra no buffer.

� A utilização de um buffer reduz o número de acessos necessários a disco, por exemplo, e desta forma este tipo de i/o é mais eficiente.

� Em C+ + existem buffers do tipo “Unit-buffering” e “Full buffering”. O primeiro tipo armazena a informação em linhas o segundo tipo armazena várias linhas até que as mesmas sejam removidos da memória (flush)

ENTRADA E SAÍDA(I/O)

54

C+ + Orientado a Objetos Flávio de Oliveira Silva 107

� O diagrama de classes abaixo mostra como estão organizadas as classes da biblioteca padrão de entrada e saida. Normalmente, classes que começam com “i” – input; “o” - output

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 108

� Descrição do uso de algumas classes:ENTRADA E SAÍDA(I/O)

Classe Saída(Output) Objetos Descriçãoostream cout, cerr, clog Saída em consoleofstream Saída em arquivo em discoostrstream Saída bufferizada em string

Classe Entrada (Input) Objetos Descriçãoistream cin Entrada em consoleifstream Entrada em arquivo em discoistrstream Entrada bufferizada em string

55

C+ + Orientado a Objetos Flávio de Oliveira Silva 109

� A biblioteca possui alguns objetos globais para lidar com entrada e saída.

� cin – Lê a partir de uma entrada padrão, utilizando um operador de extração . Normalmente a entrada padrão é o teclado.cin >> iValor;

� cout – Escreve na saída padrão utilizando o operador inserção. Normalmente esta saída é a telacout << iValor;

� cerr – Escreve na saída de erros padrão (Unit-buffering)� clog – Escreve na saída de erros padrão (Full buffering)

� Normalmente os objetos cerr e clog estão conectados com o objeto cout , dessa forma todas as saídas são direcionadas para o mesmo local.

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 110

� EXTRAÇÃO DE VALORES – O operador de extração (> > ) retira dados da stream e coloca em variáveis utilizadas pelo programa. Este operador é utilizado para ENTRADA de dadosExemplo: int iA, iB;

double dC;

cin >> iA >> iB >> dC;� No exemplo acima o primeiro inteiro digitado no teclado será

colocado na variável iA em seguida após um < ENTER> , < TAB> , < SPACE> o segundo valor informado será colocado na variável iB e assim por diante;

ENTRADA E SAÍDA(I/O)

56

C+ + Orientado a Objetos Flávio de Oliveira Silva 111

� Métodos principais (classe istream - objeto cin)istream& get(char& ch )- Extrai um caracter simples da stream de entrada.istream& read( char* pch, int iCount )- Extrai um número fíxo de caracteres indicados por iCount que estão presentes em um array de caracteres apontado por pch.istream& getline(char* pch, int iCount, char delim = ’\n’)- Extrai um número fíxo de caracteres e armazena em pch. Os caracteres serão extraídos até que o caracter delim apareça na sequência ou então o número iCount-1 de caracteres seja informadolong setf(long lFlags) – Ajusta a formatação da entrada. O valor lFlags pode ser: ios::left; ios::right; ios::dec; ios::oct; ios::hex; ios::fixed; ios::scientific; etc

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 112

� INSERÇÃO DE VALORES – O operador de inserção (< < ) retira dados variáveis utilizadas pelo programa e os coloca em uma stream. Este operador é utilizado para SAÍ DA de dadosExemplo: int iA(3), iB(4);

double dC(34.3);

cout << iA << iB << dC;� Para facilitar o trabalho com a saída existem alguns

manipuladores� endl Coloca um caracter '\n' na strem de aída em em

seguida descarrega o buffer (flush)� ends Coloca um caracter nulo '\0‘ na stream de saída� flush Descarrega o buffer de saída.

ENTRADA E SAÍDA(I/O)

57

C+ + Orientado a Objetos Flávio de Oliveira Silva 113

� Métodos principais (classe ostream - objeto cout)ostream& put(char ch)- Insere um caracter simples na stream de saída.ostream& write(const char* pch, int iCount)-Insere um número fíxo de caracteres indicados por iCount que estão presentes em um array de caracteres apontado por pch.long setf(long lFlags) – Ajusta a formatação da saida. O valor lFlags pode ser: ios::left; ios::right; ios::dec; ios::oct; ios::hex; ios::fixed; ios::scientific; etc...Para combinar estas flags deve ser utilizado o operador OU Binário (| )

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 114

� Métodos principais – Formatação de streams� Estes métodos são definidos na clase IOSlong setf(long lFlags) – Ajusta a formatação da saida. O valor lFlags pode ser: ios::left; ios::right; ios::dec; ios::oct; ios::hex; ios::fixed; ios::scientific; etc...Para combinar estas flags deve ser utilizado o operador OU Binário (| )long unsetf( long lFlags )- Retira uma ou mais flags de formatação. Os valores da lflags são mostrados acima.int precision( int iPrec )- Ajusta a precisão de número em ponto flutuante. iPrec equivale ao número de dígitos significativos.

ENTRADA E SAÍDA(I/O)

58

C+ + Orientado a Objetos Flávio de Oliveira Silva 115

int width(int iW) – Caso o o tamanho da stream de saída seja menor que iW, o espaço restante será completado com o padrão de preenchimento (' ').char fill( char cFill )- Ajusta o caracter de preenchimento da stream, para o valor informado em cFill.

ENTRADA E SAÍDA(I/O)

C+ + Orientado a Objetos Flávio de Oliveira Silva 116

//Includes necessários

#include <iostream>

#include <string>using namespace std;

int main (int argc, char *argv[]){

//cout imprime uma linha de texto na saida padrão

cout << "Entrada e Saida - Exemplos!" << endl;

int iA, iB;double dC;

cout << "Digite os valores e em seguida tecle <TAB>: " << endl;

cout << "iA" << "\t" << "iB" << "\t" << "dC" << endl;

cin >> iA >> iB >> dC;

//cout << iA << iB << dC << endl;//continua...

ENTRADA E SAÍDA(I/O) - FORMATAÇÃO

59

C+ + Orientado a Objetos Flávio de Oliveira Silva 117

cout << "O Valor iA: " << iA << endl;

cout << "O Valor iB: " << iB << endl;

cout << "O Valor dC: " << dC << endl;double d(34.3423444234424);

int iC(12);

string s("Teste");

//Ajusta a formatação da saída

cout.setf(ios::showpos | ios::scientific | ios::uppercase | ios::hex);cout << "Sinal + para nros positivos; Notacao cientifica; Caracter Maisuculo em nros!" << endl;

cout << "iC: " << iC << endl; //iC: 12

cout << "d: " << d << endl; //d: +3.434234E+001

cout << "s: " << s << endl; //d: +3.434234E+001

//continua...

ENTRADA E SAÍDA(I/O) - FORMATAÇÃO

C+ + Orientado a Objetos Flávio de Oliveira Silva 118

//Retira a o Maiusculocout.unsetf(ios::uppercase);cout << "Sinal + para nros positivos; Notacao cientifica!" << endl;cout << "iC: " << iC << endl; //iC: 12cout << "d: " << d << endl; //d: +3.434234e+001cout << "s: " << s << endl; //s: Teste//Ajusta a precisão - ponto flutante 7 dígitoscout << "Ajuste de precisao" << endl;cout.unsetf(ios::scientific);cout.precision(7);cout << "d: " << d << endl; //d: +34.34234//Retira o decimal e Coloca valor em hexadecimal nos //números inteiroscout.unsetf(ios::dec);cout.setf(ios::hex);//continua...

ENTRADA E SAÍDA(I/O) - FORMATAÇÃO

60

C+ + Orientado a Objetos Flávio de Oliveira Silva 119

cout << "Valores HexaDecimais em inteiros; sem notacao cientifica" << endl;cout << "iC: " << iC << endl; //iC: ccout << "d: " << d << endl; //d: +34.34234cout << "s: " << s << endl; //s: Teste//ajusta o tamanho do campo em 12cout.width(18);//ajusta o caracter de saida para ’*’cout.fill(’*’);cout << "iC: " << iC << endl; //**************iC: ccout << "d: " << d << endl; //d: +34.34234cout << "s: " << s << endl; //s: Testecout << "Digite 0 para finalizar..." << endl;int iRet(0);cin >> iRet; return iRet;

}

ENTRADA E SAÍDA(I/O) - FORMATAÇÃO