Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Podzikowania ........................................................................... 7
Wstp ....................................................................................... 9
Konwencje typograficzne .......................................................... 15
Zagadnienie 1. Abstrakcje ............................................................................... 17
Zagadnienie 2. Polimorfizm .............................................................................. 19
Zagadnienie 3. Wzorce projektowe .................................................................. 23
Zagadnienie 4. Standardowa biblioteka szablonw ........................................... 27
Zagadnienie 5. Referencje s aliasami, nie wskanikami .................................. 29
Zagadnienie 6. Parametry tablicowe ................................................................ 33
Zagadnienie 7. Wskaniki const i wskaniki na const ....................................... 37
Zagadnienie 8. Wskaniki na wskaniki ........................................................... 41
Zagadnienie 9. Nowe operatory rzutowania ...................................................... 43
Zagadnienie 10. Semantyka metod deklarowanych z const ................................. 47
Zagadnienie 11. Kompilator nadziewa klasy farszem ........................................... 51
Zagadnienie 12. Przypisanie to nie to samo co inicjalizacja ................................ 55
Zagadnienie 13. Operacje kopiowania ................................................................ 59
Zagadnienie 14. Wskaniki funkcji ..................................................................... 63
Zagadnienie 15. Wskaniki skadowych klas nie s wskanikami ........................ 67
Zagadnienie 16. Wskaniki metod nie s wskanikami ....................................... 71
Zagadnienie 17. Deklaratory funkcji i tablic ....................................................... 75
Zagadnienie 18. Obiekty funkcyjne .................................................................... 77
Zagadnienie 19. Wzorzec Command i dewiza hollywoodzka ................................. 81
Zagadnienie 20. Obiekty funkcyjne STL .............................................................. 85
Spis treci
Spis treci
Zagadnienie 7.
Wskaniki const
i wskaniki na const
W swobodnych konwersacjach programici C++ czsto mwic wskanik const
maj tak naprawd na myli wskanik na const. Szkoda, bo to dwa rne pojcia.
T *pt = new T;
const T *pct = pt;
T *const cpt = pt;
// wskanik na T
// wskanik na const T
// wskanik const na T
Zanim zaczniemy gorczkowo tasowa const w deklaracjach wskanikw, powinnimy najpierw zdecydowa, o co nam chodzi. Co ma by stae: wskanik, obiekt
wskazywany, czy moe oba? W deklaracji pct wskanik nie jest stay, stay (niemodyfikowalny) ma by za to obiekt przeze wskazywany; kwalifikator const modyfikuje
typ bazowy T, a nie modyfikator wskanika *. W przypadku cpt deklarowany jest
niemodyfikowalny (stay) wskanik obiektu modyfikowalnego; kwalifikator const
modyfikuje tu modyfikator wskanika *, zostawiajc w spokoju typ bazowy T.
Aby jeszcze zaciemni skadni wskanikw i kwalifikatora const, mona powiedzie,
e kolejno specyfikatorw deklaracji, czyli kolejno tego, co wystpuje w deklaracji wskanika przed pierwszym modyfikatorem *, jest nieistotna. Na przykad, obie
ponisze deklaracje wprowadzaj do programu zmienne dokadnie tego samego typu:
const T *p1;
T const *p2;
// wskanik na const T
// rwnie wskanik na const T
Pierwsza posta jest bardziej klasyczna, ale wielu ekspertw C++ zaleca teraz stosowanie postaci drugiej. W uzasadnieniu podnosz, e owa posta zmniejsza ryzyko
nieporozumie, bo mona sobie pomc odczytaniem deklaracji od tyu: wskanik na
const T. Wybr jednej z powyszych form jest dowolny, wane, aby trzyma si raz
przyjtej konwencji. Sowem, naley uwaa na czsty bd mylenia deklaracji wskanika staego z deklaracj wskanika na obiekt stay (niemodyfikowalny).
T const * p3;
T *const p4 = pt;
22
Wskanik pct (wskanik na const) wskazuje obiekt typu T niebdcy staym (bez
const), ale nie wprowadza to adnej sprzecznoci. W rzeczy samej, sytuacja odwoywania si do obiektw modyfikowalnych za porednictwem wskanikw na const jest
do czsta:
void aFunc( const T *arg1, const T &arg2 );
//
T *a = new T;
T b;
aFunc( a, b );
Przy wywoaniu aFunc nastpuje inicjalizacja arg1 adresem a i arg2 adresem b. Nie
sposb jednak powiedzie, czy a faktycznie wskazuje obiekt niemodyfikowalny, albo
czy b jest const; zakadamy jedynie, e tak bd traktowane w obrbie funkcji aFunc.
To bardzo uyteczne.
Konwersja odwrotna, czyli ze wskanika na obiekt niemodyfikowalny do postaci
wskanika na obiekt modyfikowalny nie jest dozwolona, bo byaby niebezpieczna
(patrz rysunek 7.2).
Rysunek 7.2.
Wskanik na obiekt
bez const nie moe
odnosi si do
obiektu const
23
W takim ukadzie pct moe faktycznie wskazywa obiekt niemodyfikowalny, zdefiniowany z kwalifikatorem const. Gdybymy ten wskanik chcieli skonwertowa do
postaci wskanika na obiekt modyfikowalny, umoliwilibymy potencjalnie zmian
wartoci acT za porednictwem pt:
const T acT;
pct = &act;
pt = pct;
// bd, na szczcie
*pt = aT;
// prba zmiany obiektu const!
Jednak jeli pt bdzie odnosi si do obiektu, ktry (jak acT) zosta zadeklarowany
jako niemodyfikowalny (const), efekt przypisania wci bdzie niezdefiniowany (zobacz Nowe operatory rzutowania [9, 43]).