Archive for Junho 2009
Mais Sobre Construtores em C++
Dessa vez não vou falar muito mas sim exemplifiar um dos features (hehehe) do C++ que são as diferentes maneiras de “construir” um objeto. O código está todo em um arquivo para facilidar a visualização aqui no blog.
Eis o código:
#include <iostream>
using std::cout;
class Teste
{
char tipo;
int valorInt;
char valorChar;
double valorDouble;
public:
Teste(const Teste& t)
{
tipo = t.getTipo();
valorInt = t.getValorInt();
valorChar = t.getValorChar();
valorDouble = t.getValorDouble();
}
Teste(char v)
{
tipo = 'c';
valorInt = 0;
valorChar = v;
valorDouble = 0;
}
Teste(int v)
{
tipo = 'i';
valorInt = v;
valorChar = 0;
valorDouble = 0;
}
Teste(double v)
{
tipo = 'd';
valorInt = 0;
valorChar = 0;
valorDouble = v;
}
char getValorChar() const { return valorChar; };
int getValorInt() const { return valorInt; };
double getValorDouble() const { return valorDouble; };
char getTipo() const { return tipo; };
void imprimeValor() const
{
if (tipo == 'c') cout << valorChar;
else if (tipo == 'd') cout << valorDouble;
else cout << valorInt;
cout << '\n';
};
~Teste() {};
};
int main()
{
Teste a = 1;
Teste b = 'm';
Teste c = 3.1417;
Teste d = (Teste)2;
Teste e = a;
Teste f(100);
Teste g = static_cast<Teste>('a');
a.imprimeValor();
b.imprimeValor();
c.imprimeValor();
d.imprimeValor();
e.imprimeValor();
f.imprimeValor();
g.imprimeValor();
}
E a saída correspondente:
1
m
3.1417
2
1
100
a
Internamente todas as formas de construir o objeto fazem a mesma coisa: procuram um construtor que espere aquele tipo de parâmetro e cria um objeto (no caso Teste).
Claro que isso pode ser modificado se sobrecarregarmos o operator=, operator() (unário) ou usar a keyword explicit na declaração dos construtores.