de java ao c++ prof. cesar augusto tacla - dainf.cefetpr.brtacla/cppprogfund/0010-introcpp.pdf ·...

56
DE JAVA AO C++ Prof. Cesar Augusto Tacla UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ PR Prof. Cesar Augusto Tacla http://www.dainf.ct.utfpr.edu.br/~tacla JAVAProgParSD/0030-ProgParalelaDistribuida.ppt

Upload: trinhhanh

Post on 10-Nov-2018

238 views

Category:

Documents


0 download

TRANSCRIPT

DE JAVA AO C++

Prof. Cesar Augusto Tacla

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁPR

Prof. Cesar Augusto Taclahttp://www.dainf.ct.utfpr.edu.br/~tacla

JAVAProgParSD/0030-ProgParalelaDistribuida.ppt

Sumário

1. Diferenças básicasa. Método main com Hello Worldb. Classe e instanciaçãoc. Herança, sobrecarga e sobreposição

2. Ponteirosa. Conceitob. Ponteiros em C++

22De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

b. Ponteiros em C++c. Ponteiros e arraysd. Passagem de argumentos

Sumário

Método main com Hello World

1 a

33De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

HELLO WORLD

#include <iostream>

using namespace std;

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

cout << "Hello World\n";

cout << "Argumentos\n";

// Imprime argumentos...

44De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

// Imprime argumentos...

if (argc > 1) {

for (int i = 0; i < argc; i++) {

cout << i << ": " << argv[i] << "\n";

}

}

getchar();

return 0;

}

HELLO WORLD

◊ Para rodar um programa no Windows� Procurar o programa DEV CPP, c� Montar projeto� Compilar e executar

◊ No Linux� Abrir shell

55

� Abrir shell� g++ hello.cpp –o hello.exe

De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

EXERCÍCIO

◊ Quais as diferenças do programa do slide anterior em relação a um equivalente em Java?

◊ Execute o programa fazendo:>hello “meu nome eh” Joaquim� Anote o resultado produzido

66De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� Compare com uma implementação em Java

◊ solução

TIPOS DE DADOS

◊ Alguns tipos de dados� char 1 byte [-128, 127]� short int 2 bytes [-32.768, 32.678]� int 4 bytes [-2.147.483.648, 2.147.483.647]� float 4 bytes [3.4x10-38, 3.4x1038] precisão de 7 dígitos� double 8 bytes [1.7x10-308, 1.7x10308] precisão 15 dígitos� long double 12 bytes [3.4 x10-4934, 1.1x104934] precisão 19 dígitos

77De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� long double 12 bytes [3.4 x10-4934, 1.1x104934] precisão 19 dígitos

◊ Unsigneds� unsigned char� unsigned int� unsigned long

TIPOS DE DADOS: TAMANHO EM BYTES

#include <iostream>

using namespace std;

int main() {

cout << sizeof(char) << endl;

cout << sizeof(short int) << endl;

88De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

cout << sizeof(int)<< endl;

cout << sizeof(float) << endl;

cout << sizeof(double) << endl;

cout << sizeof(long double) << endl;

getchar();

}

Sumário

Classe e instanciação

1 b

99De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

#include <iostream>

using namespace std;

class Contador {

private:

unsigned int cont;

public:

Contador() { cont=0;}

Contador(int ini) {cont=ini;}

// destrutora nao aceita parametros

~Contador() {cout << "destrutora";}

void incr() {cont++;}

void decr() {cont--;}

CLASSE EM C++

DESTRUTORA

VISIBILIDADE

1010De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

void decr() {cont--;}

int get() {return cont;}

};

int main() {

Contador a, b(5); // instancia dois objetos

a.incr();

b.decr();

cout << "a=" << a.get() << " b=" << b.get() << endl;

a.~Contador(); // destroi objeto a

b.~Contador(); // destroi objeto b

getchar();

}

= NEW

CLASSE EM C++

◊ Em C++, normalmente divide-se uma classe em dois arquivos:� Header file: .h� Class file: .cpp

1111De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

CLASSE EM C++

◊ Exemplo: classe carro dividida em dois arquivos, Carro.h, Carro.cpp, e utilizada no main.cpp

