BUSCAR
INICIO
MAPA
FAQs
UTILIDADES
GLOSARIO
REGISTRO
COLABORAR
QUIENES SOMOS

USUARIO

PASSWORD

Trampas (Pitfalls)

A continuación mostramos una serie códigos que :

Compilan
Se ensamblan
Se ejecutan
Pero se obtienen resultados imprevistos

Por ejemplo,

if (-0.5 <= x <= 0.5) return 0;

Trampa:

if (-0.5 <= x <= 0.5) return 0;

Esta expresión no comprueba la condición matemática

-0.5 <= x <= 0.5

En lugar, calcula el resultado de -0.5 <= x, que será 0 o 1, y entonces compara ese resultado con 0.5

Moraleja: Aunque C++ tiene el tipo bool, los tipos lógicos se convierte libremente en int, con lo cual, el compilador no daria ningun tipo de error.

Si deseas ver más ejemplos, encontraras en la página de Cay S. Horstmann


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.