programação orientada a objetos · programação orientada a objetos aula xii prof. felício...

30
Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Upload: others

Post on 09-Oct-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Programação Orientada a Objetos

Aula XII

Prof. Felício Bruzzi Barros

Junho de 2008

Page 2: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

void Troca(int &m, int &n){

int aux;aux = m;m = n;n = aux;

}

Page 3: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

void Troca(char &m, char &n){

char aux;aux = m;m = n;n = aux;

}

Page 4: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

Reescrever o código (no caso a função Troca) para cada tipo que se deseja utilizar implica em: – consumo de tempo do programador;– desperdício de espaço no código;– desperdício de memória pois toda função

sobrecarregada irá implicar em em tê-la compilada, mesmo que não seja usada.

Page 5: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

void Troca(tipo_var &m, tipo_var &n){

tipo_var aux;aux = m;m = n;n = aux;

}

exemplo:troca

Page 6: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

template <class T> T func (T parâmetro, …){…}

Define-se uma função padrão ou modelo.

T é um parâmetro (poderia ser qualquer outra letra), quepode ser substituído por qualquer tipo.

T é também conhecido como argumento do modelo(template)

Page 7: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

template <class T> T func (T parâmetro, …){…}

Argumento do template.

(Sempre um ou mais)

Pode estar presente na lista de argumentos da função e/ouno código da mesma

Page 8: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

template <class T> T func (T parâmetro, …){…}

Palavrareservada, podeser substituídapor typename

Page 9: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

template <class T> T func (T parâmetro, …){…}

Palavra reservada quemostra ao compilador

que o código seguinte éum modelo

Page 10: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

As funções templates, como são apenas modelos ou padrões, não podem ser separadas entre um arquivo cabeçalho com a declaração e um arquivo cpp (a ser compilado com sua definição).Definição e declaração devem ficar juntos.

Page 11: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

// file.h

template <class T> void Troca(T &m, T &n)

{T aux;aux = m;m = n;n = aux;

}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

int var1, var2;var1=5;var2=10;cout << "originalmente var1 = " << var1 << " e var2 = " << var2 << endl;Troca(var1,var2);cout << "posteriormente var1 = " << var1 << " e var2 = " << var2 << endl;return 0;

}

Page 12: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

// file.h

template <class T> void Troca(T &, T &)

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

int var1, var2;var1=5;var2=10;cout << "originalmente var1 = " << var1 << " e var2 = " << var2 << endl;Troca(var1,var2);cout << "posteriormente var1 = " << var1 << " e var2 = " << var2 << endl;return 0;

}

// file.cpp

export template <class ax> void Troca(T &m, T &n)

{T aux;aux = m;m = n;n = aux;

}

Significa acessível para outraunidade de compilação

Page 13: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

template <class T> T(ou tipo) f(T parâmetro){ … }

template <class T> T(ou tipo) f(T par1, T par2, …){ … }

template <class T> T(ou tipo) f(T par1, tipo par2, …){ … }

template <class T1, class T2, …) T1(ou T2, ou … tipo) f(T1 par1, T2 par2, tipo par3, …)

Page 14: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

// file.h

template <class T> T* f(T a){...}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

int i=5;double d=3.4;f(i);f(5);f(d);return 0;

}

Page 15: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates – funções / sobrecarga

// file.h

template <class C> C absmax(C a, C b){

return (abs(a) > abs(b)) ? a : b;}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

absmax(-1,2);absmax(2.7,5.6); absmax(5,6.9);return 0;

}

Page 16: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates – funções

// file.h

template <class C> C absmax(C a, C b){

return (abs(a) > abs(b)) ? a : b;}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

absmax(-1,2); // absmax<int>(1,2)absmax(2.7,5.6); // absmax<double>(2.7,5.6)absmax(5,6.9); // ambíguoabsmax<double>(5,6.9) // OKreturn 0;

}

Page 17: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates – funções (sobrecarga)

// file.h

template <class T> T abs(T a){

...

}

