1. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Palestra: Templates e sobrecarga de operadores
Lucas Lellis
Rodrigo Torres
PESL - Programa de Educa¸˜o em Software livre
ca
Universidade Federal de S˜o Paulo
a
18 de Outubro de 2013
Lucas Lellis e Rodrigo Torres
Templates e Operators
5. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Hoje vamos falar sobre dois conceitos poderosos:
Uma poderosa ferramenta para a programa¸˜o gen´rica, que
ca
e
s˜o os Templates.
a
Uma t´cnica de abstra¸˜o muito interessante, que ´ a
e
ca
e
sobrecarga de operadores.
Lucas Lellis e Rodrigo Torres
Templates e Operators
8. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motiva¸˜o
ca
clara, a possibilidade de criar containers como Vector, list e
map, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suporte
para a programa¸˜o gen´rica
ca
e
Com ele ´ poss´ usar um tipo como uma parˆmetro na
e
ıvel
a
defini¸˜o de uma classe ou de uma fun¸˜o
ca
ca
Lucas Lellis e Rodrigo Torres
Templates e Operators
9. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motiva¸˜o
ca
clara, a possibilidade de criar containers como Vector, list e
map, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suporte
para a programa¸˜o gen´rica
ca
e
Com ele ´ poss´ usar um tipo como uma parˆmetro na
e
ıvel
a
defini¸˜o de uma classe ou de uma fun¸˜o
ca
ca
”Tipo” n˜o se refere somente aos tipos b´sicos do C/C++,
a
a
uma vez que tamb´m ´ poss´ usar qualquer classe como
e e
ıvel
parˆmetro.
a
Lucas Lellis e Rodrigo Torres
Templates e Operators
10. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motiva¸˜o
ca
clara, a possibilidade de criar containers como Vector, list e
map, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suporte
para a programa¸˜o gen´rica
ca
e
Com ele ´ poss´ usar um tipo como uma parˆmetro na
e
ıvel
a
defini¸˜o de uma classe ou de uma fun¸˜o
ca
ca
”Tipo” n˜o se refere somente aos tipos b´sicos do C/C++,
a
a
uma vez que tamb´m ´ poss´ usar qualquer classe como
e e
ıvel
parˆmetro.
a
Podemos usar um tipo de classe como um parˆmetro de
a
entrada e definir um nome para ele, e assim, us´-lo
a
normalmente dentro de uma fun¸˜o ou classe
ca
Lucas Lellis e Rodrigo Torres
Templates e Operators
11. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
A partir do momento em que se define o template e o tipo
gen´rico, a fun¸˜o e a classe s˜o definidos normalmente, a
e
ca
a
declara¸˜o se d´ da seguinte forma:
ca
a
Exemplo:
template < typename /* ou class */ Tipo >
Podemos usar ”class” ou ”typename”, qualquer um dos dois
funciona da mesma forma, muitos optam por ”class”, por ser mais
simples de digitar. Outros preferem ”typename” pois isso sugere
que o parˆmetro n˜o precisa ser necessariamente uma classe.
a
a
Lucas Lellis e Rodrigo Torres
Templates e Operators
13. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Fun¸oes template
c˜
Esse tipo de estrutura possibilita a cria¸˜o de classes e
ca
fun¸˜es generalistas, podendo ser aplicado ` outras situa¸˜es.
co
a
co
Um grande benef´ dos templates ´ o feedback imediato
ıcio
e
quanto ` erros durante a compila¸˜o, assim, ´ poss´ evitar,
a
ca
e
ıvel
ou corrigir esses erros, como a utiliza¸˜o de classes
ca
incompat´
ıveis, antes mesmo de executar o programa pela
primeira vez.
Lucas Lellis e Rodrigo Torres
Templates e Operators
14. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Abaixo, o exemplo de uma fun¸˜o bem simples, usando esse
ca
recurso.
teste
template <class T> //no lugar de class tambem pode ser
usado typename
void soma (T a, T b)
{
T soma = a + b; /*A funcao so ira funcionar em classes
que suportem a utilizacao do operador ’+’ */
cout << soma;
}
Lucas Lellis e Rodrigo Torres
Templates e Operators
15. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Em muitos casos, utilizam-se operadores, como o de adi¸˜o, o
ca
de atribui¸˜o, ou o de sa´
ca
ıda. A utiliza¸˜o deles n˜o ´ feita de
ca
a e
forma abstrata, assim, nesses casos, ser´ necess´ria a
a
a
implementa¸˜o da sobrecarga de operadores, e possivelmente,
ca
do construtor c´pia.
o
Lucas Lellis e Rodrigo Torres
Templates e Operators
16. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Em muitos casos, utilizam-se operadores, como o de adi¸˜o, o
ca
de atribui¸˜o, ou o de sa´
ca
ıda. A utiliza¸˜o deles n˜o ´ feita de
ca
a e
forma abstrata, assim, nesses casos, ser´ necess´ria a
a
a
implementa¸˜o da sobrecarga de operadores, e possivelmente,
ca
do construtor c´pia.
o
Muitas vezes n˜o ´ necess´rio passar o tipo de dados como
a e
a
parˆmetro ao utilizar uma fun¸˜o template simples.
a
ca
Lucas Lellis e Rodrigo Torres
Templates e Operators
20. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
1
2
3
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Nesse ultimo caso, se n˜o houver o operador de adi¸˜o, o
´
a
ca
c´digo n˜o ir´ compilar.
o
a a
´ ´bvio que no caso das somas a + b e x + y , isso ocorrer´
Eo
a
normalmente, mas n˜o pode-se afirmar com certeza quanto a
a
c1 e c2.
Para ser utilizada a fun¸˜o soma, nesse exemplo, a fun¸˜o
ca
ca
coordenada deve ter a fun¸˜o de sobrecarga dos operadores
ca
soma + e sa´ <<, ou o c´digo n˜o ir´ compilar.
ıda
o
a a
Lucas Lellis e Rodrigo Torres
Templates e Operators
21. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Classes template
O mesmo princ´ pode ser utilizado para definir classes gen´ricas,
ıpio
e
ou containers, como a classe array, da biblioteca padr˜o. A classe ´
a
e
definida da seguinte forma:
exemplo
template <class T, size_t N> class array;
Nesse caso, s˜o recebidos dois parˆmetros, separados por uma
a
a
v´
ırgula, o primeiro ´ uma classe, que ir´ definir o tipo de dados que
e
a
comp˜e esse array, e o segundo, um valor representando um
o
tamanho fixo.
Lucas Lellis e Rodrigo Torres
Templates e Operators
22. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Fun¸˜es Template
co
Classes Template
Neste caso, foi instanciado um array do tipo int com 10 posi¸˜es, a
co
classe array possui um operador que permite um acesso r´pido `
a
a
cada elemento, e retorna um valor do tipo T ( int ).
exemplo
main()
{
std::array <int,10> myarray;
for (int i = 0; i < 10; i++)
myarray[i] = i * 10;
for (i=0; i<10; i++)
cout << myarray[i];
}
Lucas Lellis e Rodrigo Torres
Templates e Operators
26. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Sobrecarga de operadores
1
Operator ´ um recurso que possibilita a cria¸˜o de fun¸˜es
e
ca
co
que atuam sob operadores.
2
Quando bem utilizado, esse recurso pode auxiliar tamb´m na
e
implanta¸˜o de templates, como visto anteriormente.
ca
Lucas Lellis e Rodrigo Torres
Templates e Operators
27. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Sobrecarga de operadores
1
Operator ´ um recurso que possibilita a cria¸˜o de fun¸˜es
e
ca
co
que atuam sob operadores.
2
Quando bem utilizado, esse recurso pode auxiliar tamb´m na
e
implanta¸˜o de templates, como visto anteriormente.
ca
3
Para ser utilizada a fun¸˜o soma, nesse exemplo, a fun¸˜o
ca
ca
coordenada deve ter a fun¸˜o de sobrecarga dos operadores
ca
soma + e sa´ <<, ou o c´digo n˜o ir´ compilar.
ıda
o
a a
Lucas Lellis e Rodrigo Torres
Templates e Operators
28. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Sobrecarga de operadores
1
Operator ´ um recurso que possibilita a cria¸˜o de fun¸˜es
e
ca
co
que atuam sob operadores.
2
Quando bem utilizado, esse recurso pode auxiliar tamb´m na
e
implanta¸˜o de templates, como visto anteriormente.
ca
3
Para ser utilizada a fun¸˜o soma, nesse exemplo, a fun¸˜o
ca
ca
coordenada deve ter a fun¸˜o de sobrecarga dos operadores
ca
soma + e sa´ <<, ou o c´digo n˜o ir´ compilar.
ıda
o
a a
4
A sobrecarga de operadores consegue abstrair fun¸˜es
co
complexas com elegˆncia e simplicidade. Podendo ser
a
utilizada, por exemplo para uma soma ou multiplica¸˜o de
ca
matrizes.
Lucas Lellis e Rodrigo Torres
Templates e Operators
29. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Em C++ podemos fazer sobrecarga de fun¸˜es, ou seja, podemos
co
criar duas fun¸˜es com o mesmo nome, desde que seus parˆmetros
co
a
n˜o sejam semelhantes.
a
Exemplo ( C++ )
int soma ( int a, int b) {
return a + b;
}
int soma ( int a, int b, int c ) {
return a + b + c;
}
Lucas Lellis e Rodrigo Torres
Templates e Operators
30. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Parˆmetros ”default”
a
As fun¸˜es operadoras que podem ser declaradas s˜o:
co
a
Operadores
+ - * / % ^ & | ~! = < > += -= *= /= %= ^= &= |= >> <<
>>= <<= == != <= >= && || ++ -- ->* , -> [] 90
new new[] delete delete[]
Lucas Lellis e Rodrigo Torres
Templates e Operators
31. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Um operator ´ uma fun¸˜o, que ´ declarada com o nome
e
ca
e
’operator’ seguido de um dos operadores apresentados
anteriormente. A implementa¸˜o interna de um operador ´
ca
e
idˆntica a de uma fun¸˜o comum, com algumas particularidades.
e
ca
Exemplo
class Circulo {
public:
int x, y, r;
Circulo operator+= ( const Circulo &other ){
x = img.x;
y = img.y;
r = img.r;
}
};
Lucas Lellis e Rodrigo Torres
Templates e Operators
33. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Operadores Bin´rios e Un´rios
a
a
1
Um operador bin´rio definido por uma fun¸˜o n˜o-membro
a
ca a
recebe duas entradas ao mesmo tempo.
2
Em alguns casos, h´ a necessidade de realizar a sobrecarga de
a
operadores, ou seja, criar v´rias vers˜es do operador @ de
a
o
forma que o operador abranja o maior numero de opera¸˜es
co
poss´
ıvel.
Lucas Lellis e Rodrigo Torres
Templates e Operators
34. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Operadores Bin´rios e Un´rios
a
a
1
Um operador bin´rio definido por uma fun¸˜o n˜o-membro
a
ca a
recebe duas entradas ao mesmo tempo.
2
Em alguns casos, h´ a necessidade de realizar a sobrecarga de
a
operadores, ou seja, criar v´rias vers˜es do operador @ de
a
o
forma que o operador abranja o maior numero de opera¸˜es
co
poss´
ıvel.
3
Esse operador pode ser definido como uma fun¸˜o membro
ca
n˜o-est´tica, esse tipo de fun¸˜o recebe apenas um
a
a
ca
parˆmetro, que ir´ interagir com o objeto do qual ele ´
a
a
e
membro. Ou, como uma fun¸˜o n˜o-membro, recebendo dois
ca a
parˆmetros que interagem entre si.
a
Lucas Lellis e Rodrigo Torres
Templates e Operators
35. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
Introdu¸˜o
ca
Parˆmetros default
a
Sobrecarga de Construtores e fun¸˜es da classe
co
Operadores bin´rios e un´rios
a
a
Exemplo
class X{
public:
void operator+ (int val ); //Operador interno, Objeto
X( int val );
};
void operator+ (X a, X b ); //Operadores externos
void operator+ (X a, double val );
void f(X a){
a + 1; // a.operator+ (1) - objeto ’a’ do tipo X
interagindo com um numero inteiro
1 + a; // ::operator+ (X(1), a) - Interpreta 1 como um
parametro do construtor X(int), interage com um
objeto ’a’ do tipo X
a + 1.0; // ::operator+ (a, 1.0) - objeto ’a’ do tipo
X interagindo com numero do tipo float
}
Lucas Lellis e Rodrigo Torres
Templates e Operators
36. Introdu¸˜o
ca
Templates
Operators
Conclus˜o
a
O que vem pela frente?
O que vem pela frente?
Teremos palestras todas as sextas-feiras, abordando cada vez
novos conceitos sobre C++. A pr´xima aula ter´ exerc´
o
a
ıcios
pr´ticos sobre Templates e Sobrecarga de operadores. Lembrando
a
que todas as apresenta¸˜es desse ciclo de palestras ser˜o colocadas
co
a
no moodle do PESL!
Nossos canais de comunica¸˜o
ca
1 MOODLE do PESL - Curso de C++ :
http://pinguim.pro.br/moodle/course/view.php?id=6
2
Portal do Programa de Educa¸˜o em Software Livre
ca
http://pinguim.pro.br/
3
Facebook: https://www.facebook.com/PESL.PInguim
4
Youtube: http://www.youtube.com/user/pinguimvideos/
Lucas Lellis e Rodrigo Torres
Templates e Operators