Você está na página 1de 29

ITAndroids

POO
Programao Orientada a Objetos

Adaptado de:
Carlos Alberto Alonso Sanches
Juliana de Melo Bezerra
Introduo
Programao Estruturada
Tambm chamada de Programao Modular ou Procedimental
Baseia-se no conceito de mdulo (funo, procedimento, rotina)
O foco est nas aes: no que fazem
Programao Orientada a Objetos
Baseia-se nos conceitos de classe e objeto
O foco passa a estar nos dados: no que so e tm
Permite herana
Exemplos de Linguagens Orientadas a Objetos
Simula (1967), SmallTalk (1970) 2

C++, Java, C#
Introduo
POO x Estruturada - O zelador pega a chave e abre a porta
- Estruturada:
Pensa-se automaticamente em como o zelador faz para abrir a porta
utilizando a chave (cada verbo vira um procedimento);

- POO:

Pensa-se inicialmente nos objetos zelador, porta e chave, nas suas


caractersticas (atributos) e nas aes que podem realizar (mtodos)
(cada substantivo vira um objeto);

3
Introduo
ReceberConta
Programao Orientada a Objetos: EnviarConta

No apenas as funes, mas tambm as CadastrarPedido

informaes so estruturadas. ConfirmarPedido

RemoverEstoque
Os dados tambm so encapsulados
dentro de uma classe, e seu acesso EncomendarEstoque
Progr. Estruturada
protegido atravs de mtodos
especficos.
Cada classe determina o comportamento
(definido nos mtodos ou funes-
membro) e os estados possveis
(atributos) dos seus objetos, assim como
o relacionamento com outras classes.

POO
Conceitos bsicos
Classe uma categoria de entidades.
Corresponde a um tipo: coleo ou conjunto de entidades afins.
Exemplo: Pessoa
Classe base
nome
idade
come()
anda()
respira()

Herana

Professor
salrio
Aluno
nmero
leciona()
corrigeProva() notas Classes derivadas
assisteAula()
fazProva()

Objeto uma entidade concreta, pertencente a uma


determinada classe.
uma instncia (ou exemplar) de uma classe.
Outros exemplos
Classes
Carro, Avio, Pessoa, Fila, Pilha, Grafo, etc.
Objetos
Porsche 910, Placa BFE-9087
Boeing 737-300, Prefixo PY-XXX
Jos da Silva, CPF 109.076.875-73
Uma fila com os valores 32, 454, 13, 56
Uma pilha determinada
Um grafo determinado
Classes como tipos de dados
Uma classe um tipo definido pelo usurio, que contm alguns
dados (chamados de atributos, propriedades ou campos) e um
conjunto de operaes (chamadas de mtodos ou funes-
membro) que atuam sobre esses dados.
Os dados so aquilo que o objeto tem ou como ele est.
As operaes so as aes que o objeto pode realizar ou
sofrer.
A classe encapsula os dados, controlando seu acesso atravs
das correspondentes operaes.
Exemplo: classe Data
Data

Dados (pblicos, privativos ou protegidos) int dia, mes, ano

Operao (idem) alteraData()


Um exemplo em C++

class Ponto { Modificador de acesso


public:
int x,y; // dados pblicos
}; Necessidade do ponto e vrgula

class Data {
public: Dentro da classe, melhor ficar
int dia,mes,ano; apenas o prottipo dos mtodos.
void alteraData(int d, int m, int a);
};

void Data::alteraData(int d,int m,int a) {


// corpo ou implementao de alteraData
}
Operador de escopo
void main() {
Ponto p;
Data d;
} Declarao e instanciao
dos objetos
Acesso aos atributos
Utiliza-se um ponto entre o nome da varivel e o
atributo:
objectName.fieldName;
Exemplos:
Ponto p; // instanciao do objeto p da classe Ponto
p.x = 3; p.y = 2;
int xPlusY = p.x + p.y; // xPlusY receber valor 5
int x2 = p.x * p.x; // x2 receber valor 9

Dentro de cada objeto, possvel ter acesso a


atributos, mtodos e variveis de classe sem utilizar o
ponto.
Entrada e sada em C++

#include <iostream> Importante:


C++ introduz o conceito de
main() { namespaces, por isso
int i; double d; long l; necessrio colocar o prefixo
std:: antes de usar cout e cin.
std::cout << "Digite um inteiro: "; Caso deseje utilizar diretamente
std::cin >> i;
cout e cin, basta adicionar:
std::cout << "Digite um double: "; using namespace std;
std::cin >> d;

std::cout << "Digite um long: ";


std::cin >> l;

std::cout << "inteiro: " << i << " double: " << d << " long: " << l <<
"\n";
}
Entrada e sada em C++