class Carro {

private:

int ano;

Carro.h

Valor default

1212De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

int ano;

char placa[8];

public:

Carro(int ano_, char* placa_ = "AAA0000");

int calcular_idade(int ano_atual);

int obter_ano();

char* obter_placa();

};

Somente os cabeçalhosdos métodos

Valor default

CLASSE EM C++

#include "Carro.h"

#include <string.h>

Carro::Carro(int ano_, char* placa_) {

ano = ano_;

strcpy(placa, placa_);

}

Carro.cpp

Corpos dos métodos definidos externamente à Classe: observar o nome da classe em vermelho

1313De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

}

int Carro::calcular_idade(int ano_atual) {

int idade;

idade = ano_atual - ano;

return idade;

}

int Carro::obter_ano() {

return ano;

}

char* Carro::obter_placa() {

return placa;

}

Construtoras

INSTANCIAÇÃO

#include <cstdlib>

#include <iostream>

#include "Carro.h"

using namespace std;

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

{

int ano;

cout << "Informe o ano atual: " << endl;

cin >> ano;

main.cpp

1414De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

cin >> ano;

Carro corsa(2004);

Carro meriva(2006, "AXL1020");

cout << corsa.calcular_idade(ano) << endl;

cout << meriva.calcular_idade(ano) << endl;

system("PAUSE");

return EXIT_SUCCESS;

}

Carro meriva(2006, “AXL1020”) em C++equivale à

Carro meriva = new Carro(2006, “AXL1020”) em JAVA

CLASSE EM C++

◊ Arquivos

prog.cpp

prog.h

biblio.h

#include “prog.h”

#include <biblio.h>Busque na pasta include < >

Diretiva ao compilador: “ “

busque na pasta atual

1515De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

#include <biblio.h>

compilador

biblio.libprog.obj

linker

prog.exe

CIN >> e COUT<<

#include <stdio.h>

#include “Carro.h"

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

{

int ano;

cout << "Informe o ano atual: " << endl;

cin >> ano;

Carro corsa(2004);

main.cpp

1616De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

Carro corsa(2004);

Carro meriva(2006, "AXL1020");

cout << corsa.obter_placa() << " anos: " <<

corsa.calcular_idade(ano) << endl;

cout << meriva.obter_placa() << " anos: " <<

meriva.calcular_idade(ano) << endl;

system("PAUSE");

return EXIT_SUCCESS;

}

cin >> var>> operator get fromcin = standard input stream

cout << var<< operador insertioncout = standard output stream

EXERCÍCIO 1

◊ Na página do curso, localizar CPPRepositorio/Intro/Carro/◊ Executar Carro.exe◊ Observar a instanciação do corsa e compreender a

definição do valor default para a placa na construtora de carro

1717De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

EXERCÍCIO 2

◊ Fazer uma classe Pessoa em dois arquivos: .h e .cpp � Atributos privados:

� Nome completo� Sexo (masculino ou feminino)� Dia, mês e ano de nascimento

� Métodos públicos� Pessoa(nome, sexo, dia, mês, ano)

� Por default, sexo=‘m’, dia=1, mês=1, ano=1970� obter_descricao() retorna

“<nome>, [homem|mulher], nasceu em dd/mm/aa”

1818De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� obter_descricao() retorna “<nome>, [homem|mulher], nasceu em dd/mm/aa”

� Fazer um setter para dia, mês e ano que faça consistência dos dias em função dos meses

� Fazer um setter para sexo que só aceita ‘m’ ou ‘f’, caso contrário não efetua o set

◊ Em um arquivo main.cpp,� Instanciar uma mulher com data de nascimento� Instanciar um homem com valores default� Imprimir as descrições na tela.

Sumário

Herança, sobrecarga e sobreposição

1 c

1919De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

HERANÇA

◊ Este exemplo mostra Veículo (classe base) e uma classe derivada, Carro. Observar que o mecanismo é idêntico ao Java:� Atributos privados não são herdados pelas classes derivadas, por

isso ano e placa são protegidos

� A construtora da classe base é chamada implicitamente pela

2020De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� A construtora da classe base é chamada implicitamente pela construtora da classe derivada

◊ Diferença sintática em relação à JAVA� Para acessar um método da classe base no código da derivada,

utilizar a notação <Classe base>::<método>� Java: super.<método>

HERANÇA e SOBRECARGA

class Veiculo {

protected:

int ano;

char placa[8];

int calcular_idade(int ano_atual) {

int idade;

idade = ano_atual - ano;

return idade;

}

void mostrar() {

cout << "Placa: " << placa << " ano: " << ano

2121De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

cout << "Placa: " << placa << " ano: " << ano

<< " idade: " << calcular_idade(2008);

}

public:

Veiculo(){

ano = 1970;

strcpy(placa, "AAA0000");

}

Veiculo(int ano_, char* placa_) { // SOBRECARGA

ano = ano_;

strcpy(placa, placa_);

}

};

HERANÇA e SOBREPOSIÇÃO

class Carro : public Veiculo { // carro estende publicamente a classe Veículo

private:

int num_passageiros;

int num_cavalos;

bool importado;

protected:

float calcular_ipva(){

float base;

base = (float)num_passageiros*num_cavalos/calcular_idade(2008);

if (importado)base = base * 2.0;

return base;

}

Equivale aoextends em Java

2222De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

public:

Carro(int p, int c, bool i) {

num_passageiros = p;

num_cavalos = c;

importado = i;

}

void mostrar() { // sobrepõe o método da classe base

Veiculo::mostrar(); // chama o mostrar() da classe base

cout << "\ncavalos : "

<< num_cavalos << " passageiros: " << num_passageiros

<< "\nipva: " << calcular_ipva() << endl;

}

};

Fonte: CPPRepositorio/Intro/VeiculoHeranca

HERANÇA e ACESSIBILIDADE

◊ Carro estende publicamente a classe Veiculo. Outra opção é estender de forma privada (default)� Public significa que os métodos de Carro somente podem acessar os

membros públicos e protegidos da classe Veículo. Se estendesse de forma privada, também poderia acessar os mesmos membros.

◊ Acessos fora da classe (ex. na main) somente podem acessar os membros públicos de Veículo.

2323De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

membros públicos de Veículo. � Se a extensão for private, nada é acessível

HERANÇA e ACESSIBILIDADE

◊ No exemplo, calcular_idade(int) de Veículo não é acessível a partir da função main por ser definido como protected.

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

{

Carro c(6, 130, true);

c.calcular_idade(2008); // esta linha dah erro de acessibilidade

2424De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

c.calcular_idade(2008); // esta linha dah erro de acessibilidade

c.mostrar();

system("PAUSE");

return EXIT_SUCCESS;

}

HERANÇA E ACESSIBILIDADE

private

protected

public

Class Base

class D1: public Base class D2: private Base

2525De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

private

protected

public

private

protected

public

D1 obj1

Em um método/função fora do corpo da classe

D2 obj2Não permitido

HERANÇA

◊ Algumas diferenças entre C++ e JAVA� C++ permite herança múltipla

� class C : public A, public B

� C é especialização de A e B

� C++ permite sobrecarga de operadores� Exemplo próximo slide

2626De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� Exemplo próximo slide� operator é uma palavra reservada

SOBRECARGA DE OPERADORES#include <iostream>

using namespace std;

class Contador {

private:

unsigned int cont;

public:

Contador() { cont=0;}

Contador(int ini) {cont=ini;}

int get() {return cont;}

// sobrecarga pré-fixada

int operator ++ () { return ++cont; }

// sobrecarga pós-fixada; int nao eh um arg verdadeiro

2727De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

// sobrecarga pós-fixada; int nao eh um arg verdadeiro

int operator ++ (int) { return cont++; };

};

int main() {

Contador a, b(5); // instancia dois objetos

int x, y;

x = ++a;

cout << "a=" << a.get() << " x=" << x << endl;

y = b++;cout << “b=" << b.get() << " y=" << y << endl;

}

EXERCÍCIO

◊ Fazer duas especializações da classe Pessoa:� Aluno

� Atributos: curso e universidade� Ano de ingresso� Sobrescrever o método obter_descrição: � “<nome>, [homem|mulher], nasceu em dd/mm/aa, cursa<curso> desde <ano de ingresso>”

2828De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� Professor� Universidade� Ano de contratação� Sobrescrever o método obter_descrição: “<nome>, [homem|mulher], nasceu em dd/mm/aa, professor da <universidade> desde <ano de ingresso>”

EXERCÍCIO

◊ Criar uma classe Turma para fazer o relacionamento entre Alunos e Professores por meio de uma classe associativa� Um aluno tem aulas com vários professores� Um professor leciona para vários alunos

◊ Esta classe deve permitir listar

2929De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

◊ Esta classe deve permitir listar� Todos os aluno s que um professor tem ou teve e quando

(semestre/ano)� Todos os professores que um aluno tem ou teve e quando

(semestre/ano)

Sumário

PONTEIROS

2

3030De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

PONTEIROS

Sumário

CONCEITO

2 a

3131De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

PONTEIROS: UTILIDADES

◊ Acessar elementos de um array

◊ Passar argumentos para um método quando este necessita modificar o argumento original

◊ Passar arrays e strings para métodos

3232De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

◊ Passar arrays e strings para métodos

◊ Obter memória do sistema

◊ Criar estruturas de dados, tais como listas encadeadas

CONCEITO

◊ Idéia básica: todo byte na memória do computador tem um endereço; endereços são números que identificam os bytes da memória.

Memória 1 GB0

655.601 = 0xA00F1var 1 shor

Área de memória ocupada pelo programa

endereçoconteúdo

x bin dec0 = 0000 = 01 = 0001 = 12 = 0010 = 23 = 0011 = 3

3333De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

programa

1.073.741.823

655.602 = 0xA00F2

655.603 = 0xA00F3

655.604 = 0xA00F4

655.605 = 0xA00F5

655.606 = 0xA00F6

655.607 = 0xA00F7

655.608 = 0xA00F8

655.609 = 0xA00F9

655.610 = 0xA00FA

var 1

var 2 char

var 3 int

var 3

var 3

var 3

3 = 0011 = 34 = 0100 = 45 = 0101 = 56 = 0110 = 67 = 0111 = 78 = 1000 = 89 = 1001 = 9A = 1010 = 10B = 1011 = 11C = 1100 = 12D = 1101 = 13E = 1110 = 14F = 1111 = 15

Ox indica notaçãoem hexadecimal

OPERADOR &

◊ Operador & retorna o endereço ocupado por uma variável

◊ Endereço é diferente de conteúdo

◊ Digite e execute o programa abaixo

#include <iostream>

using namespace std;

3434De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

int main() {

int a = 16;

int b = 32;

int c = 64;

cout << "end. de a: " << &a << endl;

cout << "end. de b: " << &b << endl;

cout << "end. de c: " << &c << endl;

getchar();

}

OPERADOR &

◊ Resultado do programa anterior� endereco valor

� a: 0x22ff74 16

� b: 0x22ff70 32

� c: 0x22ff6c 64

0x22FF6c

0x22FF70

0000 0000

0000 0000

0000 0000

0100 0000

0000 0000

Área de memória ocupada pelo programa

endereçoconteúdo

c = 64

b = 32

4 bytes

3535De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

0x22FF70

0x22FF74

0000 0000

0000 0000

0000 0000

0010 0000

0000 0000

0000 0000

0000 0000

0001 0000

b = 32

a = 16

Conteúdo em binário

◊Observar que a diferença entre os endereços é de 4 bytes. Por que?

PONTEIRO

◊ Ponteiro é uma variável que armazena um endereço de uma variável

◊ Exemplo: “p” aponta para a variável “a”

0x22FF6c

0x22FF70

0000 0000

0000 0000

0000 0000

0100 0000

0000 0000

Área de memória ocupada pelo programa

endereçoconteúdo

c

b

3636De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

variável “a”

◊ Qual o conteúdo da variável p?

0x22FF70

0x22FF74

0000 0000

0000 0000

0000 0000

0010 0000

0000 0000

0000 0000

0000 0000

0001 0000

0x 0 0

0x 2 2

0x F F

0x 7 4

b

a

p

0x22FF78

Sumário

PONTEIRO EM C++

2 b

3737De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

PONTEIRO EM C++

#include <iostream>

using namespace std;

int main() {

int a = 16;

int b = 64;

cout << "endereco\tvalor" << endl;

cout << "a: " << &a << "\t" << a << endl;

cout << "b: " << &b << "\t" << b << endl;

Declaração de uma variável tipo ponteiro para inteiro

3838De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

cout << "b: " << &b << "\t" << b << endl;

int* p; // ponteiro para inteiro

p = &a;

cout << "ponteiro: " << p << endl;

p = &b;

cout << "ponteiro: " << p << endl;

getchar();

}

