Ú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¶
- Funções virtuais puras e classes abstratas em C++ | C++那些事
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Implementando polimorfismo de C++ em linguagem C | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事