4.13.1 Reglas de buena práctica
§1 Preámbulo
En C++ existen una serie de reglas y consejos de buena práctica que ayudan a escribir mejores programas con menos errores. Hemos señalado que la "Biblia" del C++ [1] contiene al final de cada capítulo una serie de consejos ("Advice") que constituyen en sí mismos todo un compendio de programación C++ (las más de las veces incluyen cosas que no deben hacerse).
Scott Meyers [2] ha escrito dos libros muy populares sobre C++: "Effective C++" y "More Effective C++"; ambos publicados por Addison-Wesley, en los que se recogen una serie de recomendaciones y consejos de buena práctica. Algunas de ellas consideran tan importantes, que el compilador GNU cpp dispone de una opción especial (-Weffc++) que advierte cuando el código las contradice. Son las siguientes:
- Definir un constructor-copia (
4.11.2d4) y una versión
sobrecargada del operador de asignación (
4.9.18a) para clases que utilicen memoria dinámica (persistente
1.3.2). - Preferir inicialización antes que asignación en los constructores
(
4.11.2d3). - Hacer virtuales (
4.11.8a) los destructores (
4.11.2d2) en las superclases, en especial si
los constructores de las subclases asignan memoria con new. - Cuando se sobrecargue el operador de asignación =
(
4.9.18a),
disponerlo de forma que devuelva una referencia a *this (
4.11.6). - No devolver una referencia (
4.2.3) cuando se deba devolver un objeto. - Cuando se sobrecarguen los operadores de incremento ++
y decremento -- (
4.9.1), distinguir entre
las formas "Pre" y "Post" (
4.9.18c). - No sobrecargar nunca los operadores coma ,
(
4.9.5); Y lógico
&& (AND
4.9.8) y O lógico
||
(OR
4.9.8).
§2 Diseño canónico
Como regla general, no olvide que la definición de cualquier clase C que no sea trivial debe contener al menos:
- Un constructor por defecto: C::C();
- Un constructor-copia: C::C(const C&);
- Un operador de asignación para miembros de la clase: C& C::operator=(const C&);
- Un destructor: C::~C();
Cuando todos estos métodos son públicos, que es lo más frecuente, se dice que la clase adopta forma o diseño canónico. Pero son posibles toda clase de variantes para fines específicos. Por ejemplo: que los objetos no puedan ser libremente copiados, creados o asignados.