Date post: | 05-Jul-2015 |
Category: |
Documents |
Upload: | peslpinguim |
View: | 136 times |
Download: | 3 times |
IntroducaoTemplatesOperatorsConclusao
Palestra: Templates e sobrecarga de operadores
Lucas LellisRodrigo Torres
PESL - Programa de Educacao em Software livreUniversidade Federal de Sao Paulo
18 de Outubro de 2013
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
1 Introducao
2 TemplatesIntroducaoFuncoes TemplateClasses Template
3 OperatorsIntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
4 ConclusaoO que vem pela frente?
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
Introducao
Hoje vamos falar sobre dois conceitos poderosos:
Uma poderosa ferramenta para a programacao generica, quesao os Templates.
Uma tecnica de abstracao muito interessante, que e asobrecarga de operadores.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
Introducao
Hoje vamos falar sobre dois conceitos poderosos:
Uma poderosa ferramenta para a programacao generica, quesao os Templates.
Uma tecnica de abstracao muito interessante, que e asobrecarga de operadores.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
Introducao
Hoje vamos falar sobre dois conceitos poderosos:
Uma poderosa ferramenta para a programacao generica, quesao os Templates.
Uma tecnica de abstracao muito interessante, que e asobrecarga de operadores.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motivacaoclara, a possibilidade de criar containers como Vector, list emap, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suportepara a programacao generica
Com ele e possıvel usar um tipo como uma parametro nadefinicao de uma classe ou de uma funcao
”Tipo” nao se refere somente aos tipos basicos do C/C++,uma vez que tambem e possıvel usar qualquer classe comoparametro.
Podemos usar um tipo de classe como um parametro deentrada e definir um nome para ele, e assim, usa-lonormalmente dentro de uma funcao ou classe
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motivacaoclara, a possibilidade de criar containers como Vector, list emap, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suportepara a programacao generica
Com ele e possıvel usar um tipo como uma parametro nadefinicao de uma classe ou de uma funcao
”Tipo” nao se refere somente aos tipos basicos do C/C++,uma vez que tambem e possıvel usar qualquer classe comoparametro.
Podemos usar um tipo de classe como um parametro deentrada e definir um nome para ele, e assim, usa-lonormalmente dentro de uma funcao ou classe
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motivacaoclara, a possibilidade de criar containers como Vector, list emap, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suportepara a programacao generica
Com ele e possıvel usar um tipo como uma parametro nadefinicao de uma classe ou de uma funcao
”Tipo” nao se refere somente aos tipos basicos do C/C++,uma vez que tambem e possıvel usar qualquer classe comoparametro.
Podemos usar um tipo de classe como um parametro deentrada e definir um nome para ele, e assim, usa-lonormalmente dentro de uma funcao ou classe
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motivacaoclara, a possibilidade de criar containers como Vector, list emap, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suportepara a programacao generica
Com ele e possıvel usar um tipo como uma parametro nadefinicao de uma classe ou de uma funcao
”Tipo” nao se refere somente aos tipos basicos do C/C++,uma vez que tambem e possıvel usar qualquer classe comoparametro.
Podemos usar um tipo de classe como um parametro deentrada e definir um nome para ele, e assim, usa-lonormalmente dentro de uma funcao ou classe
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Templates
O Template , ou ”Gabarito”, foi criado com uma motivacaoclara, a possibilidade de criar containers como Vector, list emap, funcionarem independentemente do tipo de classe.
Com o tempo, esse recurso se mostrou um grande suportepara a programacao generica
Com ele e possıvel usar um tipo como uma parametro nadefinicao de uma classe ou de uma funcao
”Tipo” nao se refere somente aos tipos basicos do C/C++,uma vez que tambem e possıvel usar qualquer classe comoparametro.
Podemos usar um tipo de classe como um parametro deentrada e definir um nome para ele, e assim, usa-lonormalmente dentro de uma funcao ou classe
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
A partir do momento em que se define o template e o tipogenerico, a funcao e a classe sao definidos normalmente, adeclaracao se da da seguinte forma:
Exemplo:
template < typename /* ou class */ Tipo >
Podemos usar ”class” ou ”typename”, qualquer um dos doisfunciona da mesma forma, muitos optam por ”class”, por ser maissimples de digitar. Outros preferem ”typename” pois isso sugereque o parametro nao precisa ser necessariamente uma classe.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Funcoes template
Esse tipo de estrutura possibilita a criacao de classes efuncoes generalistas, podendo ser aplicado a outras situacoes.
Um grande benefıcio dos templates e o feedback imediatoquanto a erros durante a compilacao, assim, e possıvel evitar,ou corrigir esses erros, como a utilizacao de classesincompatıveis, antes mesmo de executar o programa pelaprimeira vez.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Funcoes template
Esse tipo de estrutura possibilita a criacao de classes efuncoes generalistas, podendo ser aplicado a outras situacoes.
Um grande benefıcio dos templates e o feedback imediatoquanto a erros durante a compilacao, assim, e possıvel evitar,ou corrigir esses erros, como a utilizacao de classesincompatıveis, antes mesmo de executar o programa pelaprimeira vez.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Abaixo, o exemplo de uma funcao bem simples, usando esserecurso.
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
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Em muitos casos, utilizam-se operadores, como o de adicao, ode atribuicao, ou o de saıda. A utilizacao deles nao e feita deforma abstrata, assim, nesses casos, sera necessaria aimplementacao da sobrecarga de operadores, e possivelmente,do construtor copia.
Muitas vezes nao e necessario passar o tipo de dados comoparametro ao utilizar uma funcao template simples.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Em muitos casos, utilizam-se operadores, como o de adicao, ode atribuicao, ou o de saıda. A utilizacao deles nao e feita deforma abstrata, assim, nesses casos, sera necessaria aimplementacao da sobrecarga de operadores, e possivelmente,do construtor copia.
Muitas vezes nao e necessario passar o tipo de dados comoparametro ao utilizar uma funcao template simples.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Abaixo, um exemplo da utilizacao da funcao soma(), com trestipos de dados diferentes:
Exemplo
main () {
int a = 10, b = 15;
double x = 13, y = 34,87;
Coordenada c1(10,52), c2(25,58);
soma(a,b);
soma(x,y);
soma(c1,c2); //Precisa de sobrecarga de operador
}
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
1 Nesse ultimo caso, se nao houver o operador de adicao, ocodigo nao ira compilar.
2 E obvio que no caso das somas a + b e x + y , isso ocorreranormalmente, mas nao pode-se afirmar com certeza quanto ac1 e c2.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
1 Nesse ultimo caso, se nao houver o operador de adicao, ocodigo nao ira compilar.
2 E obvio que no caso das somas a + b e x + y , isso ocorreranormalmente, mas nao pode-se afirmar com certeza quanto ac1 e c2.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
1 Nesse ultimo caso, se nao houver o operador de adicao, ocodigo nao ira compilar.
2 E obvio que no caso das somas a + b e x + y , isso ocorreranormalmente, mas nao pode-se afirmar com certeza quanto ac1 e c2.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Classes template
O mesmo princıpio pode ser utilizado para definir classes genericas,ou containers, como a classe array, da biblioteca padrao. A classe edefinida da seguinte forma:
exemplo
template <class T, size_t N> class array;
Nesse caso, sao recebidos dois parametros, separados por umavırgula, o primeiro e uma classe, que ira definir o tipo de dados quecompoe esse array, e o segundo, um valor representando umtamanho fixo.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Neste caso, foi instanciado um array do tipo int com 10 posicoes, aclasse array possui um operador que permite um acesso rapido acada 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
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Esta e so uma introducao aos templates, existem muitosoutros recursos especıficos do template que nao foramabordados.
Recomendamos um estudo aprofundado atraves dabibliografia.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoFuncoes TemplateClasses Template
Esta e so uma introducao aos templates, existem muitosoutros recursos especıficos do template que nao foramabordados.
Recomendamos um estudo aprofundado atraves dabibliografia.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Sobrecarga de operadores
1 Operator e um recurso que possibilita a criacao de funcoesque atuam sob operadores.
2 Quando bem utilizado, esse recurso pode auxiliar tambem naimplantacao de templates, como visto anteriormente.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
4 A sobrecarga de operadores consegue abstrair funcoescomplexas com elegancia e simplicidade. Podendo serutilizada, por exemplo para uma soma ou multiplicacao dematrizes.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Sobrecarga de operadores
1 Operator e um recurso que possibilita a criacao de funcoesque atuam sob operadores.
2 Quando bem utilizado, esse recurso pode auxiliar tambem naimplantacao de templates, como visto anteriormente.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
4 A sobrecarga de operadores consegue abstrair funcoescomplexas com elegancia e simplicidade. Podendo serutilizada, por exemplo para uma soma ou multiplicacao dematrizes.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Sobrecarga de operadores
1 Operator e um recurso que possibilita a criacao de funcoesque atuam sob operadores.
2 Quando bem utilizado, esse recurso pode auxiliar tambem naimplantacao de templates, como visto anteriormente.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
4 A sobrecarga de operadores consegue abstrair funcoescomplexas com elegancia e simplicidade. Podendo serutilizada, por exemplo para uma soma ou multiplicacao dematrizes.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Sobrecarga de operadores
1 Operator e um recurso que possibilita a criacao de funcoesque atuam sob operadores.
2 Quando bem utilizado, esse recurso pode auxiliar tambem naimplantacao de templates, como visto anteriormente.
3 Para ser utilizada a funcao soma, nesse exemplo, a funcaocoordenada deve ter a funcao de sobrecarga dos operadoressoma + e saıda <<, ou o codigo nao ira compilar.
4 A sobrecarga de operadores consegue abstrair funcoescomplexas com elegancia e simplicidade. Podendo serutilizada, por exemplo para uma soma ou multiplicacao dematrizes.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Em C++ podemos fazer sobrecarga de funcoes, ou seja, podemoscriar duas funcoes com o mesmo nome, desde que seus parametrosnao sejam semelhantes.
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
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Parametros ”default”
As funcoes operadoras que podem ser declaradas sao:
Operadores
+ - * / % ^ & | ~! = < > += -= *= /= %= ^= &= |= >> <<
>>= <<= == != <= >= && || ++ -- ->* , -> [] 90
new new[] delete delete[]
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Um operator e uma funcao, que e declarada com o nome’operator’ seguido de um dos operadores apresentadosanteriormente. A implementacao interna de um operador eidentica a de uma funcao comum, com algumas particularidades.
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
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Operadores Binarios e Unarios
1 Um operador binario definido por uma funcao nao-membrorecebe duas entradas ao mesmo tempo.
2 Em alguns casos, ha a necessidade de realizar a sobrecarga deoperadores, ou seja, criar varias versoes do operador @ deforma que o operador abranja o maior numero de operacoespossıvel.
3 Esse operador pode ser definido como uma funcao membronao-estatica, esse tipo de funcao recebe apenas umparametro, que ira interagir com o objeto do qual ele emembro. Ou, como uma funcao nao-membro, recebendo doisparametros que interagem entre si.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Operadores Binarios e Unarios
1 Um operador binario definido por uma funcao nao-membrorecebe duas entradas ao mesmo tempo.
2 Em alguns casos, ha a necessidade de realizar a sobrecarga deoperadores, ou seja, criar varias versoes do operador @ deforma que o operador abranja o maior numero de operacoespossıvel.
3 Esse operador pode ser definido como uma funcao membronao-estatica, esse tipo de funcao recebe apenas umparametro, que ira interagir com o objeto do qual ele emembro. Ou, como uma funcao nao-membro, recebendo doisparametros que interagem entre si.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
Operadores Binarios e Unarios
1 Um operador binario definido por uma funcao nao-membrorecebe duas entradas ao mesmo tempo.
2 Em alguns casos, ha a necessidade de realizar a sobrecarga deoperadores, ou seja, criar varias versoes do operador @ deforma que o operador abranja o maior numero de operacoespossıvel.
3 Esse operador pode ser definido como uma funcao membronao-estatica, esse tipo de funcao recebe apenas umparametro, que ira interagir com o objeto do qual ele emembro. Ou, como uma funcao nao-membro, recebendo doisparametros que interagem entre si.
Lucas Lellis e Rodrigo Torres Templates e Operators
IntroducaoTemplatesOperatorsConclusao
IntroducaoParametros default
Sobrecarga de Construtores e funcoes da classeOperadores binarios e unarios
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
IntroducaoTemplatesOperatorsConclusao
O que vem pela frente?
O que vem pela frente?
Teremos palestras todas as sextas-feiras, abordando cada veznovos conceitos sobre C++. A proxima aula tera exercıciospraticos sobre Templates e Sobrecarga de operadores. Lembrandoque todas as apresentacoes desse ciclo de palestras serao colocadasno moodle do PESL!
Nossos canais de comunicacao
1 MOODLE do PESL - Curso de C++ :http://pinguim.pro.br/moodle/course/view.php?id=6
2 Portal do Programa de Educacao em Software Livrehttp://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