SINTAXE DE DECLARAÇÃO DE PONTEIROS

char* cptr;

int* iptr;

float* fptr;

Contador* contptr;

char *cptr;

int *iptr;

As duas formas sãoválidas

3939De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

int *iptr;

float *fptr;

Contador *contptr;

//Declaração de vários ponteiros na mesma linha

char *p1, *p2, *p3;

Mais utilizada

OPERADOR DE INDIREÇÃO

◊ Operador de indireção *

serve para acessar o conteúdo apontado por um ponteiro

0x22FF6c

0x22FF70

0000 0000

0000 0000

0000 0000

0100 0000

0000 0000

Área de memória ocupada pelo programa

endereçoconteúdo

c

b

4040De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

0x22FF70

0x22FF74

0x22FF78

0000 0000

0000 0000

0000 0000

0010 0000

0000 0000

0000 0000

0000 0000

0001 0000

0x0 0

0x2 2

0xF F

0x7 4

b

a = 16

p

*p

o valor retornado por *p é 16

OPERADOR DE INDIREÇÃO

#include <iostream>

using namespace std;

int main() {

int a = 16;

int b = 64;

cout << "valor de p\tconteudo apontado" << endl;

int* p; // ponteiro para inteiro

4141De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

int* p; // ponteiro para inteiro

p = &a;

cout << p << "\t" << *p << endl;

p = &b;

cout << p << "\t" << *p << endl;

getchar();

}

*p é o conteúdo do endereço apontado por p; este conteúdoé interpretado como um número inteiro por causa do tipo doponteiro (int*)

OPERADOR DE INDIREÇÃO

◊ operador * serve para acessar o conteúdo apontado por um ponteiro e também modificá-lo.

0x22FF6c

0x22FF70

0000 0000

0000 0000

0000 0000

0100 0000

0000 0000

Área de memória ocupada pelo programa

endereçoconteúdo

c

b

4242De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

0x22FF70

0x22FF74

0x22FF78

0000 0000

0000 0000

0000 0000

0010 0000

0000 0000

0000 0000

0000 0000

0000 1111

0x0 0

0x2 2

0xF F

0x7 4

b

a = 15

p

*p

*p = 15 //atribuição de valor

O endereço apontado por precebe o valor 15

OPERADOR DE INDIREÇÃO

#include <iostream>

using namespace std;

int main() {

int a = 16;

int b = 64;

cout << "valor de p\tconteudo apontado" << endl;

int* p; // ponteiro para inteiro

4343De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

int* p; // ponteiro para inteiro

p = &a;

*p = 15; // idêntico: a=15

cout << p << "\t" << *p << endl;

b = *p; // idêntico: b=a

cout << p << "\t" << *p << endl;

getchar();

}

PONTEIRO PARA VOID

◊ O endereço colocado num ponteiro deve ser de uma variável de mesmo tipo do ponteiro

◊ Exemplo:� int a;

� int* p = &a;

4444De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� char* pc = &a; // ERRO

◊ void *p é uma ponteiro que pode apontar para qualquer tipo de dado

EXERCÍCIOS

1. Faça um programa que atribua um endereço de uma variável inteira1. a um ponteiro para float2. a um ponteiro para void

2. Marque a opção correta: um ponteiro é...1. Um endereço de uma variável2. Uma variável que armazena um endereço3. Um tipo de dado de uma variável de endereço

4545De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

3. Um tipo de dado de uma variável de endereço

3. O código seguinte está correto/errado quanto à lógica?1. int i = 30;2. int* ptr;3. cout << *ptr;

4. Qual a diferença entre as seguintes declarações:1. int *ptr;2. *ptr = 10;

Sumário

PONTEIROS E ARRAYS

2 c

4646De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

PONTEIROS E ARRAYS

#include <iostream>

using namespace std;

int main() {

int a[5]={1,2,3,5,8};

// acesso normal

for (int i=0; i<5; i++)

4747De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

for (int i=0; i<5; i++)

cout << a[i] << " ";

cout << endl << endl;

// acesso por ponteiro

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

cout << *(a+j) << " ";

getchar();

}

