Palabra clave mutable de C++

El especificador de clase de almacenamiento mutable en C++ (o el uso de la palabra clave mutable en C++) 
auto, register, static y extern son los especificadores de clase de almacenamiento en C. typedef también se considera como un especificador de clase de almacenamiento en C. C++ también admite todas estas clases de almacenamiento especificadores. Además de este C++, agrega un especificador de clase de almacenamiento importante cuyo nombre es mutable.

¿Cuál es la necesidad de mutable?  
A veces, es necesario modificar uno o más miembros de datos de la clase/estructura a través de la función const aunque no desee que la función actualice otros miembros de la clase/estructura. Esta tarea se puede realizar fácilmente usando una palabra clave mutable. Considere este ejemplo donde el uso de mutable puede ser útil. Supongamos que vas al hotel y le das la orden al mesero para que traiga un plato de comida. Después de dar la orden, de repente decides cambiar el orden de la comida. Suponga que el hotel brinda la posibilidad de cambiar la comida ordenada y nuevamente tomar la orden de comida nueva dentro de los 10 minutos posteriores a la primera orden. Después de 10 minutos, el pedido no se puede cancelar y el pedido anterior no se puede reemplazar por un pedido nuevo. Consulte el siguiente código para obtener más información.

C++

#include <bits/stdc++.h>
#include <string.h>
using namespace std;
 
// Customer Class
class Customer {
    
    // class Variables
    string name;
    mutable string placedorder;
    int tableno;
    mutable int bill;
 
    // member methods
public:
   
    
    // constructor
    Customer(string s, string m, int a, int p)
    {
        name= s;
        placedorder=m;
        tableno = a;
        bill = p;
    }
     
    // to change the place holder
    void changePlacedOrder(string p) const
    {
        placedorder=p;
    }
   
    // change the bill
    void changeBill(int s) const { bill = s; }
   
    // to display
    void display() const
    {
        cout << "Customer name is: " << name << endl;
        cout << "Food ordered by customer is: "
             << placedorder << endl;
        cout << "table no is: " << tableno << endl;
        cout << "Total payable amount: " << bill << endl;
    }
};
 
// Driver code
int main()
{
    const Customer c1("Pravasi Meet", "Ice Cream", 3, 100);
    c1.display();
    c1.changePlacedOrder("GulabJammuns");
    c1.changeBill(150);
    c1.display();
    return 0;
}
Producción

Customer name is: Pravasi Meet
Food ordered by customer is: Ice Cream
table no is: 3
Total payable amount: 100
Customer name is: Pravasi Meet
Food ordered by customer is: GulabJammuns
table no is: 3
Total payable amount: 150

Observe de cerca la salida del programa anterior. Los valores de los miembros de datos colocados y facturados se cambian desde la función const porque se declaran como mutables. 

La palabra clave mutable se usa principalmente para permitir que se modifique un miembro de datos particular del objeto const. Cuando declaramos una función como const, el puntero this pasado a function se convierte en const . Agregar mutable a una variable permite que un puntero constante cambie los miembros. 
mutable es particularmente útil si la mayoría de los miembros deben ser constantes pero algunos deben ser actualizables. Los miembros de datos declarados como mutables se pueden modificar aunque sean parte del objeto declarado como const. No puede usar el especificador mutable con nombres declarados como estáticos, constantes o de referencia.
Como ejercicio, prediga el resultado de los siguientes dos programas. 

CPP

// PROGRAM 1
#include <iostream>
using std::cout;
 
class Test {
public:
  int x;
  mutable int y;
  Test() { x = 4; y = 10; }
};
int main()
{
    const Test t1;
    t1.y = 20;
    cout << t1.y;
    return 0;
}

CPP

// PROGRAM 2
#include <iostream>
using std::cout;
 
class Test {
public:
  int x;
  mutable int y;
  Test() { x = 4; y = 10; }
};
int main()
{
    const Test t1;
    t1.x = 8;
    cout << t1.x;
    return 0;
}

Fuente:  
El especificador de clase de almacenamiento mutable (solo C++)
Este artículo es una contribución de Meet Pravasi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *