Aula 04 - Templates e Operators

36
Introdu¸ ao Templates Operators Conclus˜ ao Palestra: Templates e sobrecarga de operadores Lucas Lellis Rodrigo Torres PESL - Programa de Educa¸ ao em Software livre Universidade Federal de S˜ ao Paulo 18 de Outubro de 2013 Lucas Lellis e Rodrigo Torres Templates e Operators

description

Nessa aula apresentamos um novo recurso interessantes, os templates e a sobrecarga de operadores em C++.

Transcript of Aula 04 - Templates e Operators

Page 1: Aula 04 - Templates e Operators

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

Page 2: Aula 04 - 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

Page 3: Aula 04 - 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

Page 4: Aula 04 - 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

Page 5: Aula 04 - 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

Page 6: Aula 04 - 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

Page 7: Aula 04 - 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

Page 8: Aula 04 - 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

Page 9: Aula 04 - 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

Page 10: Aula 04 - 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

Page 11: Aula 04 - 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

Page 12: Aula 04 - 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

Page 13: Aula 04 - 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

Page 14: Aula 04 - 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

Page 15: Aula 04 - 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

Page 16: Aula 04 - 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

Page 17: Aula 04 - 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

Page 18: Aula 04 - 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

Page 19: Aula 04 - 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

Page 20: Aula 04 - 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

Page 21: Aula 04 - 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

Page 22: Aula 04 - 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

Page 23: Aula 04 - 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

Page 24: Aula 04 - 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

Page 25: Aula 04 - 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

Page 26: Aula 04 - 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

Page 27: Aula 04 - 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

Page 28: Aula 04 - 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

Page 29: Aula 04 - 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

Page 30: Aula 04 - 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

Page 31: Aula 04 - 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

Page 32: Aula 04 - 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

Page 33: Aula 04 - 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

Page 34: Aula 04 - 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

Page 35: Aula 04 - 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

Page 36: Aula 04 - 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