Ir para o conteúdo

Última atualização:2026-10-12

Pontos de atenção da lista de inicialização de membros em C++

Em C++, a inicialização correta das classes é um dos passos essenciais para garantir o funcionamento adequado do programa. Principalmente ao usar listas de inicialização, precisamos ficar atentos a algumas armadilhas potenciais, para evitar resultados inesperados durante a execução do código.

A lista de inicialização costuma ser considerada o método preferido para definir o estado de uma nova instância de classe, pois oferece uma forma concisa e eficiente de inicializar os membros da classe. No entanto, às vezes referenciar outras variáveis membro na lista de inicialização pode causar problemas confusos.

Exemplo do problema

Considere a seguinte classe 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();
}

Neste exemplo, tentamos inicializar length_, capacity_ e size_ referenciando outras variáveis membro na lista de inicialização. No entanto, como a ordem de inicialização dos membros da classe segue a ordem em que eles são declarados na classe, length_ e capacity_ podem não ser inicializados da forma que esperávamos.

Como resolver?

Para evitar esse problema, siga estes pontos:

1.Evite referenciar outras variáveis membro na lista de inicialização

2.Consistência de ordem: a inicialização das variáveis membro segue a ordem em que elas são declaradas na classe

Exemplo corrigido:

#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();
}

Tópicos relacionados

Comentários