Le mot-clé mutable est utilisé pour permettre à un membre de données d'objet particulier const à être modifié. Ceci est particulièrement utile si la plupart des membres doit être constante, mais quelques-uns ont besoin d'être mis à jour. Supposons que nous ajoutions un membre "de salaire» à notre classe d'employés. Alors que le nom et l'ID employé peuvent être constants, le salaire ne doit pas être. Voici notre classe mise à jour
class Employee {public:.
Employé (string name = "No Name", string id = "000-00-0000", double salaire = 0): _name (nom), _id (id) {_salary = salaire; } Chaîne getName () const {return _name;} setName vide (nom de la chaîne) {_name = nom;} chaîne getId () const {return _id;} setid vide (chaîne id) {_id = id;} deux getSalary () const {return _salary;} setSalary void (double salaire) {_salary = salaire;} vide promouvoir (double salaire) const {_salary = salaire;} private: string _name; _id de chaîne; à double _salary mutable; };
Maintenant, même pour un objet Employee const, le salaire peut être modifié
employé const John ("JOHN", "007", 5000.
0).; .... .... John.promote (20000.0);
Non, non! Mille fois non!
je vois ce genre de terribles idée avant. Cette sorte de folie mène au code défectueux et défait tout l'objet de const en C ++. Je ne peux que conclure que les gens qui écrivent ce genre de non-sens eux-mêmes ne comprennent pas le but de mutable. Donc ils enseignent une erreur, en passant sur ce non-sens à la prochaine groupe de programmeurs C de qui passent sur eux-mêmes. Cela doit cesser.
Lorsque vous marquez un const variable, vous vous engagez (et demandant C ++ pour faire respecter) que vous ne serez jamais modifier logiquement le contenu de cet objet. Peut-être la raison la plus utile de le faire est lorsque vous passez un objet dans une fonction par référence ou pointeur. En rendant const, la fonction promet de ne plaisante pas avec votre objet. Par exemple, dire que vous avez un robot de classe qui hérite de personne. Vous voulez passer votre robot dans la fonction take_pulse.
Vous voulez take_pulse à utiliser des méthodes surchargées de robots, de sorte take_pulse prend l'objet par référence. Parce qu'il est const, vous pouvez être sûr que take_pulse aura pas modifier le robot, il suffit de lire de lui:
class Personne {public: bool has_pulse virtuel () const {return true; } Set_name void () {/* ... * /}}; classe Robot: Personne {public: has_pulse bool v