Constructores: Ejemplo
int main(){
string a("Hello");
string b();
string c = string("World");
// ...
return 0;
}
Trampa: string
b();
Esta expresión no construye b un objeto
de tipo string. Sin embargo, esto es el prototipo para una función
b sin argumentos y que devuelve un string.
Moraleja:
Recuerde omitir el () invocando
al constructor de falta.
![](../images/flechaarriba.gif)
Constructores: Ejemplo
template<typename T>
class Array
{
public:
Array(int size);
T& operator[](int);
Array<T>& operator=(const
Array<T>&);
// ...
};
int main()
{ Array<double> a(10);
a[0]
= 0; a[1] = 1; a[2] = 4;
a[3]
= 9; a[4] = 16;
a[5]
= 25; a = 36; a[7] = 49;
a[8]
= 64; a[9] = 81;
//
...
return
0;
}
Trampa:
a
= 36;
Sorprendentemente, compila:
a = Array<double>(36);
a es reemplazadopor un nuevo array de
36 numeros.
Moraleja:
Los constructores con un argumento
actuan tambien como conversiones de tipo. Evita los constructores
con un único argumento de tipo entero. Utiliza la palabra
clave explicit si no puedes evitarlo.
![](../images/flechaarriba.gif)
Herencia:
Ejemplo
void Manager::print() const
{ Employee:print(); // print base class
cout << dept() << endl;
}
Trampa:
Employee:print();
Deberia ser:
Employee::print();
Pero ¿por qué compila? Pues porque
Employee: es una etiqueta de goto.
Moraleja:
Incluso las propias caracteristicas
del lenguaje pueden engañarnos.
![](../images/flechaarriba.gif)
|