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

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

Nyckelordet föränderlig används för att tillåta en viss data medlem i const objekt som ska ändras. Detta är särskilt användbart om de flesta av ledamöterna ska vara konstant men några måste vara uppdateringsbar. Antag att vi lägger till en "lön" ledamot till vårt Employee klass. Medan den anställdes namn och id kan vara konstant, bör lönen inte vara. Här är vår uppdaterade klass 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;} void setName (string name) {_name = namn;} string getid () const {return _ID;} void setid (string id) {_ID = id;} dubbel getSalary () const {return _salary;} void setSalary (dubbel lön) {_salary = lön;} void främja (dubbel lön) const {_salary = lön;} private: string _name; sträng _ID; muterbart dubbel _salary; };

Nu, även för en const anställd-objekt, lönen kan modifieras

const anställd john ("JOHN", "007", 5000,0).; .

... .... John.promote (20000,0);

Nej, nej! Tusen gånger nej! Omdömen

Jag har sett denna typ av fruktansvärda idé innan. Denna typ av galenskap leder till bristfällig kod och besegrar hela syftet med const i C ++. Jag kan bara dra slutsatsen att de människor som skriver denna typ av nonsens själva inte förstår syftet med föränderlig. Så de lär ett misstag, förmedla detta nonsens till nästa grupp av C ++ programmerare som passerar det på sig själva. Detta måste upphöra.

Omdömen

När du markerar en variabel const, du lovar (och be C ++ för att genomdriva) som du aldrig logiskt att ändra innehållet i det objektet. Kanske den mest användbara anledning att göra detta är när du passerar ett objekt i en funktion som referens eller pekare. Genom att göra det const, lovar att funktionen inte bråka med objektet. Till exempel, säga att du har en klass robot som ärver från person. Du vill skicka din robot i funktionen take_pulse. Du vill take_pulse använda robotens åsidosatta metoder, så take_pulse tar objektet genom referens.

Eftersom det är const, kan du vara säker på att take_pulse inte kommer att ändra roboten, bara läsa från den

class Person {public: virtual bool has_pulse () const {return true; } Void uppsättningsnamn () {/* ... * /}}; klass robot: public Person {public: virtual bool has_pulse () const {return false; } Void uppsättningsnamn () {/* ... * /}}; /* Eftersom person är const, take_pulse kan inte ringa uppsättningsnamn ().

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