Det är nonsens att låta ledamöternas arvoden föränderlig; du bara gör det möjligt för kod som får en konstant föremål att bråka med lönen. Om den anställde är konstant, bör du inte jävlas med sin lön.
Omdömen
Så vad händer om du vill att arbetstagarens namn och id vara konstant, men inte lön? Tja, bara säga så Omdömen
class Employee {public: Anställd (string name = "No Name", string id = "000-00-0000", dubbel lön = 0): _name (namn), _ID (id) {_salary = lön; } String getName () const {return _name;} string getid () const {return _ID;} dubbel getSalary () const {return _salary;} void setSalary (dubbel lön) {_salary = lön;} void främja (dubbel lön) { _salary = lön;} privat: const sträng _name; const sträng _ID; dubbel _salary; };
Nu är de konstant.
Naturligtvis innebär det att du kan bara ställa dem i konstruktorn. Omdömen
Så om ovanstående galenskap är inte vad föränderligt är för, vad är det för? Här är den subtila fallet: föränderliga är fallet när ett objekt är logiskt konstant, men i praktiken måste förändras. Dessa fall är få och långt mellan, men de existerar Omdömen Här är ett exempel:. Du har en konstant föremål, men för felsökning vill spåra hur ofta en konstant metod kallas på den. Logiskt du inte ändrar föremålet. Observera att om du gör beslut i ditt program bygger på en föränderlig variabel, har du nästan säkert brutit logisk constness och måste tänka om Omdömen class Employee {public:. Anställd (const std :: string & namn): _name (namn), _access_count (0) {} void uppsättningsnamn (const std :: string & namn) {_name = namn; } Std :: string get_name () const {_access_count ++; returnera _name; } Int get_access_count () const {return _access_count; } Private: std :: string _name; föränderlig int _access_count; }; Som ett mer komplext exempel, kanske du vill cache resultaten av en dyr operation: * /Pi = 4; för (långt steg = 3, steg Nu har vi inte beräkna pi tills någon ber om det, men när de gör vi cache resultatet, vilket är bra eftersom vi beräknar det i en väldigt långsam och dumt sätt. Logiskt funktionen är fortfarande const (pi handlar inte om att ändra). Omdömen class MathObject {public: MathObject (): pi_cached (falskt) {} dubbel pi () const {if (! pi_cached) {/* Detta är ett vansinnigt långsam sätt att beräkna pi.