parameter c++ const

c++ - parameter - ¿Qué significa "const" al final de la declaración de función?



c++ const parameter (6)

Posible duplicado:
Significado de "const" último en una declaración de método C ++?

Hola tengo un libro, donde se escribe algo como:

class Foo { public: int Bar(int random_arg) const { // code } };

También, una pregunta de paso: ¿por qué debería / no debería usar const antes de las declaraciones de argumentos? ¿Qué cambia eso?

int Foo (const int Bar) { /* code */ }

EDITAR: Así que si lo hago ahora:

Foo v1, v2;

¿Existirá la función de barra (con etiqueta constante) 3 veces o 1 vez en la memoria?


Considere dos variables de tipo de clase:

class Boo { ... }; Boo b0; // mutable object const Boo b1; // non-mutable object

Ahora puede llamar a cualquier función miembro de Boo en b0 , pero solo a las funciones miembro const en b1 .




Siempre me resulta conceptualmente más fácil pensar que estás haciendo que este puntero sea constante (que es más o menos lo que hace).


Similar a this pregunta.

En esencia, significa que la Bar del método no modificará las variables miembro no mutable de Foo .


Una "función const", denotada con la palabra clave const después de una declaración de función, hace que sea un error del compilador para esta función de clase cambiar una variable miembro de la clase. Sin embargo, la lectura de las variables de una clase está bien dentro de la función, pero escribir dentro de esta función generará un error de compilación.

Otra forma de pensar acerca de dicha "función constante" es ver una función de clase como una función normal que toma un puntero implícito. Entonces, un método int Foo::Bar(int random_arg) (sin la constante al final) da como resultado una función como int Foo_Bar(Foo* this, int random_arg) , y una llamada como Foo f; f.Bar(4) Foo f; f.Bar(4) corresponderá internamente a algo como Foo f; Foo_Bar(&f, 4) Foo f; Foo_Bar(&f, 4) . Ahora, agregar la const al final ( int Foo::Bar(int random_arg) const ) puede entenderse como una declaración con una constante de este puntero: int Foo_Bar(const Foo* this, int random_arg) . Dado que el tipo de this en tal caso es constante, no es posible realizar modificaciones de las variables miembro.

Es posible aflojar la restricción de "función constante" de no permitir que la función escriba en ninguna variable de una clase. Para permitir que algunas de las variables puedan escribirse incluso cuando la función está marcada como una "función constante", estas variables de clase están marcadas con la palabra clave mutable . Por lo tanto, si una variable de clase se marca como mutable, y se escribe una "función const" en esta variable, entonces el código se compilará de forma limpia y es posible cambiar la variable. (C ++ 11)

Como es habitual cuando se trata de la palabra clave const , cambiar la ubicación de la palabra clave const en una instrucción C ++ tiene significados completamente diferentes. El uso anterior de const solo se aplica cuando se agrega const al final de la declaración de función después del paréntesis. const es un calificador muy usado en exceso en C ++ y la sintaxis y el ordenamiento a menudo no son sencillos en combinación con los punteros. Algunas lecturas sobre la corrección de const y la palabra clave const :

Constancia de const

La declaración ''const'' de C ++: por qué y cómo