#include <iostream> Importante:


Devido ao using namespace
using namespace std; std;, no foi mais necessrio
adicionar o prefixo std::.
main() { Porm o uso indiscriminado de
int i; double d; long l;
using namespace considerado
cout << "Digite um inteiro: "; m prtica.
cin >> i;

cout << "Digite um double: ";


cin >> d;

cout << "Digite um long: ";


cin >> l;

cout << "inteiro: " << i << " double: " << d << " long: " << l << "\n";
}
Para que serve namespace?
Imagine o cdigo de um jogo tridimensional moderno,
em que h muitos desenvolvedores, separados por
equipes especializadas (Grfico, Fsica, Inteligncia
Artificial, etc.).
Imagine que cada equipe trabalha em um arquivo
diferente (grafico.h, fisica.h, ia.h etc.).
Imagine ento que ambas as equipes de Grfico e de
Fsica criam classes para representar um crculo com
mesmo nome Circulo.
Para que serve namespace?
As duas classes no so iguais. A classe Circulo de
grafico.h provavelmente ter mtodos como
desenhar(), enquanto a Circulo de fisica.h ter
outros como detectarColisao(Circulo outroCirculo).
Em algum lugar, Grfico e Fsica precisam ser
integrados:
#include <grafico.h>
#include <fisica.h>
Porm, o programa no vai compilar porque a classe
Circulo estar sendo declarada duas vezes!
Para que serve namespace?
O programa no vai compilar porque a classe Circulo
estar sendo declarada duas vezes!
Tambm, no h como diferenciar uma classe da
outra:
Circulo c; // a qual Circulo esta linha se refere?
Para que serve namespace?
Soluo:
namespace grafico {
class Circulo {
// Declaracao de Circulo para Grafico
};
}
namespace fisica {
class Circulo {
// Declaracao de Circulo para Fisica
};
}
Para que serve namespace?
Uso:
grafico::Circulo circuloGrafico;
fisica::Circulo circuloFisica;
Observe que se pode dar using namespace em apenas
um desses namespaces (por isso using namespace
considerado m prtica).
Exemplo de Classe
#include <iostream>
#include <conio>
using namespace std;
class Circulo {
public:
int x,y,raio;
void deslocar(int dx,int dy); void main() {
void aumentarRaio(int dR); Circulo c1;
void imprimir(); c1.x = 50;
}; c1.y = 50;
c1.raio = 20;
void Circulo::imprimir() { c1.imprimir();
std::cout<<"Circulo de centro em c1.deslocar(5,5);
("<<x<<","<<y<<") e raio="<<raio<<endl; c1.imprimir();
} c1.aumentarRaio(3);
c1.imprimir();
void Circulo::deslocar(int dx,int dy) {
getch();
x = x + dx; y = y + dy;
}
}

void Circulo::aumentarRaio(int dR) {


raio = raio + dR;
}
Encapsulamento
Encapsulamento a capacidade de esconder parte
do cdigo e dos dados do restante do programa.
Pode-se definir diferentes graus de visibilidade aos
atributos e s funes-membro de cada classe.
De modo geral, as linguagens orientadas a objeto
costumam ter trs modificadores de acesso:
Pblico: todos tm acesso
Privativo: acesso restrito prpria classe
Protegido: acesso restrito prpria classe e s classes
derivadas
Modificadores de acesso em C++

Diretivas de visibilidade em C++:


public: permite visibilidade em qualquer parte do
programa
private (default): permite visibilidade apenas
dentro da prpria classe
protected: permite visibilidade dentro da prpria
classe e das classes derivadas
Exemplo

class Circulo {
private:
int x,y,raio; // dados e operaes privativos

protected: // dados e operaes protegidos

public: // dados e operaes pblicos


void set(int x,int y,int raio);
void deslocar(int dx,int dy);
void aumentarRaio(int dR);
void imprimir();
};

