Buscar

0-POO em C++

Prévia do material em texto

Programação Orientada a Objetos
Jorge Campos
jorge@unifacs.br
Conceitos Básicos em C++
Problema 1
Escreva um programa que solicite dois números inteiros e imprima o menor deles.
2
Solução Problema 1
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
 int i,j; // variáveis para armazenar os números a serem testados
 int menor; // variável para guardar o resultado
 // leitura dos dados
 cout<<"Informe dois números"<<endl;
 cin>>i;
 cin>>j;
 // cálculos
 if (i<j) 
	menor=i;	
 else 
	menor=j;
 // impressão do resultado
 cout<<"Menor número="<<menor<<endl; 
 return 0;
}
Funções
Conjunto de comandos agrupados em um bloco de programação que recebe um nome e através deste pode ser evocado.
Sintaxe das funções
Tipo_de_retorno nome_da_função (Lista de argumentos)
Tipo_de_retorno – qualquer tipo definido na linguagem 
			void – não retorna nada
Nome_da_função – Nome válido
Lista de argumentos – Devem ser explicitadas como se tivéssemos definindo variáveis
Solução Problema 1 com Funções (1)
#include <cstdlib>
#include <iostream>
using namespace std;
int min(int a, int b) {
 if (a<b)
 return a;
 return b;
}
int main(int argc, char** argv) {
 int i,j; // variáveis para armazenar os números a serem testados
 int menor; // variável para guardar o resultado
 // leitura dos dados
 cout<<"Informe dois números"<<endl;
 cin>>i;
 cin>>j;
 // cálculos
 menor=min(i,j);	
// impressão do resultado
 cout<<"Menor número="<<menor<<endl; 
 return 0;
}
Implementação da função
Chamada da função
Solução Problema 1 com Funções (2)
#include <cstdlib>
#include <iostream>
using namespace std;
int min(int,int);
int main(int argc, char** argv) {
 int i,j; // variáveis para armazenar os números a serem testados
 int menor; // variável para guardar o resultado
 // leitura dos dados
 cout<<"Informe dois números"<<endl;
 cin>>i;
 cin>>j;
 // cálculos
 menor=min(i,j);	
// impressão do resultado
 cout<<"Menor número="<<menor<<endl; 
 return 0;
} 
int min(int a, int b) {
 if (a<b)
 return a;
 return b;
}
Declaração da função
Implementação da função
Chamada da função
Solução Problema 1 com Funções (3)
#include <cstdlib>
#include <iostream>
#include “minhasfunções.h”
using namespace std;
int main(int argc, char** argv) {
 int i,j; // variáveis para armazenar os números a serem testados
 int menor; // variável para guardar o resultado
 // leitura dos dados
 cout<<"Informe dois números"<<endl;
 cin>>i;
 cin>>j;
 // cálculos
 menor=min(i,j);	
// impressão do resultado
 cout<<"Menor número="<<menor<<endl; 
 return 0;
} 
Inclusão da função da biblioteca com as minhas funções
Chamada da função
Declaração e Implementação das funções ???
Implementação de Bibliotecas em C++
Classes, tipos estruturados e funções em C++ são geralmente definidas em dois arquivo separados.
arquivo.h
	Definição da classe/struct
	Especificação dos atributos
	Definição das funções membro (métodos)
	Definição de funções “globais” 
arquivo.cpp
	Especificação das funções (implementação das funções)
