Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.1.8e mutable

§1 Sinopsis

Se trata de una palabra clave que solo puede ser aplicada a miembros de clases. Para entender su significado y utilidad, es necesario conocer el significado del especificador const cuando se aplica a miembros de clases ( 3.2.1c).

§2 Sintaxis:

mutable <nombre-de-propiedad>;

§3 Comentario

mutable es un especificador de tipo de almacenamiento cuyo propósito es informar al compilador que el miembro señalado (que debe ser una propiedad) pueden ser modificado bajo cualquier circunstancia. El Dr. Stroustrup indica al respecto [1]: "El especificador de almacenamiento mutable especifica que el miembro debe ser almacenado de forma que pueda ser actualizado -incluso cuando es miembro de un objeto-const. En otras palabras, mutable significa 'nunca podrá ser constante'".

A pesar de lo anterior, y de que el Estándar no señala ninguna restricción al respecto, el compilador BC++ 5.5 indica que mutable no afecta la duración del miembro al que se aplica, y que no puede utilizarse con miembros declarados static o const (C++ Builder Languaje Guide), lo que tiene cierta lógica, ya que mutable y const aplicados a una misma propiedad implicarían atributos contradictorios.

Los miembros-mutable pueden ser modificados desde métodos-const ( 3.2.1c) a pesar que normalmente estos métodos no pueden modificar propiedades no-const. Ejemplo:

class C {
  mutable int x;             // propiedad no-const y mutable
  int y;                     // propiedad no-const
  void func (int a) const {  // método-const
    x += a;                  // Ok. modifica a x!!
    y += a;                  // Error!!
  }
};

Ejemplo:

#include <iostream>
using std::cout;
 
class Alpha {
  mutable int count;           // int mutable
  mutable const int* iptr;     // puntero mutable a-constante int
  public:
  int func1(int i = 0) const { // Promete no acceder miembros no-const
     count = i++;              // count puede ser accedido
     iptr = &i;                // Ok iptr puede ser asignado
     cout << "Valor: " << *iptr;
     return count;
   }
};
int main(void) {     // ==============
  Alpha a;
  a.func1(0);
  return 0;
}

Salida:

Valor: 1

  Inicio.


[1] TC++PL §10.2.7.2