Curso de Extensão: Linguagem de Programação C++ (Básico)


Faculdade de Informática, PUCRS, Porto Alegre, RS

Coordenação: Isabel Harb Manssour


Instrutores: Eduardo Bezerra e Cristiane Woszezenki



Operador de resolução de escopo, sobrecarga de funções, templates


Operador unário de resolução de escopo

É possível declarar variáveis locais e globais com o mesmo nome dentro de um bloco. Para acessar uma variável global quando uma variával local com o mesmo nome está no escopo, usa-se o operador :: (resolução de escopo).
Exemplo:
int ref = 1000;
void main(void)
{
   int j = 0;
   if (j = = 0)
   {
      int ref = 2;
      cout << ref * ::ref << endl;
   }
}

Sobrecarga de funções

Sobrecarga de funções é um recurso implementado em C++ que possibilita definições de várias funções com o mesmo nome, desde que tenham parâmetros diferentes. Quando uma função é chamada, o código seleciona a função apropriada examinando os argumentos.

Exemplo:

int quadrado(int x)
{
   return x * x;
}
double quadrado (double y)
{
   return y * y;
}
void main(void)
{
   int r1;
   int f1;
   r1 = quadrado( 7 );
   f1 = quadrado ( 2.2 );
   cout << “r1 = ” << r1 << “, f1 = ” << f1 << endl;
}


Resultado: r1 = 49, f1 = 4.84



Templates

Se a lógica dos programas e suas operações são idênticas para os vários tipos de dados, isto pode ser codificado mais convenientemente usando os gabaritos (templates) de função. Dependendo dos tipos dos parâmetros nas chamadas da função, o C++ gera automaticamente funções gabarito para tratar cada tipo de chamada adequadamente.

Exemplo:

template <class T>
T maximo (T valor1, T valor2, T valor3)
{
   T max = valor 1;
   if (valor2 > max)
      max = valor2;
   if (valor3 > max)
      max = valor 3;
   return max; 
}


Este template declara um parâmetro formal T, como tipo de dados que serão testados pela função. O compilador substitui T ao longo de toda definição do template na compilação e é gerado uma função completa.

int maximo (int valor1, int valor2, int valor3)
{
   int max = valor1;
   if (valor2 > max)
      max = valor2;
   if (valor3 > max)
      max = valor3;
   return max;
}
template <class T>
T Maximo (T valor1, T valor2, T valor3)
{
   T max = valor1;
   if (valor2 > max)
      max = valor2;
   if (valor3 > max)
      max = valor3;
   return max; 
}
void main(void)
{
   int i1, i2, i3;
   cout << “Escreva 3 valores inteiros: ”;
   cin >> i1 >> i2 >> i3;
   cout << “O maior valor e: ” << Maximo (i1, i2, i3) << endl;
   double d1, d2, d3;
   cout << “Escreva 3 valores reais: ”;
   cin >> d1 >> d2 >> d3;
   cout << “O maior valor e: ” << Maximo (d1, d2, d3) << endl;
}

Outro exemplo:

#include <iostream>
using namespace std;

template <class T>
void swap_edu(T &x, T &y)
{
   T h = x;
   x = y;
   y = h;
}

int main()
{
   char c = 'z', d = 'a';
   cout << "CHAR" << endl << "----" << endl;
   cout << "B4 c = " << c << ", d = " << d << endl;
   swap_edu(c, d);
   cout << "After c = " << c << ", d = " << d << endl << endl;

   int n = 5, m = 6;
   cout << "INT" << endl << "---" << endl;
   cout << "B4 n = " << n << ", m = " << m << endl;
   swap_edu(n, m);
   cout << "After n = " << n << ", m = " << m << endl;
   return 0;
}