C ++ - Por que a função de membro estático não pode ser criada com o qualificador 'const'


86

Hoje eu tenho um problema. Estou precisando de uma staticfunção de membro, constnã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?


1
O que uma constfunção de membro estática significaria para você?
GManNickG

2
@GMan quero dizer que é uma função de membro estático que nunca muda nenhuma de suas entradas.
prabhakaran de

11
Então, suas entradas (parâmetros de função) devem ser por valor ou referências constantes.
GManNickG

3
De qualquer forma, não afeta a constância dos argumentos das funções-membro. Não significa "fazer tudo const", significa "fazer esta const".
UncleBens de

@GMan, você está dizendo que const deve ser adicionado aos argumentos
prabhakaran

Respostas:


137

Quando você aplica o constqualificador a uma função de membro não estático, ele afeta o thisponteiro. Para uma função de membro qualificada por const da classe C, o thisponteiro é do tipo C const*, enquanto para uma função de membro que não é qualificada por const, o thisponteiro é do tipo C*.

Uma função de membro estático não tem um thisponteiro (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.


Isso significa que 'const' é apenas para variáveis ​​como int, ponteiro, etc.?
prabhakaran de

@prabhakaran - As funções de membro também podem ser qualificadas const . James mencionou isso claramente em sua resposta.
Mahesh

@Mahesh O qualificador const da função membro também qualifica apenas 'este ponteiro', não o todo. Você ainda pode alterar a variável global na função de membro qualificado const. Agora só eu verifiquei isso.
prabhakaran de

5
-1 "Uma função de membro estático não tem um ponteiro this ... então a qualificação const de uma função de membro estático não faz nenhum sentido [dessa forma]" é verdadeira em si mesma, mas está errada como uma resposta à questão "por que " Como resposta, ele presume que o significado de constteria 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.
Saúde e hth. - Alf

2
É C const*ou const C*?
crisron

24

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 constalém this.
ou seja, a "proposta" const, que também pode se aplicar a staticfunções, restringirá os staticmembros de qualquer modificação.

No código de exemplo, se foo()pode ser feito const, nessa função, A::snã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!


8
Provavelmente o mesmo que a razão pela qual você não pode modificar constantemente uma função livre para significar "esta função não modifica nenhuma variável global". constaplica-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.
Steve Jessop

1
O constmodificador 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.
Ruud Althuizen

1

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 constmantém os objetos constantes, mas pode haver ou não um objeto aqui para manter constante.


2
"posso ou não posso"? Uma função de membro estático nunca tem um thisponteiro. (Além disso, constnã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)
Ben Voigt

1

É 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

1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.