Archive for June 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.