Nuolatinių narių funkcijos yra tos funkcijos, kurioms neleidžiama keisti savo klasės duomenų narių reikšmes. Kad nario funkcija būtų pastovi, prie funkcijos prototipo ir funkcijos apibrėžimo antraštės pridedamas raktinis žodis const.
Kaip ir narių funkcijos bei narių funkcijų argumentai, klasės objektai taip pat gali būti deklaruojami kaip const. Objektas, paskelbtas kaip const, negali būti modifikuojamas, todėl gali iškviesti tik const narių funkcijas, nes šios funkcijos užtikrina, kad objektas nebus modifikuotas. Const objektas gali būti sukurtas prieš objekto deklaraciją pridedant raktinį žodį const. Bet koks bandymas pakeisti const objektų duomenų narį sukelia kompiliavimo laiko klaidą.
Sintaksė
Const nario funkciją galima apibrėžti trimis būdais:
1. Funkcijos deklaravimui klasėje.
return_type function_name () const ;>
Pavyzdys:
int get_data() const;>
2. Funkcijos apibrėžimui klasės deklaracijoje.
return_type function_name () const { //function body }> Pavyzdys:
int get_data() const { //function body }> 3. Funkcijos apibrėžimui už klasės ribų.
return_type class_name::function_name () const { //function body }> Pavyzdys:
int Demo :: get_data() const { }> Svarbūs punktai
- Kai funkcija deklaruojama kaip const, ją galima iškviesti bet kokio tipo objektuose, const objektuose ir ne const objektuose.
- Kai objektas deklaruojamas kaip const, jį reikia inicijuoti deklaravimo metu. tačiau objekto inicijavimas deklaruojant galimas tik konstruktorių pagalba.
- Funkcija tampa const, kai funkcijos deklaracijoje naudojamas raktinis žodis const. Const funkcijų idėja yra neleisti joms modifikuoti objekto, kuriuo jos iškviečiamos.
- Rekomenduojama atlikti kuo daugiau funkcijų, kad būtų išvengta atsitiktinių objektų pakeitimų.
Const narių funkcijų pavyzdžiai
1 pavyzdys
Toliau pateikta C++ programa parodo, kad duomenų nariai gali būti atnaujinami naudojant nario funkciją, kuri nėra pastovi.
C++
// C++ program to demonstrate that data members can be> // updated in a member function that is not constant.> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int> a) { x = a; }> >// non const member function> >// data can be updated> >int> get_data()> >{> >++x;> >return> x;> >}> };> main()> {> >Demo d;> >d.set_data(10);> >cout << d.get_data();> >return> 0;> }> |
>
>Išvestis
11>
2 pavyzdys
Toliau pateikta C++ programa parodo, kad duomenų negalima atnaujinti naudojant pastovaus nario funkciją.
C++
// C++ program to demonstrate that data cannot be updated> // in a Constant member function> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int> a) { x = a; }> >// constant member function> >int> get_data()>const> >{> >// Error while attempting to modify the data> >// member> >++x;> >return> x;> >}> };> main()> {> >Demo d;> >d.set_data(10);> >cout << endl << d.get_data();> >return> 0;> }> |
>
>
Išvestis
java patikrinimas yra niekinis
./Solution.cpp: In member function 'int Demo::get_data() const': ./Solution.cpp:17:11: error: increment of member 'Demo::x' in read-only object ++x; ^>
3 pavyzdys
Žemiau pateiktas C++ kodas parodo, kaip apibrėžti pastovaus nario funkcijas už klasės apibrėžimo ribų, ir parodo pastovaus nario funkcijos naudojimą privataus nario kintamojo vertei nustatyti ir gauti.
C++
// Constant member function defined outside the class> #include> using> namespace> std;> class> Demo {> >int> x;> public>:> >void> set_data(>int>);> >// const member function> >int> get_data()>const>;> };> // Function definition for setting the value of x.> void> Demo::set_data(>int> a) { x = a; }> // Function definition for retrieving the value of x (const> // member function).> int> Demo::get_data()>const> {>return> x; }> main()> {> >Demo d;> >// Set the value of x to 10 using the non-const member> >// function.> >d.set_data(10);> >// Print the value of x using the const member function.> >cout << d.get_data();> >return> 0;> }> |
>
>Išvestis
10>
4 pavyzdys
Žemiau pateikta C++ programa parodo, kad const funkcijas gali iškviesti ne const objektai.
C++
// C++ program to demonstrate that const functions can be> // called by non const objects> #include> using> namespace> std;> class> Test {> >int> value;> public>:> >Test(>int> v = 0) { value = v; }> >// const member function> >int> getValue()>const> {>return> value; }> };> int> main()> {> >// non const object> >Test t(20);> >cout << t.getValue();> >return> 0;> }> |
>
>Išvestis
20>
Kai funkcija deklaruojama kaip const, ją galima iškviesti bet kokio tipo objekte. Ne const funkcijas gali iškviesti tik ne const objektai.
Pavyzdžiui, šioje programoje yra kompiliatoriaus klaidų.
C++
// C++ program that demonstrate that non-const functions can> // not be called by const objects> #include> using> namespace> std;> class> Test {> >int> value;> public>:> >Test(>int> v = 0) { value = v; }> >// non const member function> >int> getValue() {>return> value; }> };> int> main()> {> >// const object> >const> Test t;> >cout << t.getValue();> >return> 0;> }> |
>
>
Išvestis
./d869c7ba-f199-4a67-9449-3936b5db4c5b.cpp: In function 'int main()': ./d869c7ba-f199-4a67-9449-3936b5db4c5b.cpp:14:24: error: passing 'const Test' as 'this' argument of 'int Test::getValue()' discards qualifiers [-fpermissive] cout << t.getValue();>
Pažvelkime į kitą pavyzdį:
C++
// Demonstration of constant object,> // show that constant object can only> // call const member function> #include> using> namespace> std;> class> Demo {> >int> value;> public>:> >Demo(>int> v = 0) { value = v; }> >void> showMessage()> >{> >cout <<>'Hello World We are Tushar, '> >'Ramswarup, Nilesh and Subhash Inside'> >' showMessage() Function'> ><< endl;> >}> >// const member function> >void> display()>const> >{> >cout <<>'Hello world I'm Rancho '> >'Baba Inside display() Function'> ><< endl;> >}> };> int> main()> {> >// Constant object are initialised at the time of> >// declaration using constructor> >const> Demo d1;> >// d1.showMessage();Error occurred if uncomment.> >d1.display();> >return> (0);> }> |
>
>Išvestis
Hello world I'm Rancho Baba Inside display() Function>
DUK apie „Const“ narių funkcijas
Q1. Ar klasės const objektai gali iškviesti ne const narių funkcijas?
Atsakymas:
Ne, objektas, paskelbtas kaip const, negali būti modifikuojamas, todėl gali iškviesti tik const narių funkcijas, nes šios funkcijos užtikrina, kad objektas nebus keičiamas.
Q2. Ar ne const klasės objektai gali iškviesti const nario funkciją?
Atsakymas:
Kai funkcija deklaruojama kaip const, ją galima iškviesti bet kokio tipo objekte.