Hoje eu tenho um problema. Estou precisando de uma static
função de membro, const
não é uma obrigação, mas uma melhor. Mas eu não tive sucesso em meus esforços. Alguém pode dizer por que ou como?
Hoje eu tenho um problema. Estou precisando de uma static
função de membro, const
não é uma obrigação, mas uma melhor. Mas eu não tive sucesso em meus esforços. Alguém pode dizer por que ou como?
Respostas:
Quando você aplica o const
qualificador a uma função de membro não estático, ele afeta o this
ponteiro. Para uma função de membro qualificada por const da classe C
, o this
ponteiro é do tipo C const*
, enquanto para uma função de membro que não é qualificada por const, o this
ponteiro é do tipo C*
.
Uma função de membro estático não tem um this
ponteiro (tal função não é chamada em uma instância particular de uma classe), então a qualificação const de uma função de membro estático não faz nenhum sentido.
const
teria que ser o mesmo para um membro estático e para um não estático. Como um exemplo de que esse pensamento não é válido, considere o significado de static
, que depende do contexto.
C const*
ou const C*
?
Eu concordo com sua pergunta, mas infelizmente o C ++ foi projetado dessa forma. Por exemplo:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
A partir de hoje, o const
é considerado no contexto de this
. De certa forma, é estreito. Pode ser ampliado aplicando este indicador const
além this
.
ou seja, a "proposta" const
, que também pode se aplicar a static
funções, restringirá os static
membros de qualquer modificação.
No código de exemplo, se foo()
pode ser feito const
, nessa função, A::s
não pode ser modificado. Não consigo ver nenhum efeito colateral do idioma, se esta regra for adicionada ao padrão. Pelo contrário, é engraçado que tal regra não exista!
const
aplica-se a um objeto (no caso de funções-membro const, a instância na qual ele é chamado). Se você quiser aplicá-lo a todos os membros estáticos da classe, suponho que, se foi considerado pelo comitê, não foi considerado um requisito comum o suficiente para dar suporte.
const
modificador não é aplicado a métodos de membro ou variáveis de membro, mas ao this
-pointer implícito . Como um método de membro estático não está vinculado a um objeto, não há um this
-pointer a ser criado const
.
Sem entrar em detalhes, é porque pode ou não haver um objeto modificado pela função, então const é ambíguo para o compilador.
Lembre-se de que isso const
mantém os objetos constantes, mas pode haver ou não um objeto aqui para manter constante.
this
ponteiro. (Além disso, const
não mantém os objetos constantes. Impede que um determinado ponteiro ou referência seja usado para modificar o objeto, mas a modificação ainda pode acontecer por meio de outro caminho)
É uma pena que C ++ não o aceite de acordo com o design, mas logicamente existem poucos casos de uso em que ele valida bem.
Uma função que é válida em nível de classe (estática) pode não alterar nenhum dado estático, pode ser que apenas os dados de consulta sejam constantes. Pode ser que seja como
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Uma 'função-membro const' não tem permissão para modificar o objeto em que é chamada, mas as funções-membro estáticas não são chamadas em nenhum objeto. É usado diretamente pelo operador de resolução de escopo. Portanto, ter uma função-membro const estática não faz sentido, portanto, é ilegal.
const
função de membro estática significaria para você?