Qual é o significado de const
declarações como essas? A const
me confunde.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
fonte
Qual é o significado de const
declarações como essas? A const
me confunde.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Quando você adiciona a const
palavra-chave a um método, o this
ponteiro se torna essencialmente um ponteiro para um const
objeto e, portanto, não é possível alterar nenhum dado de membro. (A menos que você use mutable
, mais sobre isso mais tarde).
A const
palavra-chave faz parte da assinatura das funções, o que significa que você pode implementar dois métodos semelhantes, um chamado quando o objeto é const
e outro que não é.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
Isso produzirá
Foo
Foo const
No método non-const, você pode alterar os membros da instância, o que não é possível na const
versão. Se você alterar a declaração do método no exemplo acima para o código abaixo, você receberá alguns erros.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Isso não é completamente verdade, porque você pode marcar um membro como mutable
e um const
método pode alterá-lo. É usado principalmente para contadores internos e outras coisas. A solução para isso seria o código abaixo.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
o que produziria
Foo
Foo const
Foo has been invoked 2 times
A const significa que o método promete não alterar nenhum membro da classe. Você seria capaz de executar os membros do objeto que estão tão marcados, mesmo se o próprio objeto estiver marcado const
:
const foobar fb;
fb.foo();
seria legal.
Veja Quantos e quais são os usos de "const" em C ++? Para maiores informações.
O const
qualificador significa que os métodos podem ser chamados com qualquer valor de foobar
. A diferença ocorre quando você considera chamar um método não-const em um objeto const. Considere se seu foobar
tipo possui a seguinte declaração de método extra:
class foobar {
...
const char* bar();
}
O método bar()
é não const e só pode ser acessado a partir de valores não const.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
A idéia por trás disso const
é marcar métodos que não alterem o estado interno da classe. Esse é um conceito poderoso, mas não é realmente aplicável em C ++. É mais uma promessa do que uma garantia. E um que é frequentemente quebrado e facilmente quebrado.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
é marcar métodos que não alteram o estado interno da classe". Era realmente o que eu estava procurando.const
?Estes const significam que o compilador irá Erro se o método 'with const' alterar dados internos.
O teste
Leia isto para mais informações
fonte
const
funções-membro que não menciona mutável é incompleta, na melhor das hipóteses.A resposta de Blair está na marca.
No entanto, observe que há um
mutable
qualificador que pode ser adicionado aos membros de dados de uma classe. Qualquer membro marcado pode ser modificado em umconst
método sem violar oconst
contrato.Você pode usar isso (por exemplo) se desejar que um objeto se lembre de quantas vezes um método específico é chamado, sem afetar a constância "lógica" desse método.
fonte
Significado de uma função de membro Const no C ++ Common Knowledge: A programação intermediária essencial fornece uma explicação clara:
Então, no seu código:
Você pode pensar assim:
fonte
this
não éconst
. A razão pela qual não pode ser modificado é que é um valor inicial.Quando você usa
const
a assinatura do método (como você disseconst char* foo() const;
:), está dizendo ao compilador que a memória apontada porthis
não pode ser alterada por esse método (que estáfoo
aqui).fonte
Eu gostaria de acrescentar o seguinte ponto.
Você também pode fazer -lhe um
const &
econst &&
Assim,
Sinta-se livre para melhorar a resposta. Eu não sou especialista
fonte
*this
é sempre um lvalue, mesmo se a função de membro for qualificada para rvalue-ref e for chamada em um rvalue. Exemplo .A palavra-chave const usada com a declaração da função especifica que é uma função de membro const e não poderá alterar os membros de dados do objeto.
fonte
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
fonte