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; }
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