void Circulo::set(int nx,int ny,int nr) {


x = nx>0 && nx<1000 ? nx : x;
y = ny>0 && ny<1000 ? ny : y;
raio = nr>0 && nr<1000 ? nr : raio;
}
Um boa prtica de programao
De modo geral, procura-se controlar o acesso
aos atributos de cada classe.
Isso costuma ser feito do seguinte modo:
Os atributos so declarados como private.
As consultas aos seus valores so realizadas atravs
de mtodos de acesso (nomes comeados com get).
As alteraes dos seus valores so realizadas atravs
de mtodos de modificao (nomes comeados com
set).
Exemplo
class TV {
private:
int canal, volume; Mtodos de acesso
public: (getters)
int getCanal();
int getVolume();
void setCanal(int nc);
void addVolume(int quant); Mtodos de modificao
}; (setters)

int TV::getCanal() { return canal; }

int TV::getVolume() { return volume; }

void TV::setCanal(int nc) { canal = nc; }

void TV::addVolume(int quant) { Encapsulamento ajuda a


volume += quant; evitar dados invlidos
if (volume>100) volume = 100;
if (volume<0) volume = 0;
}
Construtores e destrutores
Cada classe pode ser vista como uma forma de fazer
biscoitos, ou seja, permite a criao de objetos
individuais com dados e operaes de acordo com suas
descries.
Construtores so mtodos especiais que inicializam os
objetos da classe. So chamados no momento da
criao (instanciao) de cada objeto, e tm o mesmo
nome da sua classe.
Destrutores so mtodos que destroem objetos,
liberando recurso (em especial, memria). So
chamados automaticamente quando os objetos deixam
de existir, isto , quando o seu escopo termina.
Exemplo
class Lista {
private: Construtores tm o mesmo nome
int n; da classe e no retornam nada
int *valores; (ou seja, no tm tipo)
public:
Lista(); Este o construtor bsico (sem parmetros),
Lista(int tam); chamado nas declaraes
~Lista(); Lista L; ou Lista L = Lista();
void colocarNoFinal(int v);
int removerInicio(); Outro construtor.
}; Exemplo de chamada: Lista L = Lista(5);
Lista::Lista() { n = 0; }
Destrutores tm o mesmo nome da
Lista::Lista(int tam) { classe, com o complemento ~
n = tam; (tambm no tm tipo).
valores=(int*)malloc(tam*sizeof(int)); Permitem desalocar memria dinmica
}
Importante: o construtor bsico dever ser
Lista::~Lista() {
if (n>0) free(valores);
implementado quando houver outro construtor e
} deseja-se instanciar um objeto sem inicializ-lo
Atributos estticos
Como vimos, os objetos possuem dados
particulares, chamados de atributos ou campos.
No entanto, h atributos que pertencem classe
como um todo: existem independentemente de
haver ou no objetos instanciados nessa classe.
Os atributos de classe so chamados de variveis
de classe ou variveis estticas (so declaradas
com o modificador static).
Em contraposio, os atributos dos objetos
tambm so chamados de variveis de instncia.
Exemplo
class TV {
private: Contadora do nmero
static int quantTV = 0; de instanciaes.
int canal, volume; Por ser esttica, pode
receber valor inicial.
public:
TV();
int getCanal();
int getVolume();
void setCanal(int nc);
void addVolume(int quant);
Importante:
};
Alguns compiladores (por exemplo, o compilador do
Dev C++) no permitem que uma varivel esttica
TV::TV() {
seja inicializada dentro da sua classe. Alternativa:
volume = 0;
class TV {
canal = 1;
private:
quantTV++;
static int quantTV;
}
...
}
int TV::quantTV = 0;
Sobrecarga de mtodos
Sobrecarga a possibilidade de que vrios mtodos
tenham o mesmo nome, porm com prottipos ligeiramente
diferentes (variaes na quantidade ou no tipo dos
argumentos e no tipo de retorno).
Exemplo: #include <math>
class Logaritmo {
public:
double logaritmo(double x);
double logaritmo(double x, double b);
};
double Logaritmo::logaritmo(double x) {
return log(x);
}
double Logaritmo::logaritmo(double x, double b) { 27
return (log(x)/log(b));
}
Exerccio
Crie uma classe Pilha que implemente essa estrutura de
dados para inteiros, com as operaes push(), pop(),
top(), size() e isEmpty().

Escreva um programa simples que instancie e utilize a


classe Pilha.
Exemplo:
void main() {
Pilha p; // instanciao atravs do construtor bsico
p.push(5);
std::cout << p.top() << endl;
p.pop();
getch();
} 28
Exerccio
Alterar o cdigo da classe Pilha, para que seu usurio
tenha a possibilidade de:
especificar o tamanho mximo da pilha;
liberar o espao alocado.

Isso significa que ser preciso


um novo construtor!
Tarefa tpica para o destrutor

29