Eu tenho aula
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Onde é o melhor lugar para inicializar a string s
no arquivo de origem?
c++
static
initialization
constants
Thomas
fonte
fonte
i
deve ser definido no cpp. §9.4.2 / 4 Se um membro de dados estáticos for do tipo const integral ou de enumeração const, sua declaração na definição de classe pode especificar um inicializador constante que deve ser uma expressão constante integral (5.19). Nesse caso, o membro pode aparecer em expressões constantes integrais. O membro ainda deve ser definido em um escopo de espaço para nome, se for usado no programa e a definição do escopo de espaço para nome não deve conter um inicializador.i
teria que ser ser definido unicamente se ele foi usado em algum outro lugar do que em expressões constantes integrais, certo? Nesse caso, você não pode dizer que há um erro porque não há contexto suficiente para ter certeza - ou, estritamente falando, o exemplo acima está correto se não houver outro código. Agora eu aprecio o seu comentário (+1), ainda estou aprendendo as coisas! Então, eu vou tentar esclarecer esse ponto na resposta, por favor, deixe-me saber se é melhor ...int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
Observe que o C ++ 11 permite chamar funções 'constexpr':constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Os membros estáticos precisam ser inicializados em uma unidade de tradução .cpp no escopo do arquivo ou no espaço para nome apropriado:
fonte
Em uma unidade de tradução dentro do mesmo espaço para nome, geralmente na parte superior:
fonte
Desde C ++ 17, o especificador em linha também se aplica a variáveis. Agora você pode definir variáveis de membro estáticas na definição de classe:
fonte
Somente valores integrais (por exemplo,
static const int ARRAYSIZE
) são inicializados no arquivo de cabeçalho porque geralmente são usados no cabeçalho da classe para definir algo como o tamanho de uma matriz. Valores não integrais são inicializados no arquivo de implementação.fonte