¿Cuál es el significado de const
en declaraciones como estas? El const
me confunde.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
fuente
¿Cuál es el significado de const
en declaraciones como estas? El const
me confunde.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Cuando agrega la const
palabra clave a un método, el this
puntero se convertirá esencialmente en un puntero al const
objeto y, por lo tanto, no puede cambiar ningún dato de miembro. (A menos que use mutable
, más sobre eso más adelante).
La const
palabra clave es parte de la firma de funciones, lo que significa que puede implementar dos métodos similares, uno que se llama cuando el objeto es const
y otro que no.
#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();
}
Esto dará salida
Foo
Foo const
En el método no constante, puede cambiar los miembros de la instancia, lo que no puede hacer en la const
versión. Si cambia la declaración del método en el ejemplo anterior al código siguiente, obtendrá algunos errores.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Esto no es completamente cierto, porque puede marcar un miembro como mutable
y un const
método puede cambiarlo. Se usa principalmente para contadores internos y otras cosas. La solución para eso sería el siguiente código.
#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;
}
que daría salida
Foo
Foo const
Foo has been invoked 2 times
El const significa que el método promete no alterar a ningún miembro de la clase. Podrías ejecutar los miembros del objeto que están tan marcados, incluso si el objeto mismo estuviera marcado const
:
const foobar fb;
fb.foo();
Sería legal.
Vea ¿Cuántos y cuáles son los usos de "const" en C ++? para más información.
El const
calificador significa que los métodos se pueden invocar en cualquier valor de foobar
. La diferencia se produce cuando considera llamar a un método no const en un objeto const. Considere si su foobar
tipo tenía la siguiente declaración de método adicional:
class foobar {
...
const char* bar();
}
El método bar()
no es constante y solo se puede acceder desde valores no constantes.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
Sin const
embargo, la idea detrás es marcar métodos que no alteren el estado interno de la clase. Este es un concepto poderoso pero en realidad no es exigible en C ++. Es más una promesa que una garantía. Y uno que a menudo se rompe y se rompe fácilmente.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
es marcar métodos que no alteren el estado interno de la clase". Eso es realmente lo que estaba buscando.const
?Estos const significan que el compilador producirá un error si el método 'con const' cambia los datos internos.
La prueba
Lea esto para más información
fuente
const
funciones de miembros que no menciona mutable es incompleta en el mejor de los casos.La respuesta de Blair está en el blanco.
Sin embargo, tenga en cuenta que hay un
mutable
calificador que se puede agregar a los miembros de datos de una clase. Cualquier miembro así marcado puede modificarse en unconst
método sin violar elconst
contrato.Es posible que desee utilizar esto (por ejemplo) si desea que un objeto recuerde cuántas veces se llama a un método en particular, sin afectar la coherencia "lógica" de ese método.
fuente
Significado de una función miembro de Const en C ++ Conocimiento común: la programación básica esencial da una explicación clara:
Entonces en tu código:
Puedes pensarlo así:
fuente
this
no esconst
. La razón por la que no se puede modificar es que es un valor privalente.cuando usas
const
la firma del método (como dijiste:)const char* foo() const;
le estás diciendo al compilador que la memoria apuntada porthis
no puede cambiarse con este método (que estáfoo
aquí).fuente
Me gustaría agregar el siguiente punto.
También puedes convertirlo en un
const &
yconst &&
Entonces,
Siéntase libre de mejorar la respuesta. No soy un experto
fuente
*this
siempre es un lvalue, incluso si la función miembro es rvalue-ref-qualified y se llama en un rvalue. Ejemplo .La palabra clave const utilizada con la declaración de función especifica que es una función miembro const y no podrá cambiar los miembros de datos del objeto.
fuente
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
fuente