Saltar a contenido

Ú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

Comentarios