Nøkkelordet foranderlig brukes til å tillate et bestemt data medlem av konst objektet som skal endres. Dette er spesielt nyttig hvis de fleste av medlemmene skal være konstant, men noen trenger det kan oppdateres. Anta vi legge til en "lønn" medlem i vår Employee klasse. Mens ansattes navn og id kan være konstant, bør lønnen ikke være. Her er vår oppdaterte klasse
class Employee {public:.
Employee (string name = "No Name", string id = "000-00-0000", dobbel lønn = 0): snitt (navn), _id (id) {_salary = lønn; } String getName () const {return snitt;} void setName (string navn) {snitt = navn;} string getid () const {return _id;} void SETID (string id) {_id = id;} dobbel getSalary () const {return _salary;} void setSalary (dobbel lønn) {_salary = lønn;} void fremme (dobbel lønn) const {_salary = lønn;} privat: string snitt; string _id; foranderlig dobbel _salary; };
Nå, selv for en const Employee objekt, lønnen kan modifiseres
konst Employee john ("JOHN", "007", 5000,0).
; .... .... John.promote (20000,0);
Nei, nei! En tusen ganger, nei!
Jeg har sett denne typen forferdelig idé før. Denne typen galskap fører til feil kode og nederlagene hele hensikten med konst i C ++. Jeg kan bare konkludere med at folk skrive denne typen tull selv ikke forstår hensikten med foranderlig. Så de lærer en feil, forbikjøring på dette tullet til neste gruppe C ++ programmerere som passerer det på seg selv. Dette må stoppe.
Når du merker en variabel konst, du er lovende (og spør C ++ til å håndheve) som du vil aldri logisk endre innholdet på dette objektet. Kanskje den mest nyttige grunn til å gjøre dette på er når du passerer et objekt til en funksjon ved henvisning eller pekeren. Ved å gjøre det const, lover funksjon for å ikke rote med objektet. For eksempel si at du har en klasse robot som arver fra Person. Du ønsker å passere din Robot inn i funksjonen take_pulse. Du ønsker take_pulse å bruke robotens styres metoder, så take_pulse tar objektet som referanse.
Fordi det er konst, kan du være trygg på at take_pulse ikke vil endre Robot, bare lese fra det:
class Person {public: virtuell bool has_pulse () const {return true; } Void settnavn () {/* ... * /}}; klasse Robot: public Person {public: virtuell bool has_pulse () const {return false; } Void settnavn () {/* ... * /}}; /* Fordi Person er konst, take_pulse kan ikke kalle settnavn (). Fordi Person er en referanse, kan vi passere i en robot robot og få det riktig