Constante lidfuncties zijn functies waaraan geen toestemming is verleend om de waarden van de gegevensleden van hun klasse te wijzigen. Om een lidfunctie constant te maken, wordt het sleutelwoord const toegevoegd aan het functieprototype en ook aan de functiedefinitiekop.
Net als lidfuncties en lidfunctieargumenten kunnen de objecten van een klasse ook als const worden gedeclareerd. Een object dat als const is gedeclareerd, kan niet worden gewijzigd en kan daarom alleen const-lidfuncties aanroepen, aangezien deze functies ervoor zorgen dat het object niet wordt gewijzigd. Een const-object kan worden gemaakt door het const-sleutelwoord vóór de objectdeclaratie te zetten. Elke poging om het gegevenslid van const-objecten te wijzigen resulteert in een compileerfout.
Syntaxis
De const-lidfunctie kan op drie manieren worden gedefinieerd:
Java-methode
1. Voor functiedeclaratie binnen een klasse.
return_type function_name () const ;>
Voorbeeld:
int get_data() const;>
2. Voor functiedefinitie binnen de klassedeclaratie.
return_type function_name () const { //function body }> Voorbeeld:
int get_data() const { //function body }> 3. Voor functiedefinitie buiten de klasse.
return_type class_name::function_name () const { //function body }> Voorbeeld:
int Demo :: get_data() const { }> Belangrijke punten
- Wanneer een functie als const wordt gedeclareerd, kan deze voor elk type object worden aangeroepen, zowel const-objecten als niet-const-objecten.
- Telkens wanneer een object als const wordt gedeclareerd, moet het op het moment van declaratie worden geïnitialiseerd. de objectinitialisatie tijdens het declareren is echter alleen mogelijk met behulp van constructors.
- Een functie wordt const wanneer het trefwoord const wordt gebruikt in de declaratie van de functie. Het idee van const-functies is niet om ze het object waarop ze worden aangeroepen te laten wijzigen.
- Het wordt aanbevolen om zoveel mogelijk functies constant te maken, zodat onbedoelde wijzigingen aan objecten worden vermeden.
Voorbeelden van Const-lidfuncties
voorbeeld 1
Het onderstaande C++-programma laat zien dat gegevensleden kunnen worden bijgewerkt in een lidfunctie die niet constant is.
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;> }> |
>
>Uitvoer
11>
Voorbeeld 2
Het onderstaande C++-programma laat zien dat gegevens niet kunnen worden bijgewerkt in een Constant-lidfunctie.
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;> }> |
>
>
Uitvoer
./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; ^>
Voorbeeld 3
De onderstaande C++-code demonstreert hoe u constante lidfuncties definieert buiten de klassedefinitie en toont het gebruik van een constante lidfunctie om de waarde van een privélidvariabele in te stellen en op te halen.
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;> }> |
>
>Uitvoer
10>
Voorbeeld 4
Het onderstaande C++-programma laat zien dat const-functies kunnen worden aangeroepen door niet-const-objecten.
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;> }> |
>
>Uitvoer
20>
Wanneer een functie als const wordt gedeclareerd, kan deze op elk type object worden aangeroepen. Niet-const-functies kunnen alleen worden aangeroepen door niet-const-objecten.
Het volgende programma bevat bijvoorbeeld compilerfouten.
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;> }> |
>
>
Uitvoer
./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();>
Laten we naar een ander voorbeeld kijken:
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);> }> |
>
>Uitvoer
Hello world I'm Rancho Baba Inside display() Function>
Veelgestelde vragen over de functies van Const-leden
Q1. Kunnen const-objecten van een klasse niet-const-lidfuncties aanroepen?
Antwoord:
Nee, een object dat als const is gedeclareerd, kan niet worden gewijzigd en kan daarom alleen const-lidfuncties aanroepen, omdat deze functies ervoor zorgen dat het object niet wordt gewijzigd.
Vraag 2. Kunnen niet-const-objecten van een klasse const-lidfunctie aanroepen?
Antwoord:
Wanneer een functie als const wordt gedeclareerd, kan deze op elk type object worden aangeroepen.