Stałe funkcje członkowskie to te funkcje, którym odmówiono pozwolenia na zmianę wartości elementów danych swojej klasy. Aby funkcja składowa stała się stała, słowo kluczowe const jest dołączane do prototypu funkcji, a także do nagłówka definicji funkcji.
Podobnie jak funkcje składowe i argumenty funkcji składowych, obiekty klasy można również zadeklarować jako const. Obiekt zadeklarowany jako const nie może być modyfikowany i dlatego może wywoływać tylko funkcje składowe const, ponieważ te funkcje zapewniają, że obiekt nie będzie modyfikowany. Obiekt const można utworzyć, dodając słowo kluczowe const do deklaracji obiektu. Każda próba zmiany elementu danych obiektów const powoduje błąd w czasie kompilacji.
Składnia
Funkcję const można zdefiniować na trzy sposoby:
1. Dla deklaracji funkcji w klasie.
return_type function_name () const ;>
Przykład:
int get_data() const;>
2. Dla definicji funkcji w deklaracji klasy.
return_type function_name () const { //function body }> Przykład:
bash sprawdza, czy zmienna środowiskowa jest ustawiona
int get_data() const { //function body }> 3. Dla definicji funkcji poza klasą.
return_type class_name::function_name () const { //function body }> Przykład:
int Demo :: get_data() const { }> Ważne punkty
- Gdy funkcja jest zadeklarowana jako const, można ją wywołać na obiekcie dowolnego typu, obiekcie const, a także obiektach innych niż const.
- Ilekroć obiekt jest deklarowany jako const, musi zostać zainicjowany w momencie deklaracji. jednak inicjalizacja obiektu podczas deklaracji jest możliwa tylko przy pomocy konstruktorów.
- Funkcja staje się const, gdy w jej deklaracji użyte zostanie słowo kluczowe const. Ideą funkcji const nie jest umożliwienie im modyfikowania obiektu, na którym są wywoływane.
- Zaleca się, aby jak najwięcej funkcji było stałych, aby uniknąć przypadkowych zmian w obiektach.
Przykłady stałych funkcji składowych
Przykład 1
Poniższy program w języku C++ pokazuje, że elementy danych można aktualizować w funkcji składowej, która nie jest stała.
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;> }> |
>
>Wyjście
11>
Przykład 2
Poniższy program w języku C++ pokazuje, że danych nie można zaktualizować w funkcji składowej stałej.
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;> }> |
>
>
Wyjście
./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; ^>
Przykład 3
Poniższy kod C++ demonstruje, jak zdefiniować stałe funkcje członkowskie poza definicją klasy i przedstawia użycie stałej funkcji członkowskiej do ustawiania i pobierania wartości prywatnej zmiennej członkowskiej.
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;> }> |
>
>Wyjście
10>
Przykład 4
Poniższy program w C++ pokazuje, że funkcje const mogą być wywoływane przez obiekty inne niż const.
C++
obiekt do jsonobject Java
// 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;> }> |
>
>Wyjście
20>
Gdy funkcja jest zadeklarowana jako const, można ją wywołać na obiekcie dowolnego typu. Funkcje inne niż const mogą być wywoływane tylko przez obiekty inne niż const.
Na przykład następujący program zawiera błędy kompilatora.
C++
scan.nextstring Java
// 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;> }> |
>
>
Wyjście
./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();>
Spójrzmy na inny przykład:
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);> }> |
>
>Wyjście
Hello world I'm Rancho Baba Inside display() Function>
Często zadawane pytania dotyczące funkcji składowych Const
Pytanie 1. Czy obiekty const klasy mogą wywoływać funkcje składowe inne niż const?
Odpowiedź:
Nie, obiektu zadeklarowanego jako const nie można modyfikować i dlatego można wywoływać tylko funkcje składowe const, ponieważ te funkcje zapewniają, że obiekt nie będzie modyfikowany.
Pytanie 2. Czy obiekty klasy inne niż const mogą wywoływać funkcję członkowską const?
Odpowiedź:
Gdy funkcja jest zadeklarowana jako const, można ją wywołać na obiekcie dowolnego typu.