Última actualización:2026-10-12
Puntos a tener en cuenta sobre la lista de inicialización de miembros en C++¶
En C++, la correcta inicialización de las clases es uno de los pasos clave para asegurar el funcionamiento normal del programa. En especial, al usar la lista de inicialización debemos prestar atención a algunas trampas potenciales para evitar resultados inesperados durante la ejecución del código.
La lista de inicialización suele considerarse el método preferido para establecer el estado de una nueva instancia de una clase, ya que ofrece una forma concisa y eficiente de inicializar los miembros de la clase. Sin embargo, a veces referenciar otras variables miembro dentro de la lista de inicialización puede provocar problemas desconcertantes.
Ejemplo del problema¶
Consideremos la siguiente clase Foo:
#include <iostream>
class Foo
{
public:
Foo(int size) : size_(size),
capacity_(size_ + 2),
length_(capacity_)
{}
void print() {
std::cout << "Size: " << size_ << " Capacity: " << capacity_ << " Length: " << length_ << std::endl;
}
private:
int length_;
int capacity_;
int size_;
};
int main() {
Foo foo(50);
foo.print();
}
En este ejemplo intentamos inicializar length_, capacity_ y size_ referenciando otras variables miembro en la lista de inicialización. Sin embargo, como el orden de inicialización de los miembros de la clase sigue el orden en que se declaran en la clase, puede ocurrir que length_ y capacity_ no se inicialicen de la forma que esperábamos.
Cómo resolverlo?¶
Para evitar este tipo de problemas, se deberían seguir los siguientes puntos:
1. Evitar referenciar otras variables miembro en la lista de inicialización
2. Coherencia de orden: el orden de inicialización de las variables miembro es el orden en que se declaran en la clase
Ejemplo corregido:
#include <iostream>
class Foo
{
public:
Foo(int size) : size_(size),
capacity_(size_ + 2),
length_(calculateLength(size_))
{}
void print() {
std::cout << "Size: " << size_ << " Capacity: " << capacity_ << " Length: " << length_ << std::endl;
}
private:
int calculateLength(int size) {
return size + 2;
}
private:
int size_;
int capacity_;
int length_;
};
int main() {
Foo foo(50);
foo.print();
}
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事