Pergunta

Um comentário para um dos meus posts me interessou:

Eu também . Também dou acessores / mutators o mesmo nome.

Eu estava pensando sobre isso, porque eu sempre usaram setBar(int bar) em vez de um mutante chamado a mesma coisa. Eu quero saber: pode o compilador determinar com base em um identificador de const que se transforma em tempo de execução, ou ele pode usar o mesmo nome de função porque tem um parâmetro

Será que esta multa de compilação:

class Foo
{
   int bar_;

   public:
      int bar() { return bar_; }
      void bar(int bar) { bar_ = bar; }
}

Ou eu tenho que fazer isso (eu percebo que eu deveria estar fazendo isso de qualquer maneira, apenas correr comigo sobre isso):

int bar() const { return bar_; }

Eu não sei qual é qual. const é importante, então eu acho que eu gostaria que o compilador para objeto para a sobrecarga desde uma mutação e um não.

Por que isso funciona dessa maneira?

Foi útil?

Solução

A primeira coisa que os olhares do compilador em é o número e tipo de parâmetros que você está passando para a função. Isso resolve a sobrecarga sobre bar antes mesmo precisa de olhar para const-ness.

Se você não conseguir bar() marca como const, o compilador irá informá-lo desta a primeira vez que você tenta bar() chamada em uma instância const do objeto.

Outras dicas

O compilador não vai impedi-lo de escrever uma função membro não-const que na verdade não se transformar o objeto. Isso não é uma violação da const-correção, o que só garante que os objetos não são mutantes através de referências const. O princípio aqui é que const diz que a função pode não mutação, e não-const significa que a função é livre para se transformar se quiser. Não há maneira de promessa de mutação, e ter o compilador impor que:. Eu acho que isso seria garantia de uma vaga demais para ser de alguma utilidade para os chamadores

Como Greg diz, o compilador vai se opor quando você tenta chamar uma função de membro não-const em um objeto const (novamente, é irrelevante se em mutação fatos. A única coisa importante é se ele é declarado const).

Para uma compreensão mais fácil, considere que compilador assume que um objeto vai ser alterado se um método não-const será chamado para esse objeto.

Assim, em um método const, se você chamar um método não-const para um dos membros de dados ou outro método não-const da classe, o compilador irá sinalizar um erro.

Você pode considerar operadores como métodos bem (Eu sei, você pode definir alguns operadores como funções amigo, não como métodos, mas para simplifcation ...). Por exemplo, o operador de atribuição (= operador) é, por padrão não-const. Isso significa que se você fizer algo como

void MyClass::MyConstMethod() const
{
   classMember = value;
}

O compilador irá considerar que você chamou o operador de atribuição de classMember, que, dentro de um método const é um objeto const. Desde operador = não é const, um erro do compilador será relatado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top