C++ const en getter
(5)
Todavía estoy aprendiendo sobre C ++ y estoy leyendo en todas partes que tengo que usar const
todas las que pueda (por razones de velocidad, creo).
Usualmente escribo mi método getter así:
const bool isReady() {
return ready;
}
Pero he visto que algunos IDE se autogeneran de esta manera:
bool getReady() const {
return ready;
}
Pero, escribiendo delegados, me ocurrió encontrar este error si la const
está después de la función:
member function ''isReady'' not viable: ''this'' argument has type ''const VideoReader'', but function is not marked const
Entonces, ¿cuál es la mejor manera de escribir un get get const? ¿Realmente tengo que preocuparme?
Hay una diferencia entre usar la palabra clave const
para el tipo de retorno o para la firma del método. En el primer caso, el valor devuelto será un valor constante. En el segundo caso, el método será el llamado método constante, que no puede cambiar la representación del objeto. En objetos constantes, solo los métodos constantes son invocables.
Hay una gran diferencia entre las dos formas.
const bool isReady()
El código anterior devolverá un valor const bool
, pero no garantiza que el objeto no cambie su estado lógico.
bool isReady() const
Esto devolverá un bool
, y garantiza que el estado lógico de su objeto no cambiará. En este caso, no es necesario escribir const
delante del tipo de retorno. No tiene sentido devolver un const bool
porque de todos modos es una copia. Así que hacerla const
es inútil. La segunda const
es necesaria para la corrección const
, que no se usa por razones de velocidad sino para hacer que su programa sea más confiable y seguro.
Significan dos cosas diferentes:
const bool isReady() {
return ready;
}
Esto devuelve un bool constante. Es decir, un bool que no puede cambiar el valor desde el momento en que se creó.
bool getReady() const {
return ready;
}
Esta es una función constante, es decir, una función que no alterará ninguna variable miembro de la clase a la que pertenece. Este es el estilo recomendado para los usuarios, ya que su único propósito es recuperar datos y no debe modificar nada en el proceso.
Un constante tiene la firma.
bool getReady() const
La otra versión no es un método const
, solo devuelve un valor const
(que es básicamente inútil).
Tener un const
get const
permite llamarlo en objetos const:
const Object obj;
obj.getReady();
Esto solo es válido si getReady
está marcado como const
.
const
método const
informa al compilador que no modificará la instancia de clase en la que se llama a este método:
class A {
public:
bool getReady() const {
return ready;
}
};
por lo tanto, si intenta modificar su objeto dentro de getReady (), el compilador generará un error. Los métodos const son útiles cuando tiene, por ejemplo: const A &, o const A *, entonces solo puede llamar a los métodos const en dichos objetos.
como para:
const bool isReady() {
return ready;
}
esta constante no proporciona ningún beneficio real, ya que bool se copia mientras isReady () devuelve. Dicha constancia tendría sentido si el tipo devuelto fuera const char*
o const A&
, en tales casos const
hace que su cadena de caracteres o una instancia de clase A sea inmutable.