double abs(double a){

...

}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

abs(2.0);abs(2);return 0;

}

Page 18: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates – funções (sobrecarga)

// file.h

template <class T> T abs(T a){

...

}

double abs(double a){

...

}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

abs(2.0); // abs(double 2.0)abs(2); // abs<int>(int 2)return 0;

}

Page 19: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - funções

// file.h

template <class T, class S> T g(S a){...}

// main.cpp#include "file.h"#include <iostream>using namespace std;

int main(){

int i=5;double d=3.4;g<int, double>(d); // T=int, S=doubleg<double>(i); // T=double, S=intg(d); // T=?, S=doublereturn 0;

}

Page 20: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

São modelos que permitem definir classes genéricas para manipular diferentes tipos de dados.Um caso típico são as classes contêineres (que contêm objetos de um tipo de dado genérico).São denominadas classes parametrizáveis.

Page 21: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

template <class T> class Nome_da_classe{…};

Page 22: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

push()

push()push()

pop()

pop()pop()

exemplo:pilha1

Page 23: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

template <class T> class Pilha{private:

T dados[50];int num;int topo;

public:Pilha(): num(50), topo(0) {};void push(T elem){

if (topo<=num)dados[topo++]=elem;

return;};T pop(){

if (topo>0)return dados[--topo];

exit(1);};int get_num() {return num;};

};

Dentro do escopo de Pilha<T>, é

redundante qualificaras funções membros

com <T>.

Page 24: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

template <class T, int n_max=50> class Pilha{private:

T dados[n_max];int num;int topo;

public:Pilha(): num(n_max), topo(0)

{};void push(T elem){

if (topo<=num)dados[topo++]=elem;

return;};T pop(){

if (topo>0)return dados[--topo];

exit(1);};int get_num() {return num;};

};

#include "pilha.h"

int main(){

Pilha<double> p;p.push(5.0);p.push(4.5);p.push(10.2);p.push(20.3);cout << p.pop() << endl;cout << p.pop() << endl;cout << p.pop() << endl;cout << p.pop() << endl;return 0;

}

Page 25: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

template <class T, int n_max=50> class Pilha{private:

T dados[n_max];int num;int topo;

public:Pilha(): num(n_max), topo(0)

{};void push(T elem){

if (topo<=num)dados[topo++]=elem;

return;};T pop(){

if (topo>0)return dados[--topo];

exit(1);};int get_num() {return num;};

};

#include "pilha.h"

int main(){

Pilha<double,10> p;p.push(5.0);p.push(4.5);p.push(10.2);p.push(20.3);cout << p.pop() << endl;cout << p.pop() << endl;cout << p.pop() << endl;cout << p.pop() << endl;return 0;

}

exemplo:pilha2

Page 26: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates - classes

template <class T1, class T2, tipo nome, …>class Nome_da_classe{…};

Page 27: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates

Templates são conhecidos como tipos parametrizados.Possibilitam um polimorfismo em tempo de compilação. Pois o compilador iráespecializar as formas (funções ou classes) de acordo com argumentos passados paraos templates.

Page 28: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Templates

Ao encontrar uma definição de template, o código não é gerado imediatamente.O compilador gera apenas instâncias específicas quando encontra uma chamada de template.Os compiladores precisam, portanto, ter acesso ao código fonte.Não ocorre perda de rendimento.Quanto maior o número de instâncias, maior o código.

Page 29: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Laboratório X1

Utilize o código VetMat, para generizá-lopor meio de templates.A classe matriz deverá agora ser capaz de trabalhar com tipos float, int, double, longdouble, etc.

Page 30: Programação Orientada a Objetos · Programação Orientada a Objetos Aula XII Prof. Felício Bruzzi Barros Junho de 2008

Quarto trabalho (parte três)

Utilize o código de vetores e matrizes, para generizá-lo por meio de templates.As classes vetor e matriz deverão agora ser capaz de trabalhar com tipos float, int, double, long double, etc.

Data de entrega: juntamente com a prova.