13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 536 — #574<br />

✐<br />

Apéndice B. Directrices de Programación<br />

usan objetos miembro). (Vea el Capítulo 14.) Si no lo hace, el constructor por<br />

defecto será invocado desde la case base (o el objeto miembro) y con mucha<br />

probabilidad no hará lo que usted espera. Para invocar el constructor de copia<br />

de la clase base, pásele el objeto derivado desde el que está copiando:<br />

Derived(const Derived& d) : Base(d) { // ...<br />

39. Cuando escriba un operador de asignación para una clase derivada, recuerde<br />

llamar explícitam<strong>en</strong>te al operador de asignación de la clase base. (Vea el Capítulo<br />

14.) SI no lo hace, no ocurrirá nada (lo mismo es aplicable a los objetos<br />

miembro). Para invocar el operador de asignación de la clase base, use el nombre<br />

de la clase base y el operador de resolución de ámbito:<br />

Derived& operator=(const Derived& d) {<br />

Base::operator=(d);<br />

40. Si necesita minimizar las recompilaciones durante el desarrollo de un proyecto<br />

largo, use FIXME: demostrada <strong>en</strong> el Capítulo 5, y eliminela solo si la efici<strong>en</strong>cia<br />

<strong>en</strong> tiempo de ejecución es un problema.<br />

41. Evite el preprocesador. Use siempre const para substitución de valores e inlines<br />

para las machos.<br />

42. Mant<strong>en</strong>ga los ámbitos tan pequeños como sea posible de modo que la visibilidad<br />

y el tiempo de vidad de los objetos sea lo más pequeño posible. Esto reduce<br />

el peligro de usar un objeto <strong>en</strong> el contexto equivocado y ello supone un bug dificil<br />

de <strong>en</strong>contrar. Por ejemplo, suponga que ti<strong>en</strong>e un cont<strong>en</strong>edor y un trozo de<br />

código que itera sobre él. Si copia el código para usarlo otro cont<strong>en</strong>edor, puede<br />

que accid<strong>en</strong>talm<strong>en</strong>te acabe usando el tamaño del primer cont<strong>en</strong>edor como<br />

el límite superior del nuevo. Pero, si el primer cont<strong>en</strong>dor estuviese fuera del<br />

ámbito, podría detectar el error <strong>en</strong> tiempo de compilación.<br />

43. Evite las variables globales. Esfuercese <strong>en</strong> pones los datos d<strong>en</strong>tro de clases. En<br />

más probable que aparezcan funciones globales de forma natural que variables<br />

globales, aunque puede que después descubra que una función global puede<br />

<strong>en</strong>cajar como método estático de una clase.<br />

44. Si necesita declara una clase o función de una librería, hágalo siempre incluy<strong>en</strong>do<br />

su fichero de cabecera. Por ejemplo, si quiere crear una función para escribir<br />

<strong>en</strong> un ostream, no declare nunca el ostream por usted mismo, usando una<br />

especificación de tipo incompleta como esta:<br />

class ostream;<br />

Este <strong>en</strong>foque hace que su código sea vulnerabla a cambios <strong>en</strong> la repres<strong>en</strong>tación.<br />

(Por ejmplo, ostream podrías ser <strong>en</strong> realidad un typedef.) En lugar de lo<br />

anterior, use siempre el ficheor de cabecera:<br />

#include <br />

Cuando cree sus propias clases, si una librería es grande, proporciones a sus<br />

usuarios una versión abreviada del fichero de cabecera con especificaciones<br />

de tipo incompletas (es decir, declaraciones de los nombres de las clases) para<br />

536<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!