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.
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.
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.
|