Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Aula04

130 views

Published on

  • Be the first to comment

  • Be the first to like this

Aula04

  1. 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
  2. 2. Introdu¸˜o ca Templates Operators Conclus˜o a 1 Introdu¸˜o ca 2 Templates Introdu¸˜o ca Fun¸˜es Template co Classes Template 3 4 Operators Introdu¸˜o ca Parˆmetros default a Sobrecarga de Construtores e fun¸˜es da classe co Operadores bin´rios e un´rios a a Conclus˜o a O que vem pela frente? Lucas Lellis e Rodrigo Torres Templates e Operators
  3. 3. Introdu¸˜o ca Templates Operators Conclus˜o a Introdu¸˜o ca Hoje vamos falar sobre dois conceitos poderosos: Lucas Lellis e Rodrigo Torres Templates e Operators
  4. 4. 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 Lucas Lellis e Rodrigo Torres Templates e Operators
  5. 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
  6. 6. 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. Lucas Lellis e Rodrigo Torres Templates e Operators
  7. 7. 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 Lucas Lellis e Rodrigo Torres Templates e Operators
  8. 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. 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. 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. 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
  12. 12. 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 Lucas Lellis e Rodrigo Torres Templates e Operators
  13. 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. 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. 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. 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
  17. 17. Introdu¸˜o ca Templates Operators Conclus˜o a Introdu¸˜o ca Fun¸˜es Template co Classes Template Abaixo, um exemplo da utiliza¸˜o da fun¸˜o soma(), com trˆs ca ca e tipos 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
  18. 18. Introdu¸˜o ca Templates Operators Conclus˜o a 1 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 Lucas Lellis e Rodrigo Torres Templates e Operators
  19. 19. Introdu¸˜o ca Templates Operators Conclus˜o a 1 2 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. Lucas Lellis e Rodrigo Torres Templates e Operators
  20. 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. 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. 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
  23. 23. Introdu¸˜o ca Templates Operators Conclus˜o a Introdu¸˜o ca Fun¸˜es Template co Classes Template Esta ´ s´ uma introdu¸˜o aos templates, existem muitos e o ca outros recursos espec´ ıficos do template que n˜o foram a abordados. Lucas Lellis e Rodrigo Torres Templates e Operators
  24. 24. Introdu¸˜o ca Templates Operators Conclus˜o a Introdu¸˜o ca Fun¸˜es Template co Classes Template Esta ´ s´ uma introdu¸˜o aos templates, existem muitos e o ca outros recursos espec´ ıficos do template que n˜o foram a abordados. Recomendamos um estudo aprofundado atrav´s da e bibliografia. Lucas Lellis e Rodrigo Torres Templates e Operators
  25. 25. 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. Lucas Lellis e Rodrigo Torres Templates e Operators
  26. 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. 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. 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. 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. 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. 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
  32. 32. 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. Lucas Lellis e Rodrigo Torres Templates e Operators
  33. 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. 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. 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. 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

×