*   >> Lecture Éducation Articles >> science >> la programmation

C ++ & amp; # 039; Mutable et conceptuelle Constness

irtual () const {return false; } Set_name void () {/* ... * /}}; /* Parce que personne est const, take_pulse ne pouvez pas appeler set_name (). Parce que personne est une référence, nous pouvons passer à un robot de Robot et d'obtenir la bonne réponse (fausse). * /Bool take_pulse (const Personne et X) {return X.has_pulse (); }

Il est absurde de faire le salaire mutable; vous êtes juste qui rend possible pour le code qui obtient un objet constant de gâchis avec le salaire. Si l'employé est constante, vous ne devriez pas jouer avec son salaire.


Alors que faire si vous voulez que le nom et l'ID de l'employé d'être constant, mais pas le salaire? Eh bien, dites-le

class Employee {public: employés (string name = "No Name", string id = "000-00-0000", double salaire = 0): _name (nom), _id (id) {_salary = salaire; } Chaîne getName () const {return _name;} chaîne getId () const {return _id;} deux getSalary () const {return _salary;} setSalary void (double salaire) {_salary = salaire;} vide promouvoir (double salaire) { _salary = salaire;} private: const chaîne _name; _id de const string; à double _salary; };

Maintenant, ils sont constants.

Bien sûr, cela signifie que vous ne pouvez les mettre dans le constructeur.

Donc, si la folie ci-dessus est pas ce qui est modifiable pour, à quoi ça sert? Voici le cas subtile: mutable est pour le cas où un objet est logiquement constante, mais dans la pratique doit changer. Ces cas sont rares, mais ils existent

Voici un exemple:. Vous avez un objet constant, mais pour le débogage des fins souhaitez suivre combien de fois une méthode constante est appelée sur elle. Logiquement vous n'êtes pas changer l'objet.

Notez que si vous prenez des décisions dans votre programme basé sur une variable mutable, vous avez presque certainement violé constness logique et besoin de repenser les choses

class Employee {public:. Employés (const std :: string & nom): _name (nom), _access_count

(0) {} set_name void (const std :: string & nom) {_name = nom; } Std :: string get_name () const {_access_count ++; retourner _name; } Int get_access_count () const {_access_count de retour; } Private: std :: string _name; int _access_count mutable; };

Comme un exemple plus complexe, vous voudrez peut-être de mettre en cache les résultats d'une opération coûteuse:

 class MathObject {public: MathObject) (: pi_cached (false) {} deux pi () const {if (! pi_cached) {/* Ceci est un

Page   <<  [1] [2] [3] >>
Copyright © 2008 - 2016 Lecture Éducation Articles,https://lecture.nmjjxx.com All rights reserved.