FuncionesConstantes

=Funciones constantes=

En C++, se puede usar el modificador const para definir una función constante. Mira en el siguiente ejemplo la función getVal. code format="cpp" class MyC { public: MyC{_val=10;} ~MyC{} void setVal(int v){_val=v;} int getValconst{ return _val;} int getValNoConst{return _val;} private: int _val; };

code Al declarar una función como constante, le estamos indicado al compilador que la función no modificará en su interior el contenido del objeto. Es decir, es una función que accede a los valores, pero solo para ver su valor, posiblemente calcular algo con ellos, y a lo mejor retorna algo. Pero no modifica el estado del objeto (es decir, ninguna de sus variables).

¿Para que sirve esto? Mirad del siguiente ejemplo.

code format="cpp" class MyCC { public: MyCC{} ~MyCC{} void readFromMyC(const MyC &M){ _val=M.getVal;} private: float _val; }; code La clase MyCC, en la función readFromMyC, hace que _val valga lo que vale getVal. Fijaros, que en la declaración se dice //__const MyC&M__//, es decir, que M es una variable constante. Lo que quiere decir que no se debe poder modificar M dentro de la función.

Al ser M de tipo constante, el compilador comprobará que no se hacen llamadas que descarten ese cualificador (el cualificador constante). Es decir, solo permitirá llamadas a función que sean de tipo constante. Por tanto, si la variable getVal de MyC no se hubiese definido como constante, no se hubiese podido usar en readFromMyC. O dicho de otro modo, solo podemos llamar a funciones constantes de objetos que se comporta como constantes. O sea, que elsiguiente código daría error de compilación: code format="cpp" class MyCC { public: MyCC{} ~MyCC{} void readFromMyC(const MyC &M){ _val=M.getValNoConst;} private: float _val; }; code

Pero esto tiene otra limitación. Hemos dicho que al definir una función como constante, no podemos modificar el valor del objeto. Por tanto, dentro de una función constante, solo se podrán hacer llamadas a funciónes constantes.

Por ejemplo, el siguiente código daría error de compilación por que doooo se declara como función constante, pero dentro se hace una llamada a una función no constante. Aunque en realidad la función getValueNoConst no modifica el objeto _myc, el compilador no lo sabe. El compilador se cura en salud y dice, "como getValueNoConst no es contante, pudiera ocurrir que se mofiquen el objeto. Asi que no lo voy a permitir".

code format="cpp" class MyCCC { public: MyCCC{} ~MyCCC{} int doooo const{ return _myc.getValueNoConst*10;} } private: MyC _myc; }; code

¿Cuál sería la solución al problema? Pues llamar a una función constante. El siguiente código si sería correcto: code format="cpp" class MyCCC { public: MyCCC{} ~MyCCC{} int doooo const{ return _myc.getValue*10;} } private: MyC _myc; }; code