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?
c++
static
language-lawyer
const-method
prabhakaran
fonte
fonte
const
função de membro estática significaria para você?Respostas:
Quando você aplica o
const
qualificador a uma função de membro não estático, ele afeta othis
ponteiro. Para uma função de membro qualificada por const da classeC
, othis
ponteiro é do tipoC const*
, enquanto para uma função de membro que não é qualificada por const, othis
ponteiro é do tipoC*
.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.fonte
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 destatic
, que depende do contexto.C const*
ouconst 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 dethis
. De certa forma, é estreito. Pode ser ampliado aplicando este indicadorconst
alémthis
.ou seja, a "proposta"
const
, que também pode se aplicar astatic
funções, restringirá osstatic
membros de qualquer modificação.No código de exemplo, se
foo()
pode ser feitoconst
, 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!fonte
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 aothis
-pointer implícito . Como um método de membro estático não está vinculado a um objeto, não há umthis
-pointer a ser criadoconst
.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.fonte
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
fonte
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.
fonte