2. Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com
https://sites.google.com/site/profsergiocosta/home
http://www.slideshare.net/skosta/presentations?order=popular
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
3. Paradigma Orientado a objetos
Veremos ...
Conceitos chaves
Pragmatica
Caso de estudo C++
4. Paradigma Orientado a objetos
●
Não é um paradigma no sentido estrito: é uma subclassificacão do
imperativo
●
A diferença é mais de metodologia quanto à concepção e
modelagem do sistema.
●
A grosso modo, uma aplicação é estruturada em módulos (classes)
que agrupam um estado (atributos) e operações (métodos) sobre
este
●
Classes podem ser estendidas e/ou usadas como tipos (cujos
elementos são objetos)
7. Objetos
Um sistema é uma coleção de objetos e suas
relações.
Objeto 1
Objeto 3
Objeto 2
Objeto 4
8. Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.
9. Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.
As variáveis são tipicamente privadas,
podendo ser acessadas somente pelo
métodos.
10. Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.
As variáveis são tipicamente privadas,
podendo ser acessadas somente pelo
métodos.
Objetos nos dá um modo natural para modelar
entidades do mundo real.
11. Classes
● Classificar objetos e uma característica
chave em POO.
● A classe é uma estrutura de onde se deriva
vários objetos.
○ Os objetos são as entidade criadas a partir de uma
classe.
● Um objeto é uma “instância” de uma classe.
○ Classes existem na modelagem enquanto os
objetos em execução.
12. Herança
Uma subclasse herda todos os métodos da
super classe, ao menos que ela explicitamente
sobrecarregue algum deles.
13. Herança
Uma subclasse herda todos os métodos da
super classe, ao menos que ela explicitamente
sobrecarregue algum deles.
Herança tem um grande impacto na
produtividade dos programadores.
Foi um dos principais recursos que ajudou na
popularização deste "paradigma".
14. Polimorfismo de inclusão
Habilita um objeto de uma subclasse ser
tratada como um objeto da superclasse.
Isso permite construir coleções heterogêneas
de objetos de diferente classes, mas com o
mesmo antecessor (vetores de Object em
Java)
15. Pragmatica
As unidades de um programa são classes,
relacionadas:
● dependencia, metodos de uma classe
chama de outra.
● inclusão ou extensão, uma classe é uma
subclasse de outra.
● composição, objetos de uma classe contem
objetos de outra
16. Pragmatica
Uma classe é similar a um tipo composto, cuja
representação é definida pelos seus
componentes.
17. Pragmatica
Uma classe é similar a um tipo composto, cuja
representação é definida pelos seus
componentes
Se suas variaveis são privadas, a classe é um
tipo abstrato, garatindo baixo acoplamento.
18. Pragmatica
A relação de inclusão aumenta a acoplamenteo
das classes.
Como as subclasses tem acesso as variaveis
da superclasse, modificação nas variaveis da
super afetará a subclasse.
21. C++
Proposta por Bjarne Stroustroup como uma
extensão ao C (C com classes) em 1983.
Padronizado pela ISO, em 1998 e revisado em
2003
Em 2011 foi lançado uma nova versão, quye
inclui por exemplo, funções anonimas.
22. Tipos e Valores
● Os tipos primitivos em C++ são os mesmo
do C, com adição do tipo "bool" que é pouco
usado na prática.
23. Tipos e Valores
● Os tipos primitivos em C++ são os mesmo
do C, com adição do tipo "bool" que é pouco
usado na prática.
● Os tipos compostos do C tambem foram
usados. Adicionamente, C++ suporta
objetos além de "structs".
○ Ambos podem ser equipados com métoos.
24. Sistema de tipos
O sistema de tipo do C++ é mais complexo,
suportanto polimorfismo de inclusão e
sobrecarga.
O sistema de tipo é mais forte do que o C,
menos coersões e chamada de funções são
sempre checadas.
25. Variaveis
● Similar ao C, C++ suporta variaveis locais e
globais.
● Adicionalmente, C++ suporta
EXPLICITAMENTE variáveis heap, através
dos operadores new (alocador) e delete
(desalocador).
26. Variaveis
Qual a diferença do new
para o malloc e do delete
para o free.
● Similar ao C, C++ suporta variaveis locais e
globais.
● Adicionalmente, C++ suporta
EXPLICITAMENTE variáveis heap, através
dos operadores new (alocador) e delete
(desalocador).
27. Controle
C++ include todos os comandos e sequencias
do C.
Adicionamente, o C++ suporta tratamento de
exceção.
28. Amarração e escopo
● Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.
29. Amarração e escopo
● Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.
● Uma classe C++ consiste de declarações de
variaveis, construtores e métodos.
30. Amarração e escopo
● Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.
● Uma classe C++ consiste de declarações de
variaveis, construtores e métodos.
● Uma função (construtor e método) C++
consiste de declarações de parametros
formais, variaveis locais e tipos locais.
31. Amarração e escopo
● O modificador const, declara que uma
variavel pode ser inspecionada e não
tualizada.
● E no caso abaixo, que linha é invalida?
const int *p;
int q, r = 10;
p = &q;
p = &r;
*p = 10;
32. Procedimentos e funções
● C++ suporta funções, construtores, e
métodos.
○ Métodos difere das funções somente por eles serem
anexados a objetos.
● O resultado de uma função ou método pode
ser void ou qualquer outro tipos.
● C++ suporta passagem por referência para
parametros.
33. Passagem por referência
void minimax (int a[], int n, int& min, int& max) {
min = max = a[0];
int i;
for (i = 1; i < n; i++) {
int elem = a[i];
if (elem < min) min = elem;
else if (elem > max) max = elem;
}
}
int[] temps = {13, 15, 20, 18, 21, 14, 12};
int low, high;
...
minimax(temps, 7, low, high);
34. Passagem por referência
● C++ suporta sobrecarga independente de
contexto de funções ( construtores e
métodos).
○ duas ou mais funções podem compartilhar o mesmo
identificador somente se elas diferencias em tipo ou
numero de parametrs.
● Operadores sao tratados exatamente como
funções, podemos sobrecarregar existentes
operadores, mas nao podemos criar novos.
36. Passagem por referência
Permitido:
void put (ostream str, int i);
void put (ostream str, double r);
Nao permitido ( contexto)
int put (ostream str, double r); // illegal!
37. Sobrecarga de operadores
class ostream :
public:
... {
ostream& operator<< (char c);
ostream& operator<< (int
i);
ostream& operator<< (double r);
}
ostream out;
int n;
...
out << (n/100); out << '%';
//ou simplesmente
out << (n/100) << '%';
38. Sobrecarga de operadores
struct Point {
int x, y;
public:
Point (int x, int y):x(x), y(y) {};
};
ostream& operator << (ostream &o,const Point &p){
o << "(" << p.x << ", " << p.y << ")";
return o;
}
int main () { cout << Point(4,5) << endl;}
39. Abstração de dados
● Suportada em C++ através de classes.
● Uma declaração de classe contem
○ seu nome e das suas superclasse
○ variaveis de classes
○ operações (construtores e métodos)
40. Abstração de dados
● Suportada em C++ através de classes.
● Uma declaração de classe contem
○ seu nome e das suas superclasse
○ variaveis de classes
○ operações (construtores e métodos)
● Pela terminologia do C++:
○ subclasse é chamada de classe derivada
○ superclasse é chamada de classe base
○ métodos são simplesmente chamados de funções
41. Abstração de dados - declarações
Uma declaração em uma classe poder ser
definida como:
● públicas - public,
● protegidas - protected,
● privadas - private
Total encapsulamento é alcançado com as
variaveis declaradas como privadas ou
protegidas, e somente as operações como
publicas.
42. Abstração de dados - declarações
Podemos distinguir variaveis em dois tipos:
● de instancia; cada objeto possui uma copia
distinta desta variavel
● de classe, só existe uma por classe.
Qual a palavra reservada para fazer essa
distinção?
43. Abstração de dados - declarações
Podemos distinguir variaveis em dois tipos:
● de instancia; cada objeto possui uma copia
distinta desta variavel
● de classe, só existe uma por classe.
Qual a palavra reservada para fazer essa
distinção?
● static
44. Abstração de dados - declarações
class A {
public:
static int x;
};
int A::x = 10;
int main () {
A a,b;
a.x = 20;
cout << b.x << "-" << A::x << "-" << a.x << endl;
}
45. Abstração de dados - declarações
similarmente, existem duas declarações de
métodos:
● instancia e
● classe
46. Abstração de dados - construtores
É um tipo especial de metodo usado para criar
os objetos.
Similar aos outros métodos, construtores
tambem podem ser sobrecarregados.
47. Objetos C++
Objetos C++, similar as variáveis, podem ser
global, local ou "heap".
C++ adota semantica de copia para todos as
atribuições, porem a semantica de referencia
pode ser alcançada usando ponteiros para
objetos.
48. Copia vs Referencia
{
Person pc("Curie", "Pierre", 'M', 1859);
Person ms("Sklodowska", "Marie", 'F', 1867);
Person mc;
mc = ms;
mc.change_surname(pc.get_surname());
}
Qual o valor para ms.get_surname() ?
49. Copia vs Referencia
{
Person* ppc = new Person("Curie", "Pierre", 'M', 1859);
Person* pms = new Person("Sklodowska", "Marie", 'F', 1867);
Person* pmc;
pmc = pms;
pmc->change_surname(ppc->get_surname());
}
Qual o valor para pms.get_surname() ?
50. Abstração de dados
class A {
public:
A (int x):x(x){}
Quebrando o
int getX() {return x;}
encapsulamento
private:
int x;
};
int main () {
A* a = new A(30);
*a = 20;
cout << a->getX() << endl ;
}
52. Abstração de dados
● O uso de herança multipla é controverso.
● Dado que herança quebra com o
encapsulamento e aumenta acoplabilidade
entre as entidades.
● Herança multipla agravaria essas
desvantagens.
● Porém, bem aplicado pode ser um
instrumento poderoso na modelagem.
53. Polimorfismo de inclusão
● C++ suporta polimorfismo de inclusão, dado
que um objeto de uma sub-classe pode ser
tradado como um objeto da superclasse,
quando eles sao acessados atraves de
ponteiros.