Implementação de Bibliotecas em C++
Funções em C++ são geralmente definidas em dois arquivo separados.
minhasfuncoes.h
#ifndef MINHASFUNCOES_H
#define MINHASFUNCOES_H
int min(int,int);
#endif /* MINHASFUNCOES_H */
minhasfuncoes.cpp
#include "minhasfuncoes.h"
int min(int a, int b) {
 if (a<b)
 return a;
 return b;
}
Problema 2
Escreva um programa que leia os dados de um círculo e um ponto no plano cartesiano. O seu programa deverá imprimir a área e o perímetro do círculo e dizer se o ponto informado está dento ou fora do círculo.
Y
X
(xc,yc)
(xp,yp)
raio
Solução Problema 2 (1)
#include <cstdlib>
#include <iostream>
#include <cmath>
int main(int argc, char** argv) {
 // Variáveis (representação das entidades)
 float xc,yc,raio; // o circulo
 float xp,yp; // o ponto
 float area, perímetro; // resultado do processamento
 // leitura dos dados
 cout<<"Informe as coordenadas X e Y do centro do círculo"<<endl;
 cin>>xc;
 cin>>yc;
 cout<<"Informe o raio do círculo"<<endl;
 cin>>raio;
 cout<<"Informe as coordenadas X e Y do ponto"<<endl;
 cin>>xp;
 cin>>yp;
Solução Problema 2 (1)
Cálculo da área e do perímetro
Y
X
(xc,yc)
raio
Área = π · raio2
Perímetro = 2 · π · raio
Solução Problema 2 (1)
 // cálculo da área e do perímetro
 area= M_PI * pow(raio,2);
 perimetro= 2*M_PI*raio;
 // impressão da área e do perimetro
 cout<<"Area="<<area<<endl;
 cout<<"Perimetro="<<perimetro<<endl;
Solução Problema 2 (1)
Teste de inclusão (o ponto está dentro ou fora do círculo?)
Y
X
(xc,yc)
(xp,yp)
raio
dist=?
(xc,yc)
(xp,yp)
xP-xc
yP-yc
dist=?
 
dist <= raio (o ponto está dentro)
dist > raio (o ponto está fora)
Solução Problema 2 (1)
 // teste de inclusão
 float dist;
 dist=sqrt( pow(xc-xp,2) + pow(yp-yc,2) );
 if (dist<=raio)
	cout<<“o ponto está dentro<<endl;
 else 
	cout<<“o ponto está fora<<endl;
 return 0;
}
Variáveis e a Memória 
// Variáveis de tipos básicos
int i;
float f;
char c;
bool b;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
Variáveis e a Memória 
// Variáveis de tipos básicos
int i;
float f;
char c;
bool b;
...
i=5;
f=2.7;
c=‘J’;
b=true;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
Variáveis e a Memória 
// Variáveis de tipos básicos
int i;
float f;
char c;
bool b;
...
i=5;
f=2.7;
c=‘J’;
b=true;
																														
													5																	
																														
																								true						
																														
																														
																														
							2.7																							
																														
																														
								J																						
																														
																														
																														
																														
Variáveis e a Memória 
// Variáveis de tipos básico
float xc,yc,raio; // o circulo
float xp,yp; // o ponto
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
cout<<"Informe ...
cin>>xc;
cin>>yc;
cout<<"Informe ...
cin>>raio;
cout<<"Informe ...
cin>>xp;
cin>>yp;
...
area= M_PI * pow(raio,2);
perimetro= 2*M_PI*raio;
Tipo de Dados Estruturados
float xp,yp; // o ponto
// uma instância de um ponto
xp=5;
yp=3;
Tipos de dados estruturados (struct) é um recurso da linguagem C/C++ para agrupar variáveis utilizadas para modelar entidades do mundo real ou conceitual que não são representas através de um único tipo básico.
Geralmente, utiliza-se struct em conjunto com o operador typedef para a criação de um novo tipo de dado nalinguagem.
typedef struct {
	float x,y;
} Ponto;
...
Ponto p; // o ponto
// uma instância de um ponto
p.x=5;
p.y=3;
Definição de um novo tipo na linguagem para modelar o 
conceito matemático de um ponto no plano cartesiano.
20
Tipo de Dados Estruturados no Problema 2
float xc,yc,raio; // o circulo
// uma instância de um círculo
xc=4;
yc=2;
raio=3;
typedef struct {
	float x,y;
} Ponto;
typedef struct {
	Ponto centro;
	float raio;
} Circulo;
..
Circulo c; // o circulo
// uma instância de um círculo
c.centro.x=4;
c.centro.y=2;
c.raio=3;
21
Funções no Problema 2
 // cálculo da área e do perímetro
 area= M_PI * pow(c.raio,2);
 perímetro= 2*M_PI*c.raio;