a variável a é umponteiro parainteiro

ar[j] similar int *(a+j);

PONTEIROS E ARRAYS

◊ No exemplo anterior, inclua abaixo da linha indicada pela linha seguinte:� cout << a << endl;

◊ Em seguida, coloque� cout << *a << endl;

4848De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

◊ Agora, coloque� cout << a+1 << endl; � e compare como valor obtido pela primeira linha

◊ Finalmente coloque� cout << *(a+1) << endl;

CPPRepositorio/Ponteiros/PonteirosArrays.cpp

PONTEIROS E ARRAYS

◊ Exercício: dado um vetor de char de tamanho qualquer, imprima-o invertido utilizando ponteiro.� Exemplo:

A B A C A T E \0

E T A C A B A \0

4949De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

Sumário

PASSAGEM DE ARGUMENTOS

2 d

5050De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

PASSAGEM DE ARGUMENTOS

◊ Argumentos podem ser passados aos métodos por 3 maneiras distintas:

� Por valor: uma cópia do valor da variável é passado ao método� o valor da variável original não é modificado � Existe em JAVA

� Por referência: o endereço da variável é passado ao método

5151De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� Por referência: o endereço da variável é passado ao método � o valor da variável original é modificado� Alias� Existe em JAVA

� Por ponteiro: o endereço da variável é passado ao método � o valor da variável original é modificado� Ponteiro� NÃO EXISTE EM JAVA

PASSAGEM POR REFERÊNCIA

// Este programa ilustra passagem de argumentos

// por referencia. Observar que o argumento

// r em paraSegundos e a variavel h sao

// simbolos alternativos (alias) e portanto sao a mesma

// coisa.

#include <iostream>

using namespace std;

void paraSegundos(int &r) {

cout << "endereco r = " << &r << endl;

r = r*3600;

5252De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

r = r*3600;

}

int main() {

int h = 5;

cout << "endereco h = " << &h<< endl;

cout << "h = " << h << endl;

paraSegundos(h); // passa a referencia da var h na tabela

// de simbolos (indice)

cout << "h = " << h << endl;

getchar();

}CPPRepositorio/Ponteiros/PassagemRef.cpp

PASSAGEM POR REFERÊNCIA

Referência Símbolo Endereço Conteúdo

1 h alias r 0x22FF74 5 (inteiro)

2 ... ...

... ... ...

Tabela de símbolos

5353De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

r e h são dois símbolos alternativos

r aliás h = r, de outra forma, h

PASSAGEM POR PONTEIRO

// Este programa ilustra passagem de argumentos

// por ponteiro. Observar que o argumento

// r em paraSegundos e a variavel h sao

// simbolos que apontam para o mesmo endereco, mas

// ocupam posicoes distinas na memoria.

#include <iostream>

using namespace std;

void paraSegundos(int *r) {

cout << "endereco r = " << &r << endl;

5454De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

*r = *r * 3600;

}

int main() {

int h = 5;

cout << "endereco h = " << &h<< endl;

cout << "h = " << h << endl;

paraSegundos(&h); // passa o endereco de h

cout << "h = " << h << endl;

getchar();

}

CPPRepositorio/Ponteiros/PassagemPonteiro.cpp

PASSAGEM POR PONTEIRO

Referência Símbolo Endereço Conteúdo

1 h 0x22FF74 5 (inteiro)

2 r 0x22FF50 0x22FF74

... ... ...

Tabela de símbolos

5555De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

r e h são dois símbolos diferentes, cada um ocupa uma posiçãode memória.

r é um ponteiro que aponta para h

PONTEIROS E ARRAYS

◊ Exercício� crie uma FILA de encadeamento simples para armazenar objetos da

classe pessoa. Um objeto da classe Pessoa aponta para o próximo da lista. O último aponta para NULL.

◊ A fila deve ser uma classe com os métodos� Incluir (sempre depois do last)

5656De Java ao C++ - Fundamentos/UTFPR Prof. Cesar Augusto Tacla

� Incluir (sempre depois do last)� Imprimir do first ao last

:Pessoa

nome: “João”

:Pessoa

nome: “José”

:Pessoa

nome: “Maria”NULL

first last

CPPRepositorio\Ponteiros\ListaPessoa