Buscar

[Prof. Emiliana] aula teórica 9

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Templates
BCC702-Programação de Computadores II
Emiliana Mara Lopes Simões
simoes.eml@gmail.com
Universidade Federal de Ouro Preto
maio 2010
Templates
PROBLEMA: Criar uma função que determina o maior de três
números inteiros
Templates
PROBLEMA: Criar uma função que determina o maior de
três valores do tipo int
int maximo(int a, int b, int c){
int max = a;
if(b > max)
max = b;
if(c > max)
max = c;
return max;
}
Templates
PROBLEMA: Criar uma função que determina o maior de três
valores do tipo double
COMO RESOLVER???
Templates
PROBLEMA: Criar uma função que determina o maior de
três valores do tipo double
double maximo(double a, double b, double c){
double max = a;
if(b > max)
max = b;
if(c > max)
max = c;
return max;
}
Templates
Códigos quase idênticos!!! A única diferença é o tipo usado
em 5 lugares.
Templates
As funções sobrecarregadas normalmente realizam operações
semelhantes ou idênticas sobre tipos de dados diferentes
Se forem idênticas para cada tipo, as operações podem ser
expressas de maneira mais compacta e conveniente utilizando
templates de função
Templates
As funções sobrecarregadas normalmente realizam operações
semelhantes ou idênticas sobre tipos de dados diferentes
Se forem idênticas para cada tipo, as operações podem ser
expressas de maneira mais compacta e conveniente utilizando
templates de função
Sintaxe Para Template de Função
Permite “obter o maior dentre três valores” de quaisquer
tipos de variáveis:
Sintaxe Para Template de Função
Todas as definições de template de função começam com
a palavra-chave template seguida por uma lista de
parâmetros de template
Exemplos:
template < class T >
template < class T1, class T2 >
Sintaxe Para Template de Função
Os parâmetros de template são utilizados para especificar:
1 Os tipos dos argumentos para a função
2 O tipo de retorno da função
3 Os tipos de variáveis declaradas dentro da função
Sintaxe Para Template de Função
Os parâmetros de template são utilizados para especificar:
1 Os tipos dos argumentos para a função
2 O tipo de retorno da função
3 Os tipos de variáveis declaradas dentro da função
Sintaxe Para Template de Função
Os parâmetros de template são utilizados para especificar:
1 Os tipos dos argumentos para a função
2 O tipo de retorno da função
3 Os tipos de variáveis declaradas dentro da função
Sintaxe Para Template de Função
Os parâmetros de template são utilizados para especificar:
1 Os tipos dos argumentos para a função
2 O tipo de retorno da função
3 Os tipos de variáveis declaradas dentro da função
Definição de Templates de Função
O Template de Função maximo(...) é atualmente uma
grande coleção de definições!
Uma definição para cada tipo possível
O compilador somente gera definições quando solicitado. Mas
é como se você tivesse definido para todos os tipos
Definição de Templates de Função
O Template de Função maximo(...) é atualmente uma
grande coleção de definições!
Uma definição para cada tipo possível
O compilador somente gera definições quando solicitado. Mas
é como se você tivesse definido para todos os tipos
Chamando um Template de Função
Supondo que o template de função maximo(...) tenha sido
definido no mesmo arquivo do main, temos:
#include <iostream>
using namespace std;
... //definição do template de função maximo(...)
main(){
int a = 2, b = 3, c = 5;
double x = 6.6, y = 3.4, z = 0.99;
cout << “O maior entre tres inteiros: ” << maximo(a, b, c);
cout << endl;
cout << “O maior entre tres numeros reais: ” << maximo(x, y, z);
cout << endl;
system(“pause”);
}
Observações sobre a Sintaxe Para Template
template < class T >
Nesse contexto, class significa tipo
C++ permite a palavra-chave typename no lugar da
palavra-chave class
Exemplos:
template < typename T >
template < typename T1, typename T2 >
Observações sobre a Sintaxe Para Template
template < class T >
T pode ser substituído por qualquer tipo predefinido ou
definido pelo usuário
OBSERVAÇÃO: Pode-se usar outra letra diferente de T, mas
T é de uso tradicional
Exemplos de Templates de Função
Exemplo: Função para impressão de um valor inteiro e outros
dois valores do mesmo tipo
Definição:
template <class T>
void mostraCoisas(int coisa1, T coisa2, T coisa3)
{
cout << coisa1 << endl
<< coisa2 << endl
<< coisa3 << endl;
}
Exemplos de Templates de Função
#include <iostream>
#include <string>
using namespace std;
template <class T>
void mostraCoisas(int coisa1, T coisa2, T coisa3)
{
cout << coisa1 << “ ”
<< coisa2 << “ ”
<< coisa3 << endl;
}
main(){
mostraCoisas(1, 10, 20); //inteiros
mostraCoisas(2, “Programacao ”, “de Computadores II”); //strings
mostraCoisas(3, 9.5, 8.7); //doubles
system(“pause”);
}
Exemplos de Templates de Função
O compilador gera definições de função
1 Substituindo T por um tipo int
2 Substituindo T por um tipo string
3 Substituindo T por um tipo double
Saída do programa:
1 10 20
2 Programacao de Computadores II
3 9.5 8.7
Exemplos de Templates de Função
Pode haver mais de um parâmetro de tipo no template.
Exemplo: Função para impressão de dois valores
template <class T1, class T2>
void mostraCoisas(T1 coisa1, T2 coisa2)
{
cout << coisa1 << endl
<< coisa2 << endl;
}
Cada parâmetro de tipo deve ser usado na definição do
template de função. Caso contrário, erro!
Vejam que T1 e T2 foram usados na lista de parâmetros da
função (OK!)
Exemplos de Templates de Função
Pode haver mais de um parâmetro de tipo no template.
Exemplo: Função para impressão de dois valores
template <class T1, class T2>
void mostraCoisas(T1 coisa1, T2 coisa2)
{
cout << coisa1 << endl
<< coisa2 << endl;
}
Cada parâmetro de tipo deve ser usado na definição do
template de função. Caso contrário, erro!
Vejam que T1 e T2 foram usados na lista de parâmetros da
função (OK!)
Exemplos de Templates de Função
Pode haver mais de um parâmetro de tipo no template.
Exemplo: Função para impressão de dois valores
template <class T1, class T2>
void mostraCoisas(T1 coisa1, T2 coisa2)
{
cout << coisa1 << endl
<< coisa2 << endl;
}
Cada parâmetro de tipo deve ser usado na definição do
template de função. Caso contrário, erro!
Vejam que T1 e T2 foram usados na lista de parâmetros da
função (OK!)
Exemplos de Templates de Função
#include <iostream>
#include <string>
using namespace std;
template <class T1, class T2>
void mostraCoisas(T1 coisa1, T2 coisa2)
{
cout << coisa1 << “ ”
<< coisa2 << “ ” << endl;
}
main(){
mostraCoisas(10, 20);//inteiro, inteiro
mostraCoisas(4.5, “Programacao de Computadores II”);//double, string
mostraCoisas(3, 9.5); //inteiro, double
system(“pause”);
}
Exemplos de Templates de Função
O compilador gera definições de função
1 Substituindo T1 por um tipo int e T2 por um tipo int
2 Substituindo T1 por um tipo double e T2 por um tipo string
3 Substituindo T1 por um tipo int e T2 por um tipo double
Saída do programa:
10 20
4.5 Programacao de Computadores II
3 9.5
Template com um tipo inadequado
ATENÇÃO: Pode-se usar qualquer tipo em um template
desde que o código faça sentido
Exemplo: O template de função maximo() definido no início
da aula
Não se pode usar um tipo para o qual os operadores de
atribuição e comparação não estão definidos
int a[10], b[10], c[10];
maximo(a, b, c); //ERRADO!!! A atribuição e comparação
//não funcionam com tipos vetor
Templates de Classe
Pode-se também generalizar templates de classe
Exatamente como em templates de função!
Uma vez definido o template, pode-se declarar objetos dessa
classe
Templates de Classe
IMPORTANTE:
A maioria dos compiladores C++ requer a exibição da
definição completa de um template no arquivo de código-fonte
que utiliza o template
Por essa razão, os templates são frequentemente definidos em
arquivos de cabeçalho (.h), que são então incluídos (com
#include) nos arquivos de código-fonte que usam o template
Para os templates de classe, isso quer dizer que as
funções-membro também são definidas no arquivo de
cabeçalho. Tudo é implementadono arquivo .h e não é usado
o arquivo .cpp
Exemplo de Template de Classe
Exemplo: Template de classe que tem um par de valores de
tipo T
template <class T>
class Par{
private:
T primeiro;
T segundo;
public:
Par(){ } //função definida dentro da própria definição de classe
Par(T v1, T v2);
void setPrimeiro(T v);
void setSegundo(T v);
T getPrimeiro( );
T getSegundo( );
};
...
Par.h
Exemplo de Template de Classe
...
template <class T>
Par< T >::Par(T v1, T v2){
primeiro = v1;
segundo = v2;
}
template <class T>
void Par< T >::setPrimeiro(T v){
primeiro = v;
}
template <class T>
void Par< T >::setSegundo(T v){
segundo = v;
}
...
Par.h
Exemplo de Template de Classe
...
template <class T>
T Par< T >::getPrimeiro(){
return primeiro;
}
template <class T>
T Par< T >::getSegundo(){
return segundo;
}
Par.h
Exemplo de Template de Classe
Um template de classe Par torna-se a base para criar muitas
classes Par (como Par de double, Par de int, Par de string e
etc...)
As definições de função-membro que aparecem fora da
definição de template de classe iniciam, cada uma, com o
cabeçalho
template <class T>
Para associar cada definição de função-membro ao escopo do
template de classe, antes do operador de resolução de escopo
(::) usa-se o nome genérico da classe
Par < T >
Exemplo de Template de Classe
Um template de classe Par torna-se a base para criar muitas
classes Par (como Par de double, Par de int, Par de string e
etc...)
As definições de função-membro que aparecem fora da
definição de template de classe iniciam, cada uma, com o
cabeçalho
template <class T>
Para associar cada definição de função-membro ao escopo do
template de classe, antes do operador de resolução de escopo
(::) usa-se o nome genérico da classe
Par < T >
Exemplo de Template de Classe
Um template de classe Par torna-se a base para criar muitas
classes Par (como Par de double, Par de int, Par de string e
etc...)
As definições de função-membro que aparecem fora da
definição de template de classe iniciam, cada uma, com o
cabeçalho
template <class T>
Para associar cada definição de função-membro ao escopo do
template de classe, antes do operador de resolução de escopo
(::) usa-se o nome genérico da classe
Par < T >
Exemplo de Template de Classe
#include <iostream>
#include “Par.h”
using namespace std;
main(){
Par <char> p1(’a’, ’b’); //Objeto declarado como Par de char
Par <double> p2(9.6, 2.3); //Objeto declarado como Par de double
cout << p1.getPrimeiro() << “ ” << p2.getPrimeiro() << endl
<< p1.getSegundo() << “ ” << p2.getSegundo() << endl;
system(“pause”);
}
Exemplo de Template de Classe
Saída do programa:
a 9.6
b 2.3
Resumindo
Os templates representam um dos mais poderosos recursos de
reutilização de software de C++
Os templates de função/classe permitem aos
programadores especificar, com um único segmento de código,
uma série de funções/classes relacionadas chamadas
especializações de template de função/classe
Dúvidas?
Próxima Aula
Decidir... 17? 24? ou 31?

Outros materiais