float area(Circulo circ) {
	float a;
	a=M_PI * pow(circ.raio,2);
	return a;
}
float perimetro (Circulo circ) {
	float p;
	p=2* M_PI * circ.raio;
	return a;
}
Funções no Problema 2
 // teste de inclusão
 float dist;
 dist=sqrt( pow(xc-xp,2) + pow(yp-yc,2) );
 if (dist<=raio)
	cout<<“o ponto está dentro<<endl;
 else 
	cout<<“o ponto está fora<<endl;
}
bool pertence(Ponto point, Circulo circle) {
	float dist;
 	dist=sqrt( pow(circle.centro.x-point.x,2) + pow(circle.centro.y-point.y,2) );
 	if (dist<=circle.raio)
		return true;
 	else 
		return false;
}
A Biblioteca Geometria
geometria.h
#ifndef GEOMETRIA_H
#define GEOMETRIA_H
typedef struct {
	float x,y;
} Ponto;
typedef struct {
	Ponto centro;
	float raio;
} Circulo;
float area(Circulo);
float perimetro(Circulo);
bool pertence(Ponto,Circulo);
#endif /* GEOMETRIA_H */
A Biblioteca Geometria
geometria.cpp
#include "geometria.h"
#include <cmath>
float area(Circulo circ) {
 float a;
 a=M_PI * pow(circ.raio,2);
 return a;
}
float perimetro (Circulo circ) {
 float p;
 p=2* M_PI * circ.raio;
 return p;
}
bool pertence(Ponto point, Circulo circle) {
 float dist;
 dist=sqrt( pow(circle.centro.x-point.x,2) + pow(circle.centro.x-point.x,2) );
 if (dist<=circle.raio)
	return true;
 else 
	return false;
}
Solução Problema 2
#include <cstdlib>
#include <iostream>
#include “geometria.h”
int main(int argc, char** argv) {
 // Variáveis (representação das entidades)
 Circulo c; // o circulo
 Ponto p; // o ponto 
// leitura dos dados
 cout<<"Informe as coordenadas X e Y do centro do círculo"<<endl;
 cin>>c.centro.x;
 cin>>c.centro.y;
 cout<<"Informe o raio do círculo"<<endl;
 cin>>c.raio;
 cout<<"Informe as coordenadas X e Y do ponto"<<endl;
 cin>>p.x;
 cin>>p.y;
Solução Problema 2 
// impressão da área e do perimetro
 cout<<"Area="<<area(c)<<endl;
 cout<<"Perimetro="<<perimetro(c)<<endl; 
 
// teste de inclusão 
 if (pertence(p,c))
	cout<<"o ponto está dentro"<<endl;
 else 
	cout<<"o ponto está fora"<<endl;
return 0;
}
Variáveis e a Memória 
// Variáveis de tipos estruturados
Ponto p;
Circulo c;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
Variáveis e a Memória 
// Variáveis de tipos estruturados
Ponto p;
Circulo c;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
typedef struct {
	float x,y;
} Ponto;
p.x
p.y
Variáveis e a Memória 
// Variáveis de tipos estruturados
Ponto p;
Circulo c;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
typedef struct {
	float x,y;
} Ponto;
p.x
p.y
typedef struct {
	Ponto centro;
	float raio;
} Ponto;
c.centro
c.centro.x
c.centro.y
c.raio
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
O QUE ACONTECEU?
Passagem de argumentos por valor
31
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
32
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
Escopo função main
33
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
				1						
					2					
										
										
