*   >> läser Utbildning artiklar >> science >> programming

C ++ & amp; # 039; s Föränderlig och konceptuella Constness

Eftersom Person är en referens, kan vi passera i en robot robot och få rätt svar (falskt). * /Bool take_pulse (const Person & X) {return X.has_pulse (); }

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:

 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.

* /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

Page   <<  [1] [2] [3] >>
Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.