Const-medlemsfunksjoner i C++
Konstante medlemsfunksjoner er de funksjonene som nektes tillatelse til å endre verdiene til datamedlemmene i klassen deres. For å gjøre en medlemsfunksjon konstant, legges nøkkelordet const til funksjonsprototypen og også til funksjonsdefinisjonsoverskriften.
I likhet med medlemsfunksjoner og medlemsfunksjonsargumenter, kan objektene til en klasse også erklæres som const. Et objekt erklært som const kan ikke endres og kan derfor kun påkalle const-medlemsfunksjoner, da disse funksjonene sikrer at objektet ikke endres. Et const-objekt kan opprettes ved å sette prefikset const-nøkkelordet til objektdeklarasjonen. Ethvert forsøk på å endre datamedlemmet til const-objekter resulterer i en kompileringstidsfeil.
Syntaks
Const member-funksjonen kan defineres på tre måter:
1. For funksjonserklæring innenfor en klasse.
return_type function_name () const ;
Eksempel:
int get_data() const;
2. For funksjonsdefinisjon i klassedeklarasjonen.
return_type function_name () const { //function body } Eksempel:
int get_data() const { //function body } 3. For funksjonsdefinisjon utenfor klassen.
return_type class_name::function_name () const { //function body } Eksempel:
int Demo :: get_data() const { } Viktige poeng
- Når en funksjon er erklært som const, kan den kalles på alle typer objekter, const-objekter så vel som ikke-const-objekter.
- Når et objekt er deklarert som const, må det initialiseres på tidspunktet for deklarasjonen. Imidlertid er gjenstandsinitialisering mens deklarering kun mulig ved hjelp av konstruktører.
- En funksjon blir const når nøkkelordet const brukes i funksjonens erklæring. Ideen med const-funksjoner er ikke å tillate dem å endre objektet de kalles på.
- Det anbefales å øve seg på å lage så mange funksjoner som mulig slik at tilfeldige endringer på objekter unngås.
Eksempler på Const Member-funksjoner
Eksempel 1
C++-programmet nedenfor viser at datamedlemmer kan oppdateres i en medlemsfunksjon som ikke er konstant.
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;> }> |
Produksjon
11
Eksempel 2
C++-programmet nedenfor viser at data ikke kan oppdateres i en konstantmedlemsfunksjon.
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;> }> |
Produksjon
./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; ^
Eksempel 3
C++-koden nedenfor viser hvordan du definerer konstantmedlemsfunksjoner utenfor klassedefinisjonen og viser bruken av en konstantmedlemsfunksjon for å angi og hente verdien til en privat medlemsvariabel.
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;> }> |
Produksjon
10
Eksempel 4
C++-programmet nedenfor viser at const-funksjoner kan kalles opp av ikke-const-objekter.
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;> }> |
Produksjon
20
Når en funksjon er erklært som const, kan den kalles på alle typer objekter. Ikke-konst-funksjoner kan bare kalles av ikke-konst-objekter.
For eksempel har følgende program kompilatorfeil.
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;> }> |
Produksjon
./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();
La oss se på et annet eksempel:
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);> }> |
Produksjon
Hello world I'm Rancho Baba Inside display() Function
Vanlige spørsmål om Const Member Functions
Q1. Kan const-objekter i en klasse kalle ikke-konst-medlemsfunksjoner?
Svar:
Nei, et objekt erklært som const kan ikke endres og kan derfor kun påkalle const-medlemsfunksjoner, da disse funksjonene sikrer at objektet ikke endres.
Q2. Kan ikke-konst-objekter av en klasse kalle const-medlem fungere?
Svar:
Når en funksjon er erklært som const, kan den kalles på alle typer objekter.