Las funciones miembro constantes son aquellas funciones a las que se les niega el permiso para cambiar los valores de los miembros de datos de su clase. Para hacer que una función miembro sea constante, la palabra clave const se agrega al prototipo de función y también al encabezado de definición de función.
Al igual que las funciones miembro y los argumentos de las funciones miembro, los objetos de una clase también se pueden declarar como constantes. Un objeto declarado como constante no se puede modificar y, por lo tanto, solo puede invocar funciones miembro constantes, ya que estas funciones garantizan no modificar el objeto. Se puede crear un objeto constante anteponiendo la palabra clave const a la declaración del objeto. Cualquier intento de cambiar el miembro de datos de objetos constantes da como resultado un error en tiempo de compilación.
Sintaxis
La función miembro constante se puede definir de tres maneras:
1. Para declaración de función dentro de una clase.
return_type function_name () const ;>
Ejemplo:
int get_data() const;>
2. Para la definición de funciones dentro de la declaración de clase.
return_type function_name () const { //function body }> Ejemplo:
int get_data() const { //function body }> 3. Para definición de funciones fuera de la clase.
return_type class_name::function_name () const { //function body }> Ejemplo:
int Demo :: get_data() const { }> Puntos importantes
- Cuando una función se declara como constante, se puede invocar en cualquier tipo de objeto, tanto constante como no constante.
- Siempre que un objeto se declara como constante, es necesario inicializarlo en el momento de la declaración. sin embargo, la inicialización del objeto durante la declaración sólo es posible con la ayuda de constructores.
- Una función se vuelve constante cuando se usa la palabra clave const en la declaración de la función. La idea de las funciones constantes es no permitirles modificar el objeto sobre el que se llaman.
- Se recomienda hacer tantas funciones constantes como sea posible para evitar cambios accidentales en los objetos.
Ejemplos de funciones de miembros constantes
Ejemplo 1
El siguiente programa C++ demuestra que los miembros de datos se pueden actualizar en una función miembro que no es constante.
C++
// C++ program to demonstrate that data members can be> // updated in a member function that is not constant.> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int> a) { x = a; }> >// non const member function> >// data can be updated> >int> get_data()> >{> >++x;> >return> x;> >}> };> main()> {> >Demo d;> >d.set_data(10);> >cout << d.get_data();> >return> 0;> }> |
>
>Producción
11>
Ejemplo 2
El siguiente programa C++ demuestra que los datos no se pueden actualizar en una función miembro constante.
C++
// C++ program to demonstrate that data cannot be updated> // in a Constant member function> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int> a) { x = a; }> >// constant member function> >int> get_data()>const> >{> >// Error while attempting to modify the data> >// member> >++x;> >return> x;> >}> };> main()> {> >Demo d;> >d.set_data(10);> >cout << endl << d.get_data();> >return> 0;> }> |
>
¿Qué tan grande es este monitor?
>
Producción
./Solution.cpp: In member function 'int Demo::get_data() const': ./Solution.cpp:17:11: error: increment of member 'Demo::x' in read-only object ++x; ^>
Ejemplo 3
El siguiente código C++ demuestra cómo definir funciones miembro constantes fuera de la definición de clase y muestra el uso de una función miembro constante para establecer y recuperar el valor de una variable miembro privada.
C++
// Constant member function defined outside the class> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int>);> >// const member function> >int> get_data()>const>;> };> // Function definition for setting the value of x.> void> Demo::set_data(>int> a) { x = a; }> // Function definition for retrieving the value of x (const> // member function).> int> Demo::get_data()>const> {>return> x; }> main()> {> >Demo d;> >// Set the value of x to 10 using the non-const member> >// function.> >d.set_data(10);> >// Print the value of x using the const member function.> >cout << d.get_data();> >return> 0;> }> |
>
>Producción
10>
Ejemplo 4
El siguiente programa C++ demuestra que las funciones constantes pueden ser invocadas por objetos no constantes.
C++
// C++ program to demonstrate that const functions can be> // called by non const objects> #include> using> namespace> std;> class> Test {> >int> value;> public>:> >Test(>int> v = 0) { value = v; }> >// const member function> >int> getValue()>const> {>return> value; }> };> int> main()> {> >// non const object> >Test t(20);> >cout << t.getValue();> >return> 0;> }> |
>
>Producción
20>
Cuando una función se declara como constante, se puede invocar en cualquier tipo de objeto. Las funciones no constantes solo pueden ser invocadas por objetos no constantes.
Por ejemplo, el siguiente programa tiene errores de compilación.
C++
// C++ program that demonstrate that non-const functions can> // not be called by const objects> #include> using> namespace> std;> class> Test {> >int> value;> public>:> >Test(>int> v = 0) { value = v; }> >// non const member function> >int> getValue() {>return> value; }> };> int> main()> {> >// const object> >const> Test t;> >cout << t.getValue();> >return> 0;> }> |
>
>
Producción
./d869c7ba-f199-4a67-9449-3936b5db4c5b.cpp: In function 'int main()': ./d869c7ba-f199-4a67-9449-3936b5db4c5b.cpp:14:24: error: passing 'const Test' as 'this' argument of 'int Test::getValue()' discards qualifiers [-fpermissive] cout << t.getValue();>
Veamos otro ejemplo:
C++
nueva línea pitón
// Demonstration of constant object,> // show that constant object can only> // call const member function> #include> using> namespace> std;> class> Demo {> >int> value;> public>:> >Demo(>int> v = 0) { value = v; }> >void> showMessage()> >{> >cout <<>'Hello World We are Tushar, '> >'Ramswarup, Nilesh and Subhash Inside'> >' showMessage() Function'> ><< endl;> >}> >// const member function> >void> display()>const> >{> >cout <<>'Hello world I'm Rancho '> >'Baba Inside display() Function'> ><< endl;> >}> };> int> main()> {> >// Constant object are initialised at the time of> >// declaration using constructor> >const> Demo d1;> >// d1.showMessage();Error occurred if uncomment.> >d1.display();> >return> (0);> }> |
>
>Producción
Hello world I'm Rancho Baba Inside display() Function>
Preguntas frecuentes sobre las funciones de miembros constantes
P1. ¿Pueden los objetos constantes de una clase llamar a funciones miembro no constantes?
Respuesta:
No, un objeto declarado como constante no se puede modificar y, por lo tanto, solo puede invocar funciones miembro constantes, ya que estas funciones garantizan no modificar el objeto.
P2. ¿Pueden los objetos no constantes de una clase llamar a una función miembro constante?
Respuesta:
Cuando una función se declara como constante, se puede invocar en cualquier tipo de objeto.