Temat: const w metodzie pobierzWalute

Odniosę się jeszcze do pytania o słówko const w metodzie pobierającej napis z pola waluta.

Idąc po kolei...

W klasie Liczba mieliśmy taką sytuację, że napis, który zwracaliśmy zadeklarowany był jako wskaźnik:

char* wartoscNapis;

Pisząc metodę pobierzWartoscNapis, mogliśmy to zrobić w ten sposób:

inline char* pobierzWartoscNapis(void) {return wartoscNapis;};

Jeżeli chcieliśmy zaznaczyć, że metoda ta ma nie zmieniać zawartości obiektu, stosowaliśmy po jej nazwie słówko const:

inline char* pobierzWartoscNapis(void) const {return wartoscNapis;};

I rzeczywiście, zawartością obiektu jest w tym przypadku pojedynczy wskaźnik, więc pobierając go z tej metody nie będziemy w stanie zmienić go na zewnątrz - więc nie będziemy w stanie zmienić zawartości obiektu - wszystko się zgadza smile

Natomiast w klasie Waluta, pole przechowujące napis waluty mamy zdefiniowane inaczej, jako statyczną tablicę:

char waluta[4];

Więc w obiekcie tym razem "siedzi" cały napis, a nie wskaźnik na jakiś zewnętrzny napis, jak to było w przypadku klasy Liczba.

Pisząc metodę pobierzWalute, możemy zacząć tak:

inline char* pobierzWalute(void) {return waluta;};

I wszystko na tym etapie działa.

Jeżeli chcemy zasygnalizować, że ta metoda nie ma zmieniać zawartości obiektu, próbujemy to zrobić w ten sposób (analogicznie jak w klasie Liczba):

inline char* pobierzWalute(void) const {return waluta;};

Wówczas kompilator zgłasza błąd. Dlaczego?

Dzieje się tak ponieważ pomimo tego, że zadeklarowaliśmy metodę jako const, to mając wskaźnik na napis waluta, moglibyśmy zmienić ten napis, więc moglibyśmy zmienić zawartość obiektu (a chcemy poprzez const wymusić, że tego nie będzie dało się zrobić).

Dlatego w tym przypadku, konieczne jest jeszcze dodanie słówka const z przodu, aby zasygnalizować, że zwracamy wskaźnik na stały napis i uniemożliwić zmianę tego napisu (napis ten jest przecież elementem obiektu, a my zawartość obiektu chcemy ochronić przed zmianą):

inline const char* pobierzWalute(void) const {return waluta;};

Dopiero teraz kompilator przestaje sygnalizować błąd.



Wracając do klasy Liczba...

Jeżeli mamy zadeklarowaną metodę pobierającą napis w ten sposób:

inline char* pobierzWartoscNapis(void) const {return wartoscNapis;};

To pomimo tego, że taka deklaracja uniemożliwia zmianę pola obiektu (czyli wskaźnika), to sam napis, na który ten wskaźnik wskazuje moglibyśmy zmienić, na przykład tak:

liczba1.pobierzWartoscNapis()[1] = 'a';

Dlatego aby dodatkowo zabezpieczyć się przed taką operacją, możemy zastosować słówko const w deklaracji typu zwracanego przez metodę:

inline const char* pobierzWartoscNapis(void) const {return wartoscNapis;};

Zachęcam do przetestowania tego we własnych programach.