Escopo função main
34
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
				1						
					2					
										
										
Escopo função main
Escopo função troca
35
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções
										
		1								
										
		2								
				1						
					2					
										
										
Escopo função main
Escopo função troca
36
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		1								
			1							
		2								
				1						
					2					
										
										
Escopo função main
Escopo função troca
37
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		2								
			1							
		2								
				1						
					2					
										
										
Escopo função main
Escopo função troca
38
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		2								
			1							
		1								
				1						
					2					
										
										
Escopo função main
Escopo função troca
39
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
				1						
					2					
										
										
Escopo função main
40
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int a,int b) {
	int temp=a;
 	a=b;
 	b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(x,y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
41
Ponteiro é uma variável utilizada para armazenar um endereço de memória ou o endereço de outra variável.
int a; //uma variável do tipo inteiro
int* ptr; // um ponteiro para uma variável do tipo inteiro
a=7; 
ptr=&a; // &-operador de referência (endereço da variável a)
cout<<“O valor da variável a="<<a<<endl;
cout<<"O endereco da variavel a"=<<&a<<endl;
cout<<"O endereco da variavel a"=<<ptr<<endl;
Saída:
O valor da variável a=7
O endereco da variavel a=0xffffcc28
O endereco da variavel a=0xffffcc28
Ponteiros
int a; //uma variável do tipo inteiro
int* ptr; // um ponteiro para uma variável do tipo inteiro
a=7;
										
										
										
										
										
										
										
										
Ponteiros
int a; //uma variável do tipo inteiro
int* ptr; // um ponteiro para uma variável do tipo inteiro
a=7;
ptr=&a;
		7								
										
										
										
										
										
										
										
Ponteiros
0x...
Permite acessar o valor armazenado no endereço referenciado pelo ponteiro
int a; //uma variável do tipo inteiro
int* ptr; // um ponteiro para uma variável do tipo inteiro
a=7; 
ptr=&a;
cout<<“O valor da variável a="<<a<<endl;
cout<<"O endereco da variavel a"=<<&a<<endl;
cout<<"O endereco da variavel a"=<<ptr<<endl;
*ptr=10;
cout<<“O valor da variável a="<<a<<endl;
cout<<"O endereco da variavel a"=<<&a<<endl;
cout<<"O endereco da variavel a"=<<ptr<<endl;
int b=*ptr*a; 
cout<<“O valor da variável b="<<b<<endl;
Saída:
O valor da variável a=7
O endereco da variavel a=0xffffcc28
O endereco da variavel a=0xffffcc28
O valor da variável a=10
O endereco da variavel a=0xffffcc28
O endereco da variavel a=0xffffcc28
O valor da variável b=100;
Operador de Derreferência *
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=2 e y=1
Passagem de Argumentos em Funções (Referência)
Agora funcionou!!
Passagem de argumentos por referência
46
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
47
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
Escopo função main
48
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
				1						
					2					
										
										
Escopo função main
49
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
										
										
										
				1						
					2					
										
										
Escopo função main
Escopo função troca
50
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		0x...								
										
		0x...								
				1						
					2					
										
										
Escopo função main
Escopo função troca
51
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		0x...								
			1							
		0x...								
				1						
					2					
										
										
Escopo função main
Escopo função troca
52
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		0x...								
			1							
		0x...								
				2						
					2					
										
										
Escopo função main
Escopo função troca
53
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
Passagem de Argumentos em Funções (Valor)
										
		0x...								
			1							
		0x...								
				2						
					1					
										
										
Escopo função main
Escopo função troca
54
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=2 e y=1
Passagem de Argumentosem Funções (Valor)
										
										
										
										
				2						
					1					
										
										
Escopo função main
55
#include <cstdlib>
#include <iostream>
using namespace std;
void troca(int* a,int* b) {
	int temp=*a;
 	*a=*b;
 	*b=temp;
}
int main(int argc, char** argv) {
	int x=1,y=2;
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl;
 	troca(&x,&y);
 	cout<<"x="<<x<<" e "<<"y="<<y<<endl; 
	return 0;
}
Saída:
x=1 e y=2
x=2 e y=1
Passagem de Argumentos em Funções (Valor)
										
										
										
										
										
										
										
										
56
Problema 3 
Escreva um programa que leia os dados de dois pontos no plano cartesiano. O seu programa deverá calcular e imprimir a distância entre os pontos informados.
Y
X
(x2,y2)
(x1,y1)
d=?
Classes e Objetos em C++
Classes são novos tipos na linguagem. As classes são utilizadas para representar conceitos e entidades complexas, ou seja, aquelas que necessitam de um conjunto de variáveis para definir a sua representação.
As classes possuem a seção de atributos (variáveis que definem a representação do tipo) e funções membros ou métodos (código que manipula as variáveis da classe).
As classes serão utilizadas para modelar novos tipos na linguagem (a exemplo dos recursos typedef + struct.
Podemos, por analogia, comparar uma classe com um novo tipo estruturado que possui funções que manipulam os elementos da estrutura.
Implementação da Classe em C++
Classes em C++ são geralmente definidas em dois arquivo separados.
NomeDaClasse.h
	Definição da classe
	Especificação dos atributos
	Definição das funções membro (métodos)
NomeDaClasse.cpp
	Especificação das funções membro (implementação da função)
Uma Classe para Modelar um Ponto
Arquivo Ponto.h
class Ponto {
private:
	float m_x,m_y;
public:
	Ponto();
	Ponto(float,float);
	void setX(float);
	float getX();
 	void setY(float);
	float getY();
 	float distancia(Ponto);
	~Ponto();
};
Atributos
Construtores
métodos
Destrutor
Implementação das Funções Membros (Métodos)
Arquivo Ponto.cpp
#include <cmath>
#include "Ponto.h"
Ponto::Ponto() {
 m_x=0;
 m_y=0;
}
Ponto::Ponto(float x,float y) {
 m_x=x;
 m_y=y;
}
Ponto::~Ponto() {
	// coloque o código de liberação de recursos aqui
}
Implementação das Funções Membros (Métodos)
Arquivo Ponto.cpp
(continuação)
float Ponto::GetX() const {
 return m_x;
}
void Ponto::SetX(float x) {
 m_x = x;
}
float Ponto::GetY() const {
 return m_y;
}
void Ponto::SetY(float y) {
 m_y = y;
}
float Ponto::distancia(Ponto p) {
 float dist;
 dist=sqrt(pow(m_x-p.getX(),2)+pow(m_y-p.getY(),2));
 return dist;
}
Criação de Objetos em Java
Em Java, a única maneira de criar um Objeto é através do operador new, seguido da chamada de um dos construtores da classe.
	Ponto p;		// declaração de variável do tipo Ponto
	p=new Ponto();	// criação do objeto (instanciação)
		OU
	Ponto p=new Ponto(); // declaração e instanciação
Uma vez criada a instância da classe (objeto) é possível enviar mensagem ao objeto (evocar os métodos públicos).
	p.setX(15);
	p.setY(12);
63
Criação de Objetos em C++
Em C++, existem duas formas para criação de objetos :
Sem o operador new – Instância da classe
Com o operador new – Ponteiro para a instância da classe
64
Criação de Objetos em C++ sem Operador new
Criação do objeto
// cria uma instância da classe Ponto chamando o construtor default Ponto::Ponto()
Ponto p=Ponto(); 
// cria uma instância da classe Ponto chamando o construtor com os valores de X e Y como argumento Ponto::Ponto(float,float)
Ponto p=Ponto(3,5); 
Trabalhando com o objeto
Após a instanciação do objeto, o envio de mensagem para o objeto é feito como em Java
	p.setX(15);
	p.setY(12);
65
Criação de Objetos em C++ com Operador new
Criação do objeto
// cria uma instância da classe Ponto chamando o construtor default Ponto::Ponto()
Ponto* p=new Ponto(); 
// cria uma instância da classe Ponto chamando o construtor com os valores de X e Y como argumento Ponto::Ponto(float,float)
Ponto* p=new Ponto(3,5); 
Trabalhando com o objeto
Após a instanciação do objeto, o envio de mensagem para o objeto é feito através do operador ->
	p->setX(15);
	p->setY(12);
66
Notas sobre Ponteiros e Instâncias
Na criação de objetos sem o operador new, o objeto é alocado na chamada memória automática, memória local ou stack. 
Neste caso, quando o bloco onde a variável é declarada termina, a mémoria é automaticamente devolvida ao sistema (mesmo efeito do coletor de lixo do Java).
Na criação de objetos com o operador new, o objeto é alocado na chamada memória global ou heap. 
Neste caso, quando o bloco onde a variável é declarada termina, a mémoria NÃO é automaticamente devolvida ao sistema e precisa ser liberada explicitamente (evitar o problema memory leak).
Ponto* p=new Ponto(); // alocação da memória
…
delete p;	// liberação da memória
67
Solução Problema 3 (com instâncias)
#include <cstdlib>
#include <iostream>
#include "Ponto.h"
using namespace std;
int main(int argc, char** argv) {
 // Variáveis (representação das entidades)
 Ponto p1; // um ponto
 Ponto p2; // um ponto
 float a,b; // variáveis auxiliares
Variáveis e a Memória (com instâncias) 
// Variáveis de tipos Classes
Ponto p1;
Ponto p2;
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
class Ponto {
 private:
	float x,y;
…
};
p1.x
p1.y
p2.x
p2.y
p1=Ponto();
p1.x=2;
p1.y=5;
p1.setX(2);
p1.setY(5);
Variáveis e a Memória (com instâncias) 
// Variáveis de tipos Classes
Ponto p1;
Ponto p2;
																														
														2	5															
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
																														
class Ponto {
 private:
	float x,y;
…
};
p1.x
p1.y
p2.x
p2.y
p1=Ponto();
p1.x=2;
p1.y=5;
p1.setX(2);
p1.setY(5);
Solução Problema 3 (com instâncias)
 // leitura dos dados
 cout<<"Informe as coordenadas X e Y do primeiro ponto"<<endl;
 cin>>a;
 cin>>b;
 p1=Ponto(a,b);
 cout<<"Informe as coordenadas X e Y do segundo ponto"<<endl;
 cin>>a;
 cin>>b;
 p2=Ponto(a,b);
 
 // impressão da distância entre os pontos
 cout<<"distancia="<<p1.distancia(p2);
 return 0;
}
Solução Problema 3 (com ponteiros)
#include <cstdlib>
#include <iostream>
#include "Ponto.h"
using namespace std;
int main(int argc, char** argv) {
 // Variáveis (representação das entidades)
 Ponto* p1; // um ponto
 Ponto* p2; // um ponto
 float a,b; // variáveis auxiliares
Solução Problema 3 (com ponteiros)
 // leitura dos dados
 cout<<"Informe as coordenadas X e Y do primeiro ponto"<<endl;
 cin>>a;
 cin>>b;
 p1=new Ponto(a,b);
 cout<<"Informe as coordenadas X e Y do segundo ponto"<<endl;
 cin>>a;
 cin>>b;
 p2=new Ponto(a,b);
 
 // impressão da distância entre os pontos
 cout<<"distancia="<<p1->distancia(*p2);
 // liberação da memória
 delete p1,p2;
 return 0;
}
Desafio
Reescrever o problema 2 utilizando classes. Utilize ponteiros ao invés de instâncias sempre que possível.

Continue navegando

Materiais relacionados

Perguntas relacionadas