Const-medlemsfunktioner i C++

Konstanta medlemsfunktioner är de funktioner som nekas tillstånd att ändra värdena för datamedlemmarna i deras klass. För att göra en medlemsfunktion konstant läggs nyckelordet const till funktionsprototypen och även till funktionsdefinitionshuvudet.

Liksom medlemsfunktioner och medlemsfunktionsargument kan objekten i en klass också deklareras som const. Ett objekt som deklarerats som const kan inte modifieras och kan därför endast anropa const-medlemsfunktioner eftersom dessa funktioner säkerställer att objektet inte ändras. Ett const-objekt kan skapas genom att prefixet const-nyckelordet till objektdeklarationen. Varje försök att ändra datamedlemmen i const-objekt resulterar i ett kompileringsfel.

Syntax

Const member-funktionen kan definieras på tre sätt:

1. För funktionsdeklaration inom en klass.

 return_type function_name () const ; 

Exempel:

int get_data() const; 

2. För funktionsdefinition inom klassdeklarationen.

 return_type  function_name ()  const { //function body } 

Exempel:

int get_data() const { //function body } 

3. För funktionsdefinition utanför klassen.

return_type class_name::function_name () const { //function body } 

Exempel:

int Demo :: get_data() const { } 

Viktiga punkter

  • När en funktion deklareras som const, kan den anropas på vilken typ av objekt som helst, const-objekt såväl som icke-const-objekt.
  • Närhelst ett objekt deklareras som const, måste det initieras vid tidpunkten för deklarationen. Emellertid är objektinitieringen under deklarering endast möjlig med hjälp av konstruktörer.
  • En funktion blir const när nyckelordet const används i funktionens deklaration. Tanken med const-funktioner är inte att tillåta dem att modifiera objektet som de anropas på.
  • Det rekommenderas att träna så många funktioner som möjligt så att oavsiktliga ändringar av objekt undviks.

Exempel på Const Member-funktioner

Exempel 1

C++-programmet nedan visar att datamedlemmar kan uppdateras i en medlemsfunktion som inte är 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;> }>

Produktion

11 

Exempel 2

C++-programmet nedan visar att data inte kan uppdateras i en konstantmedlemsfunktion.

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;> }>

Produktion

./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; ^ 

Exempel 3

C++-koden nedan visar hur man definierar konstantmedlemsfunktioner utanför klassdefinitionen och visar användningen av en konstantmedlemsfunktion för att ställa in och hämta värdet på 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;> }>

Produktion

10 

Exempel 4

C++-programmet nedan visar att const-funktioner kan anropas av icke-const-objekt.

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;> }>

Produktion

20 

När en funktion deklareras som const kan den anropas på vilken typ av objekt som helst. Icke-konst-funktioner kan endast anropas av icke-konst-objekt.

Till exempel har följande program kompilatorfel.

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;> }>

Produktion

./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(); 

Låt oss titta på ett annat exempel:

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);> }>

Produktion

Hello world I'm Rancho Baba Inside display() Function 

Vanliga frågor om Const Member Functions

Q1. Kan const-objekt i en klass anropa icke-const-medlemsfunktioner?

Svar:

Nej, ett objekt som deklarerats som const kan inte modifieras och kan därför endast anropa const-medlemsfunktioner eftersom dessa funktioner säkerställer att objektet inte ändras.

Q2. Kan icke-const-objekt i en klass anropa const member fungera?

Svar:

När en funktion deklareras som const kan den anropas på vilken typ av objekt som helst.