DE JAVA AO C++ Prof. Cesar Augusto Tacla - dainf.cefetpr.brtacla/CPPProgFund/0010-IntroCPP.pdf ·...
Transcript of DE JAVA AO C++ Prof. Cesar Augusto Tacla - dainf.cefetpr.brtacla/CPPProgFund/0010-IntroCPP.pdf ·...
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();
}
#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)
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
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;
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
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