C++: mutable - nauja kalbos savybė
C++ leidžia sukuurti objektą, kurio reikšmė yra pastovi, konstanta, t.y. kuri nustatoma objekto inicializacijos metu ir negali būti keičiama programos vykdymo metu. Pvz.,
class Pvz { public: int x; void Funkcija(); Pvz(); } const Pvz obj; // Dabar negali pakeisti objekto 'obj' reikšmės, pvz., obj.x = 37; // Neleistina // Negalima net kviesti šio objekto funkcijos, pvz., obj.Funkcija(); // Neleistina
Kodėl kalba po C pavadinta C++, o ne tiesiog C+?
C kalba turi inkrementacijos operatorių ++, tad C++ reiškia C kalbos inkrementaciją. Beje, egzistuoja ir C-- kalba tai 2005 m. išleista C sintaksę turinti žemo lygio portatyvi kalba, naudojama tarpiniam atvaizdavimui kompiliuojant iš aukšto lygio kalbų. Jos pokštaujantis pavadinimas paremtas operatoriumi, reiškiančiu dekremenciją (iš C).
Draudimas kviesti pastovaus objekto funkcijas susijęs su atskiro kompiliavimo galimybe. Jei "Pvz::Funkcija" yra kitame atskirai kompiliuojamame modulyje, nėra būdų sužinoti, ar ji keičia objekto, su kuriuo dirba, reikšmes. Tačiau leidžiama aprašyti ir "pastovias" funkcijas, pvz.,
void Funkcija () const;Tokia funkcija nekeičia objekto, kurį naudoja, reikšmių. Ir jei "this" nuorodos klasei T tipas yra
T *const this;tai funkcijai, aprašytai su "const", jau
const T *const this;t.y neleidžiama keisti nei pačios nuorodos, nei objekto, į kurį ji rodo. O visai neseniai buvo įtraukta nauja galimybė, leidžianti nurodyti, kad kai kuriuos klasės elementus galima modifikuoti net tada, kai visas objektas yra pastovus, "konstanta". Pvz.,
class Kinta { public: mutable int x; Kinta(); } const Kinta obj2; // Ir tada galima obj2.x = 37; // Leistina!Panaudojimo pavyzdys:
class rectangle { int xvk, yvk; // (X,Y) viršutinis kairysis kampas int xad, yad; // (X,Y) apatinis dešinysis kampas mutable int P; // Plotas public: int Plotas() const { P = abs( (xad-xvk) * (yad-yvk) ); return P; } class Rectangle (int xv, int yv, int xa, int ya): xvk(xv), yvk(yv), xad(xa), yad(ya) { } }; // end class Rectangle const Rectangle Stat(20, 10, 180, 120); void Spausdink () { printf ("Plotas=%d\n", Stat.Plotas()); }Papildomai skaitykite:
Pradėkime su MFC!
C/C++: Ką reiškia static?
Programuotojus į savartyną!
Sunkus Linux posukis nuo C link Rust
Programavimo kalbų istorija
Vykdyti ir laukti
Vartiklis