Referencje i modyfikator const
Transkrypt
Referencje i modyfikator const
Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Referencje i modyfikator const Bogdan Kreczmer [email protected] Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Programowanie obiektowe c Copyright2012 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Niniejsza prezentacja została wykonana przy użyciu systemu składu LATEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Znaczenie modyfikatora const Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: zmiennej wskaźnikowej na modyfikowalny obszar pamięci. Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: zmiennej wskaźnikowej na niemodyfikowalny obszar pamięci, wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: → const char∗ wNapis; wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: → const char∗ wNapis; wskaźnika stałego na modyfikowalny obszar pamięci, wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: → → const char∗ wNapis; char∗ const wNapis; wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: → → const char∗ wNapis; char∗ const wNapis; wskaźnika stałego na niemodyfikowalny obszar pamięci. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykłady deklaracji zmiennych wskaźnikowych Posługując się typem wskaźnikowym możliwe jest zadeklarowanie: → char∗ wNapis; Modyfikator const w połączeniu z typem wskaźnikowym pozwala na zadeklarowanie: → → → const char∗ wNapis; char∗ const wNapis; const char∗ const wNapis; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Deklaracje zmiennych wskaźnikowych z const char∗ wNapis; const char∗ wNapis; char∗ const wNapis; const char∗ const wNapis; Wskaźnik na tekst, który może być modyfikowany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; char∗ ObszarPam2[ ] = ”udka”; wNapis = ObszarPam2; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; char∗ ObszarPam2[ ] = ”udka”; wNapis = ObszarPam2; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany (dotyczy to operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; char∗ ObszarPam2[ ] = ”udka”; wNapis = ObszarPam2; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany (dotyczy to operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; char∗ ObszarPam2[ ] = ”udka”; wNapis = ObszarPam2; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany (dotyczy to operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis = ObszarPam; wNapis[0] = ’w’; char∗ ObszarPam2[ ] = ”udka”; wNapis = ObszarPam2; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany (dotyczy to operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ wNapis; wNapis = ObszarPam; wNapis[0] = ’w’; ... Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany (dotyczy to operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Deklaracje zmiennych wskaźnikowych z const char∗ wNapis; const char∗ wNapis; char∗ const wNapis; const char∗ const wNapis; Wskaźnik na tekst, który nie może być modyfikalny. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; wNapis[0] = ’w’; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P napis.cpp: In function ‘int main()’: napis.cpp:22: error: assignment of read-only location ‘* wNapis’ Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik nie może być modyfikowany (dotyczy to tylko operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik nie może być modyfikowany (dotyczy to tylko operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik nie może być modyfikowany (dotyczy to tylko operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik nie może być modyfikowany (dotyczy to tylko operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik na niemodyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; const char∗ wNapis; wNapis = ObszarPam; P= P wNapis[0] ’w’; P wNapis = ”budka”; Podsumowanie: obszar pamięci dostępny poprzez wskaźnik nie może być modyfikowany (dotyczy to tylko operacji z wykorzystaniem tej zmiennej wskaźnikowej), zawartość zmiennej wskaźnikowej może ulegać zmianie, zmienna wskaźnikowa nie musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa const char∗ wNapis = ”łódka”; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; Takie podstawienie może być zródłem poważnych błędów Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; wNapis[0] = ’w’; napis.cpp:6: warning: deprecated conversion from string constant to ‘char*’ Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; wNapis[0] = ’w’; Jeżeli jednak zignorujemy ostrzeżenie, to ... Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; wNapis[0] = ’w’; Segmentation fault (core dumped) Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Dlaczego czasem coś nie działa char∗ wNapis = ”łódka”; wNapis[0] = ’w’; Segmentation fault (core dumped) Wystąpienie tego typu błędu zależy od systemu i użytego kompilatora. Nie zmienia to jednak faktu, że operacja jest niepoprawna. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Deklaracje zmiennych wskaźnikowych z const char∗ wNapis; const char∗ wNapis; char∗ const wNapis; const char∗ const wNapis; Wskaźnik staly na tekst, który może być modyfikowany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; wNapis = ”budka”; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; P= P wNapis ”budka”; P Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; P= P wNapis ”budka”; P Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany, zawartość zmiennej wskaźnikowej nie może ulegać zmianie, zmienna wskaźnikowa musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; P= P wNapis ”budka”; P Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany, zawartość zmiennej wskaźnikowej nie może ulegać zmianie, zmienna wskaźnikowa musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; P= P wNapis ”budka”; P Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany, zawartość zmiennej wskaźnikowej nie może ulegać zmianie, zmienna wskaźnikowa musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; char∗ const wNapis = ObszarPam; wNapis[0] = ’w’; P= P wNapis ”budka”; P Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany, zawartość zmiennej wskaźnikowej nie może ulegać zmianie, zmienna wskaźnikowa musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na modyfikowalny obszar pamięci char ObszarPam[ ] = ”łódka”; PP char∗ const wNapis; P P= P wNapis ObszarPam; P wNapis[0] = ’w’; P= P wNapis ”budka”; P Podsumowanie: obszar pamięci dostępny poprzez wskaźnik może być modyfikowany, zawartość zmiennej wskaźnikowej nie może ulegać zmianie, zmienna wskaźnikowa musi być inicjalizowana w momencie jej deklaracji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Deklaracje zmiennych wskaźnikowych z const char∗ wNapis; const char∗ wNapis; char∗ const wNapis; const char∗ const wNapis; Wskaźnik stały na tekst, który nie może być modyfikalny. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Wskaźnik stały na niemodyfikowalny obszar pamięci const char∗ const Napis = ”łódka”; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Podsumowanie char∗ wNapis const char∗ wNapis char∗ const wNapis const char∗ const wNapis Wskaźnik na tekst, który może być modyfikany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Podsumowanie char∗ wNapis const char∗ wNapis char∗ const wNapis const char∗ const wNapis Wskaźnik na tekst, który nie może być modyfikany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Podsumowanie char∗ wNapis const char∗ wNapis char∗ const wNapis const char∗ const wNapis Wskaźnik stały na tekst, który może być modyfikany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Podsumowanie char∗ wNapis const char∗ wNapis char∗ const wNapis const char∗ const wNapis Wskaźnik stały na tekst, który nie może być modyfikany. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Konwencja zapisu char∗ wNapis const char∗ wNapis char∗ const wNapis const char∗ const wNapis Konwencja zapisu deklaracji zmiennej wskaźnikowej nie jest jednoznaczna. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Konwencja zapisu char∗ wNapis char const∗ wNapis char∗ const wNapis char const∗ const wNapis Konwencja zapisu deklaracji zmiennej wskaźnikowej nie jest jednoznaczna. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Użycie modyfikatora const Modyfikator const odgrywa znacznie większą rolę w odniesieniu do zmiennych wskaźnikowych. Jego podstawowym miejscem użycia jest lista parametrów funkcji, np. char ∗strcpy(char ∗dest, const char ∗src); (patrz: man strcpy) Użycie modyfikatora const pozwala wskazać, co może się zmienić wskutek działania funkcji, a co zmienić się nie może. Pozwala również uniknąć przypadkowych błędów w konstrukcji samej funkcji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Użycie modyfikatora const Modyfikator const odgrywa znacznie większą rolę w odniesieniu do zmiennych wskaźnikowych. Jego podstawowym miejscem użycia jest lista parametrów funkcji, np. char ∗strcpy(char ∗dest, const char ∗src); (patrz: man strcpy) Użycie modyfikatora const pozwala wskazać, co może się zmienić wskutek działania funkcji, a co zmienić się nie może. Pozwala również uniknąć przypadkowych błędów w konstrukcji samej funkcji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Czy wszystko jest tu dobrze? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Przy takiej deklaracji faktycznie program pod względem składni byłby poprawny. Jednakże jego konstrukcja nie byłaby poprawna. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Właściwa deklaracja parametrów zapewnia lepszą kontrolę operacji wewnątrz funkcji. Pozwala to wykryć błąd o znaczeniu semantycznym. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Właściwa deklaracja parametrów zapewnia lepszą kontrolę operacji wewnątrz funkcji. Pozwala to wykryć błąd o znaczeniu semantycznym. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis = ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Komunikat kompilatora: jkowalsk@noxon: prog> g++ wyswietl.cpp wyswietl.cpp: In function ’void WyswietlPomijajacSpacje(const char*)’: wyswietl.cpp:6: error: assignment of read-only location Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Przykład wykorzystania const w liście parametrów #include <iostream> using namespace std; void WyswietlPomijajacSpacje( const char ∗Napis ) { for (; ∗Napis && (∗Napis == ’ ’); ++Napis); cout << Napis << endl; } int main( ) { WyswietlPomijajacSpacje(” } Ile jeszcze do końca?”); Teraz jest już wszystko dobrze. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Funkcja działająca na strukturze struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona Z1, LZespolona { Z2.re += Z1.re; Z2.im += Z1.im; return Z2; } int main( ) { LZespolona } Z2 ) Arg1, Arg2, Suma; Suma = dodaj( Arg1, Arg2 ); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Funkcja działająca na strukturze struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona Z1, LZespolona { Z2.re += Z1.re; Z2.im += Z1.im; return Z2; } int main( ) { LZespolona } Z2 ) Arg1, Arg2, Suma; Suma = dodaj( Arg1, Arg2 ); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Funkcja działająca na strukturze struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona Z1, LZespolona { Z2.re += Z1.re; Z2.im += Z1.im; return Z2; } int main( ) { LZespolona } Z2 ) Arg1, Arg2, Suma; Suma = dodaj( Arg1, Arg2 ); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona Z1, LZespolona Z2 ) { Z2.re += Z1.re; Z2.im += Z1.im; return Z2; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(Arg1, Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona ∗wThis, LZespolona Z2 ) { Z2.re += wThis–>re; Z2.im += wThis –>im; return Z2; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; LZespolona dodaj( LZespolona Z2 ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona LZespolona::dodaj( LZespolona Z2 ) { Z2.re += this–>re; Z2.im += this–>im; return Z2; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = Arg1.dodaj(Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona ∗wThis, LZespolona Z2 ) { Z2.re += wThis–>re; Z2.im += wThis –>im; return Z2; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona ∗wThis, LZespolona ∗wZ2 ) { wZ2–>re += wThis–>re; wZ2–>im += wThis –>im; return ∗wZ2; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, &Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona ∗wThis, LZespolona ∗wZ2 ) { LZespolona Z; Z.re = wThis–>re + wZ2–>re; Z.im = wThis –>im + wZ2–>im; return Z; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, &Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona const ∗wThis, LZespolona const ∗wZ2 ) { LZespolona Z; Z.re = wThis–>re + wZ2–>re; Z.im = wThis –>im + wZ2–>im; return Z; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, &Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; LZespolona dodaj( LZespolona const ∗wZ2 ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona LZespolona::dodaj( LZespolona const ∗wZ2 ) { LZespolona Z; Z.re = this–>re + wZ2–>re; Z.im = this–>im + wZ2–>im; return Z; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = Arg1.dodaj(&Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona const ∗wThis, LZespolona const ∗wZ2 ) { LZespolona Z; Z.re = wThis–>re + wZ2–>re; Z.im = wThis –>im + wZ2–>im; return Z; } int main( ) { LZespolona } Arg1, Arg2, Suma; Suma = dodaj(&Arg1, &Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona dodaj( LZespolona const ∗wThis, LZespolona const ∗wZ2 ) { LZespolona Z; Z.re = wThis–>re + wZ2–>re; Z.im = wThis –>im + wZ2–>im; return Z; } Jak teraz przekszatałcić tę funkcję w metodę? int main( ) { LZespolona Arg1, Arg2, Suma; } Suma = dodaj(&Arg1, &Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; LZespolona dodaj( LZespolona const ∗wZ2 ) const ; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona LZespolona::dodaj( LZespolona const ∗wZ2 ) const { LZespolona Z; Z.re = this–>re + wZ2–>re; Z.im = this–>im + wZ2–>im; return Z; } Modyfikator const przy metodzie sygnalizuje, że nie zmodyfikuje ona obiektu dla int main( ) którego zostanie wywołana. { LZespolona Arg1, Arg2, Suma; } Suma = Arg1.dodaj(&Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; LZespolona dodaj( LZespolona Z2 ) const ; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona LZespolona::dodaj( LZespolona Z2 ) const { Z2.re += this–>re; Z2.im += this–>im; return Z2; } Powróćmy do wersji, gdy drugi argument przekazywany jest przez wartość. int main( ) { LZespolona Arg1, Arg2, Suma; } Suma = Arg1.dodaj(Arg2); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Modyfikator const w połączeniu z typem wskaźnikowym Metody const Od funkcji do metody struct LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . float re; float im; LZespolona operator + ( LZespolona Z2 ) const ; }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LZespolona LZespolona::operator + ( LZespolona Z2 ) const { Z2.re += this–>re; Z2.im += this–>im; return Z2; } W definicji przeciążenia operatora modyfikator const pełni tę samą funkcję jak w int main( ) definicji metod. { LZespolona Arg1, Arg2, Suma; } Suma = Arg1 + Arg2; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe O referencji Referencja w C++ jest pochodnym typem danych (podobnie jak wskaźnik). Umożliwia pośrednie odwoływanie się do zmiennych i obiektów. Kłopoty z terminem referencja w informatyce przez referencję rozumie się pewną ogólną koncepcję typu danych. Określa się w ten sposób obiekt/zmienną zawierającą informację będącą odsyłaczem do właściwej struktury danych. Zmienne wskaźnikowe w C sa przykładem realizacji koncepcji referencji. w C++ referencja jest konkretną implementacją typu danych, który jest istotnie różny od typu wskaźnikowego. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe O referencji Referencja w C++ jest pochodnym typem danych (podobnie jak wskaźnik). Umożliwia pośrednie odwoływanie się do zmiennych i obiektów. Kłopoty z terminem referencja w informatyce przez referencję rozumie się pewną ogólną koncepcję typu danych. Określa się w ten sposób obiekt/zmienną zawierającą informację będącą odsyłaczem do właściwej struktury danych. Zmienne wskaźnikowe w C sa przykładem realizacji koncepcji referencji. w C++ referencja jest konkretną implementacją typu danych, który jest istotnie różny od typu wskaźnikowego. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe O referencji Referencja w C++ jest pochodnym typem danych (podobnie jak wskaźnik). Umożliwia pośrednie odwoływanie się do zmiennych i obiektów. Kłopoty z terminem referencja w informatyce przez referencję rozumie się pewną ogólną koncepcję typu danych. Określa się w ten sposób obiekt/zmienną zawierającą informację będącą odsyłaczem do właściwej struktury danych. Zmienne wskaźnikowe w C sa przykładem realizacji koncepcji referencji. w C++ referencja jest konkretną implementacją typu danych, który jest istotnie różny od typu wskaźnikowego. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe O referencji Referencja w C++ jest pochodnym typem danych (podobnie jak wskaźnik). Umożliwia pośrednie odwoływanie się do zmiennych i obiektów. Kłopoty z terminem referencja w informatyce przez referencję rozumie się pewną ogólną koncepcję typu danych. Określa się w ten sposób obiekt/zmienną zawierającą informację będącą odsyłaczem do właściwej struktury danych. Zmienne wskaźnikowe w C sa przykładem realizacji koncepcji referencji. w C++ referencja jest konkretną implementacją typu danych, który jest istotnie różny od typu wskaźnikowego. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. int Licznik; Dla przykładu rozważmy deklarację zmiennej typu int. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. int Licznik; int* const wskLicznik = &Licznik; Możemy utworzyć stały wskaźnik na zmienną. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. int Licznik; int* const wskLicznik = &Licznik; *wskLicznik = 15; cerr << Licznik; Co się wyświetli po wykonaniu przedstawionych instrukcji? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. int Licznik; int* const wskLicznik = &Licznik; int Licznik; int &refLicznik = Licznik; *wskLicznik = 15; cerr << Licznik; Definiując referencję (podobnie jak stały wskaźnik) należy ją od razu zainicjalizować Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. int Licznik; int Licznik; int* const wskLicznik = &Licznik; int &refLicznik = Licznik; *wskLicznik = 15; cerr << Licznik; refLicznik = 15; cerr << Licznik; Referencją posługujemy się tak samo jak samą zmienną. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencja i wskaźnik W pierwszym przybliżeniu referencja (w C++) może być uważana jako typ wskaźnikowy stały. char Znak; char Znak; char* const wskZnak = &Znak; char &refZnak = Znak; *wskZnak = ’a’; cerr << Znak; refZnak = ’a’; cerr << Znak; Referencją posługujemy się tak samo jak samą zmienną. Dotyczy to zmiennych każdego typu. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Cechy wspólne: poprzez referencje i wskaźniki odwołujemy się do istniejących zmiennych/obiektów, do jednego i tego samego obiektu można utworzyć kilka zmiennych referencjnych lub zmiennych wskaźnikowych, w których znajduje się adres tego obiektu, jeżeli parametr funkcji/metody jest wskaźnikiem lub referencją, to przekazanie zmiennej poprzez ten parametr skutkuje tym, że dokonane modyfikacje wartości zmiennej będą widoczne na zewnątrz funkcji/metod. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Cechy wspólne: poprzez referencje i wskaźniki odwołujemy się do istniejących zmiennych/obiektów, do jednego i tego samego obiektu można utworzyć kilka zmiennych referencjnych lub zmiennych wskaźnikowych, w których znajduje się adres tego obiektu, jeżeli parametr funkcji/metody jest wskaźnikiem lub referencją, to przekazanie zmiennej poprzez ten parametr skutkuje tym, że dokonane modyfikacje wartości zmiennej będą widoczne na zewnątrz funkcji/metod. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Cechy wspólne: poprzez referencje i wskaźniki odwołujemy się do istniejących zmiennych/obiektów, do jednego i tego samego obiektu można utworzyć kilka zmiennych referencjnych lub zmiennych wskaźnikowych, w których znajduje się adres tego obiektu, jeżeli parametr funkcji/metody jest wskaźnikiem lub referencją, to przekazanie zmiennej poprzez ten parametr skutkuje tym, że dokonane modyfikacje wartości zmiennej będą widoczne na zewnątrz funkcji/metod. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Cechy wspólne: poprzez referencje i wskaźniki odwołujemy się do istniejących zmiennych/obiektów, do jednego i tego samego obiektu można utworzyć kilka zmiennych referencjnych lub zmiennych wskaźnikowych, w których znajduje się adres tego obiektu, jeżeli parametr funkcji/metody jest wskaźnikiem lub referencją, to przekazanie zmiennej poprzez ten parametr skutkuje tym, że dokonane modyfikacje wartości zmiennej będą widoczne na zewnątrz funkcji/metod. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Różnice: referencje można zainicjalizowac adresem zmiennej/obiektu tylko raz, w momencie jej deklaracji, jest niedopuszczalny brak inicjalizacji referencji, referencja nie może mieć adresu NULL. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Różnice: referencje można zainicjalizowac adresem zmiennej/obiektu tylko raz, w momencie jej deklaracji, jest niedopuszczalny brak inicjalizacji referencji, referencja nie może mieć adresu NULL. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Różnice: referencje można zainicjalizowac adresem zmiennej/obiektu tylko raz, w momencie jej deklaracji, jest niedopuszczalny brak inicjalizacji referencji, referencja nie może mieć adresu NULL. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Różnice: referencje można zainicjalizowac adresem zmiennej/obiektu tylko raz, w momencie jej deklaracji, jest niedopuszczalny brak inicjalizacji referencji, referencja nie może mieć adresu NULL. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Zalety stosowania referencji: referencja jest bezpieczniejszym sposobem odwołania się do zmiennej. Nie daje jednak stuprocentowej pewności, że zmienna/obiekt, do której odwołujemy się przez referencję, istnieje. sposób odwołania się do zmiennej/obiektu jest dla programisty przezroczysty. Referencję traktujemy tak samo jak zmiennę, do której ta referencja odwołuje się. odwoływanie się poprzez referencję może pozwalać kompilatorowi na lepszą optymalizację kodu (brak zmian przechowywanego adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Zalety stosowania referencji: referencja jest bezpieczniejszym sposobem odwołania się do zmiennej. Nie daje jednak stuprocentowej pewności, że zmienna/obiekt, do której odwołujemy się przez referencję, istnieje. sposób odwołania się do zmiennej/obiektu jest dla programisty przezroczysty. Referencję traktujemy tak samo jak zmiennę, do której ta referencja odwołuje się. odwoływanie się poprzez referencję może pozwalać kompilatorowi na lepszą optymalizację kodu (brak zmian przechowywanego adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Zalety stosowania referencji: referencja jest bezpieczniejszym sposobem odwołania się do zmiennej. Nie daje jednak stuprocentowej pewności, że zmienna/obiekt, do której odwołujemy się przez referencję, istnieje. sposób odwołania się do zmiennej/obiektu jest dla programisty przezroczysty. Referencję traktujemy tak samo jak zmiennę, do której ta referencja odwołuje się. odwoływanie się poprzez referencję może pozwalać kompilatorowi na lepszą optymalizację kodu (brak zmian przechowywanego adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Zalety stosowania referencji: referencja jest bezpieczniejszym sposobem odwołania się do zmiennej. Nie daje jednak stuprocentowej pewności, że zmienna/obiekt, do której odwołujemy się przez referencję, istnieje. sposób odwołania się do zmiennej/obiektu jest dla programisty przezroczysty. Referencję traktujemy tak samo jak zmiennę, do której ta referencja odwołuje się. odwoływanie się poprzez referencję może pozwalać kompilatorowi na lepszą optymalizację kodu (brak zmian przechowywanego adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Wady stosowania referencji: brak elastyczności jaką dają wskaźniki (możliwość zmiany adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe Wady stosowania referencji: brak elastyczności jaką dają wskaźniki (możliwość zmiany adresu). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; int Zm; int ∗ const wskZm = &Zm; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; refZm = 2; int Zm; int ∗ const wskZm = &Zm; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; ... ... ... ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; Jaka wartość zostanie wyświetlona w tym przypadku? int Zm; int ∗ const wskZm = &Zm; ... ... ... ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; ... ... ... ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Jaka wartość zostanie wyświetlona w tym przypadku? A jaka wyświetli się tutaj? Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; ... ... ... ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Jaka wartość zostanie wyświetlona w tym przypadku? Tego nikt nie wie!!! Gdyż . . . Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; int Zm; int ∗ const wskZm = &Zm; ... (int ∗)wskZm = new int ; ... ∗wskZm = 2; cout << Zm << endl; Programowanie obiektowe Jaka wartość zostanie wyświetlona w tym przypadku? Tego nikt nie wie!!! Gdyż można wymusić zmianę wskaźnika. Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; Jaka wartość zostanie wyświetlona w tym przypadku? int Zm; int ∗ const wskZm = &Zm; ... const cast <int ∗>(wskZm) = new int ; ... Tego nikt nie wie!!! Gdyż można ∗wskZm = 2; wymusić zmianę wskaźnika. cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; Tu na pewno wyświetli się 2, gdyż ... int Zm; int ∗ const wskZm = &Zm; ... const cast <int ∗>(wskZm) = new int ; ... Tego nikt nie wie!!! Gdyż można ∗wskZm = 2; wymusić zmianę wskaźnika. cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Referencje versus zmienne wskaźnikowe int Zm; int & refZm = Zm; ... ... ... refZm = 2; cout << Zm << endl; Tu na pewno wyświetli się 2, gdyż referencja nie może być zmieniona. int Zm; int ∗ const wskZm = &Zm; ... const cast <int ∗>(wskZm) = new int ; ... Tego nikt nie wie!!! Gdyż można ∗wskZm = 2; wymusić zmianę wskaźnika. cout << Zm << endl; Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję void Poteguj(int & Wart) { Wart ∗= Wart; } int main( ) { int Zm=2; Poteguj(Zm); cout << Zm << endl; } Używając referencji możemy poprzez parametr przekazać do funkcji zmiennę, której zmiany wartości będą widoczne na „zewnątrz”. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję void Poteguj(int & Wart) { Wart ∗= Wart; } void Poteguj(int ∗ const wWart) { ∗wWart ∗= ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Poteguj(Zm); cout << Zm << endl; } Poteguj(&Zm); cout << Zm << endl; } Analog tej konstrukcji możemy napisać wykorzystując przekazywanie parametru poprzez wskaźnik. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Zm = Poteguj(Zm); cout << Zm << endl; } Zm = Poteguj(&Zm); cout << Zm << endl; } Zapiszmy funkcję Poteguj faktycznie jako funkcje, tzn. procedurę obliczeniową zwracającą wyliczoną wartość. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Zm = Poteguj(2); cout << Zm << endl; } Zm = Poteguj(&Zm); cout << Zm << endl; } Korzystając z funkcji możemy bezpośrednio w liście parametrów posłużyć się stałą liczbową, zaś wynik przypisać zmiennej. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; PP Zm = Poteguj(2 ); P cout << Zm << endl; } Zm = Poteguj(&Zm); cout << Zm << endl; } W tym konkretnym przypadku nie jest to jednak możliwe, gdyż w liście parametrów występuje referencja do zmiennej. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; PP Zm = Poteguj(2 ); P cout << Zm << endl; } Zm = Poteguj(&2); cout << Zm << endl; } A czy analogiczna konstrukcja byłaby poprawna przy przekazaniu parametru przez wskaźnik? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; PP Zm = Poteguj(2 ); P cout << Zm << endl; } PP Zm = Poteguj(&2 ); P cout << Zm << endl; } Absolutnie NIE!!! Gdyż wskaźnik w tym przykładzie, podobnie jak referencja w konstrukcji obok, jest wskaźnikiem na obszar modyfikowalny. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; PP Zm = Poteguj(2 ); P cout << Zm << endl; } PP Zm = Poteguj(&2 ); P cout << Zm << endl; } Czy naprawdę nic się nie da tu zrobić? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(const int & Wart) { return Wart ∗ Wart; } int Poteguj(int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Zm = Poteguj(2); cout << Zm << endl; } PP Zm = Poteguj(&2 ); P cout << Zm << endl; } W przypadku parametru przekazywanego przez referencję wystarczy, że parametr ten zadeklarujemy jako parametr niemodyfikowalny. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(const int & Wart) { return Wart ∗ Wart; } int Poteguj(const int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Zm = Poteguj(2); cout << Zm << endl; } Zm = Poteguj(&2); ??? cout << Zm << endl; } Można by sądzić (naiwnie), że analogiczna konstrukcja będzie również poprawna w przypadku parametrów przekazywanych przez wskaźnik. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję int Poteguj(const int & Wart) { return Wart ∗ Wart; } int Poteguj(const int ∗ const wWart) { return ∗wWart ∗ ∗wWart; } int main( ) { int Zm=2; int main( ) { int Zm=2; Zm = Poteguj(2); cout << Zm << endl; } PP Zm = Poteguj(&2 ); P cout << Zm << endl; } Tak jednak nie jest. Nie można posługiwać się jawnymi adresami do stałych skalarnych, gdyż nie muszą się one w ogóle znajdować w obszarze danych programu. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość wskaźnik Podstawowymi sposobami przekazania parametrów do funkcji/procedury, jest przekazanie przez wartość i wskaźnik. Tego typu mechanizmy są dostępne zarówno w języku C, jak też C++ oraz starszych językach takich jak, np. Pascal. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal wartość procedure Proc(Li :integer); C void Fun(int Li); C++ void Fun(int Li); wskaźnik Przekazywanie parametru wywołania przez wartość powoduje tworzenie jego kopii. Dzięki temu modyfikacje wartości parametru wewnątrz funkcji nie są „widoczne” na zewnątrz. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wartość #include <iostream> using namespace std; float Poteguj(float Li) { Li ∗= Li; return Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Jako przykład rozważmy prostą funkcję. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wartość #include <iostream> using namespace std; float Poteguj(float Li) { Li ∗= Li; return Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Funkcja Poteguj modyfikuje wewnątrz wartość parametru formalnego Li. Jednak zmiany nie mogą mieć wpływu na wartość rzeczywistego parametru Zm w wywołaniu tej funkcji. Tak więc to co wyświetli ten program to . . . Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wartość #include <iostream> using namespace std; float Poteguj(float Li) { Li ∗= Li; return Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm jk@diablo> ./prog Przed: 2 Po: 2 Wynik: 4 << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; . . . to będzie to co powyżej :) Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal wartość procedure Proc(Li :integer); C void Fun(int Li); C++ void Fun(int Li); wskaźnik Drugim wariantem przekazywania parametrów do funkcji jest użycie wskaźnika. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); Wykorzystanie jako parametru formalnego wskaźnika pozwala na dokonanie przez funkcję modyfikacji w obszarze pamięci procesu, które będą „widoczne” po zakończeniu działania funkcji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wskaźnik #include <iostream> using namespace std; void PotegujParametr(float ∗wLi) { ∗wLi ∗= ∗wLi; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; Zm << endl; PotegujParametr(&Zm); } cout << ” Po: ” << Np. rozważmy ponownie prosty przykład. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wskaźnik #include <iostream> using namespace std; void PotegujParametr(float ∗wLi) { ∗wLi ∗= ∗wLi; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; Zm << endl; PotegujParametr(&Zm); } cout << ” Po: ” << Funkcja PotegujParametr wykorzystując jako parametr formalny wskaźnik wLi dokonuje modyfikacji zawartości zmiennej Zm. Tak więc to co się wyświetli to . . . Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez wskaźnik #include <iostream> using namespace std; jk@diablo> ./prog Przed: 2 Po: 4 void PotegujParametr(float ∗wLi) { ∗wLi ∗= ∗wLi; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; PotegujParametr(&Zm); } cout << ” Po: ” << Zm << endl; Funkcja PotegujParametr wykorzystując jako parametr formalny wskaźnik wLi dokonuje modyfikacji zawartości zmiennej Zm. Tak więc to co się wyświetli to widać powyżej. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); zmiennę/ referencję Język C++ dostarcza alternatywny sposób przekazywania parametrów z możliwością modyfikacji ich wartości, tak aby były one widoczne na „zewnątrz”. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); zmiennę/ referencję procedure Proc(var Li :integer); — void Fun(int& Li); Tym sposobem jest przekazywanie parametru przez referencję. Jest to de facto przekazanie przez wskaźnik. Niemniej zapis jest prostszy i daje potencjalne możliwości lepszej optymalizacji kodu. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do zmiennej #include <iostream> using namespace std; void PotegujParametr(float &Li) { Li ∗= Li; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; Zm << endl; PotegujParametr(Zm); } cout << ” Po: ” << Rozważmy prosty przykład. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do zmiennej #include <iostream> using namespace std; void PotegujParametr(float &Li) { Li ∗= Li; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; Zm << endl; PotegujParametr(Zm); } cout << ” Po: ” << Program zawiera funkcję, która modyfikuje zawartość parametru formalnego. Jak łatwo się domyśleć wynik działania programu będzie . . . Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do zmiennej #include <iostream> using namespace std; jk@diablo> ./prog Przed: 2 Po: 4 void PotegujParametr(float &Li) { Li ∗= Li; } int main( ) { float Zm = 2; cout << ”Przed: ” << Zm << endl; PotegujParametr(Zm); } cout << ” Po: ” << Zm << endl; Program zawiera funkcję, która modyfikuje zawartość parametru formalnego. Jak łatwo się domyśleć wynik działania programu będzie identyczny jak w przykładzie ze wskaźnikami. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); zmiennę/ referencję procedure Proc(var Li :integer); — void Fun(int& Li); referencję const Unikalnym mechanizmem języka C++ (w kontekście niniejszego zestawienia) jest przekazywanie parametru poprzez referencję do zmiennej (lub też stałej), która nie może być modyfikowana. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); zmiennę/ referencję procedure Proc(var Li :integer); — void Fun(int& Li); referencję const — — void Fun(const int& Li); Sposób ten czyni program bardziej przejrzystym i pozwala lepiej odczytać intencje programisty. Zapis taki sygnalizuje, że zawartość parametru nie ulegnie zmianie po zakończeniu działania funkcji. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗= Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Ponownie rozważmy prosty przykład. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗= Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Zawiera on funkcję, do której parametr przekazywany jest przez referencję. Można się domyśleć, że program wyświetli . . . Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗= Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Program nic nie wyświetli!!! Gdyż w programie jest błąd! Gdzie? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗= Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; prog.cpp: In function ‘float Poteguj(const float&)’: prog.cpp:6: error: assignment of read-only reference ‘Li’ Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗= Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; W funkcji Poteguj następuje niedozwolona modyfikacja parametru. W tym przypadku kompilator pomaga nam wykryć przypadkowy błąd. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗ Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Teraz jest już dobrze. A więc jak można się domyśleć wyświetli się . . . końca nie wiadomo czy na pewno ;) Programowanie obiektowe Referencje i modyfikator const (choć nigdy do Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów przez referencję do stałej #include <iostream> using namespace std; float Poteguj(const float &Li) { return Li ∗ Li; } int main( ) { float Zm = 2, Wynik = 0; cout << ”Przed: ” << Zm jk@diablo> ./prog Przed: 2 Po: 2 Wynik: 4 << endl; Wynik = Poteguj(Zm); } cout cout << << ” Po: ” << Zm << endl; ”Wynik: ” << Wynik << endl; Teraz jest już dobrze. A więc jak można się domyśleć wyświetli się to samo co w przykładzie z przekazywaniem parametru przez wartość. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe Przekazywanie parametrów do funkcji Pascal C C++ wartość procedure Proc(Li :integer); void Fun(int Li); void Fun(int Li); wskaźnik procedure Proc(wLi :ˆinteger); void Fun(int∗ wLi); void Fun(int∗ wLi); zmiennę/ referencję procedure Proc(var Li :integer); — void Fun(int& Li); referencję — — void Fun(const int& Li); Język C++ daje większą elastyczność, a zarazem pozwala lepiej kontrolować sposób dostępu do przekazywanych parametrów. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje wyświetlania dla własnej struktury struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, LiczbaZespolona Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos } int main( ) { LiczbaZespolona LZesp; LZesp.re = 2; LZesp.im = 5; } cout << ”Liczba zespolona: ” << LZesp << endl; Dla części urojonej wymuszone zostaje uwidocznienie znaku liczby. Programowanie obiektowe Referencje i modyfikator const << ’i’; Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje wyświetlania dla własnej struktury struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, LiczbaZespolona Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos } int main( ) { LiczbaZespolona LZesp; LZesp.re = 2; LZesp.im = 5; } cout << ”Liczba zespolona: ” << LZesp << endl; Wyświetlona wartość: 2+5i Dla części urojonej wymuszone zostaje uwidocznienie znaku liczby. Programowanie obiektowe << ’i’; Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje zapisu do pliku struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, LiczbaZespolona Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos << ’i’; } int main( ) { LiczbaZespolona LZesp; W analogiczny sposób możemy daną ofstream PlikWy; liczbę zapisać do pliku. PlikWy.open(”nowy test.txt”); Pamiętać jedynie należy aby dołączyć if (!PlikWy.is open()) return 1; plik nagłówkowy fstream. LZesp.re = 2; LZesp.im = 5; PlikWy << ”Liczba zespolona: ” << LZesp << endl; if (PlikWy.fail()) cout << ”Blad operacji czytania\n”; PlikWy.close(); } Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje zapisu do pliku struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, LiczbaZespolona Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos << ’i’; } int main( ) { LiczbaZespolona LZesp; W analogiczny sposób możemy daną ofstream PlikWy; liczbę zapisać do pliku. PlikWy.open(”nowy test.txt”); Pamiętać jedynie należy aby dołączyć if (!PlikWy.is open()) return 1; plik nagłówkowy fstream. LZesp.re = 2; LZesp.im = 5; PlikWy << ”Liczba zespolona: ” << LZesp << endl; if (PlikWy.fail()) cout << ”Blad operacji czytania\n”; PlikWy.close(); } Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje wyświetlania dla własnej struktury struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, LiczbaZespolona Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos } << ’i’; int main( ) { LiczbaZespolona LZesp; LZesp.re = 2; LZesp.im = 5; } cout << ”Liczba zespolona: ” << LZesp << endl; Wyświetlona wartość: 2+5i Czy w tym przypadku jedynym możliwym sposobem przekazania parametru jest przekazanie go przez wartość? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje wyświetlania dla własnej struktury struct }; LiczbaZespolona { float re, im; ostream & operator << ( ostream & StrmWy, const LiczbaZespolona &Lz ) { return StrmWy << Lz.re << showpos << Lz.im << noshowpos << ’i’; } int main( ) { LiczbaZespolona LZesp; LZesp.re = 2; LZesp.im = 5; } cout << ”Liczba zespolona: ” << LZesp << endl; Wyświetlona wartość: 2+5i Można go również przekazać przez referencję do obiektu stałego. W tym konkretnym przypadku jest to bardziej właściwe. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct }; LiczbaZespolona { float re, im; istream & operator { ... } >> ( istream & StrmWy, LiczbaZespolona & Lz ) int main( ) { LiczbaZespolona LZesp; cin >> LZesp; } Natomiast dla tego przypadku przekazywanie parametru przez referencję jest konieczne. Musi to być jednak referencja do obiektu modyfikowalnego. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re; StrmWe >> lz.im; StrmWe.ignore( ); return StrmWe; Wczytywana liczba: } 2+5i int main( ) { ... } Prezentowana implementacja czytania liczby zespolonej jest bardzo uproszczona (brak reakcji na błędy). Realizacja czytania: wczytane zostają dwie kolejne liczby, następnie zostaje pominięty pierwszy znak znajdujący się za drugą liczbą. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re; StrmWe >> lz.im; StrmWe.ignore( ); return StrmWe; Wczytywana liczba: } Napis+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { cerr << ”Blad formatu liczby zespolonej” } } Programowanie obiektowe <<endl; Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re; Jeśli ta operacja nie powiedzie się, to następne również. StrmWe >> lz.im; StrmWe.ignore( ); return StrmWe; Wczytywana liczba: } Napis+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { cerr << ”Blad formatu liczby zespolonej” } } Programowanie obiektowe <<endl; Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re; Jeśli ta operacja nie powiedzie się, to następne również. StrmWe >> lz.im; StrmWe.ignore( ); return StrmWe; Wczytywana liczba: } Napis+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { cerr << ”Blad formatu liczby zespolonej” <<endl; cin.clear( ); Aby móc ewentualnie czytać dalej. } } Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Operacje czytania dla własnej struktury struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; Bardziej zwarty zapis, taki sam efekt końcowy. StrmWe.ignore( ); return StrmWe; } Wczytywana liczba: Napis+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { cerr << ”Blad formatu liczby zespolonej” cin.clear( ); } } Programowanie obiektowe <<endl; Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... char Znak; StrmWe >> Znak; ... return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... Właściwe wczytanie liczby zespolonej wymaga char Znak; sprawdzenia poprawności oznaczenia części urojonej. StrmWe >> Znak; if (Znak != ’ i ’) { . . . } return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5Z Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... Dobrze jest, gdy reakcja na błąd jest zgodna z ogólnie char Znak; przyjętą konwencją. Należy więc ustawić flagę fail ... StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.setstate(ios::failbit); } return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5Z Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... ... wcześniej jednak należy zwrócić wczytany znak. Dlachar Znak; czego należy to zrobić i dlaczego to musi być wcześniej? StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5Z Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... Jednak wczytanie znaku również może się nie powieść. char Znak; StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5 Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... Można to rozwiązać w ten sposób. char Znak; StrmWe >> Znak; if ( StrmWe.fail() ) return StrmWe; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; Wczytywana liczba: } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe 2+5 Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; ... A można to rozwiązać również w ten sposób. char Znak = ’x’; (Dlaczego?) StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5 Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; char Znak = ’x’; StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } Wczytywana liczba: 2+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; Przed operacją czytania należy sprawdzić, wynik if ( cin.fail() ) { . . . wcześniejszej operacji i podjąć odpowiednie działania. ... Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; char Znak = ’x’; StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } Wczytywana liczba: 2+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; Czy można tę operację pominąć? if ( cin.fail() ) { . . . ... Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; char Znak = ’x’; StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } Wczytywana liczba: 2+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; Można, pod warunkiem, że właściwie zainicjalizujemy if ( cin.fail() ) { . . . zmiennę Zm. (Dlaczego?) ... Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; char Znak = ’x’; StrmWe >> Znak; if (Znak != ’ i ’) { StrmWe.unget(); StrmWe.setstate(ios::failbit); } return StrmWe; } Wczytywana liczba: 2+5i int main( ) { LiczbaZespolona LZesp; cin >> LZesp; Można również nie rezygnować ze sprawdzenia poprawności if ( cin.fail() ) { . . . wczytania liczb i całość zapisać w bardziej zwarty sposób. ... Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; Czy jednak trzeba w ogóle wczytwać znak ... ’i’ ? Czy nie można tego rozwiązać ... prościej? ... return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; if (StrmWe.peek( ) != ’ i ’) { StrmWe.setstate(ios::failbit); return StrmWe;} ... Można bez wczytywania sprawdzić jaki znak jest ... na początku strumienia wejściowego. return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; if (StrmWe.peek( ) != ’ i ’) { StrmWe.setstate(ios::failbit); return StrmWe;} StrmWe.ignore( ); Jeżeli wszystko jest dobrze, to możemy ten znak ... przeskoczyć. return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; if (StrmWe.peek( ) != ’ i ’) { StrmWe.setstate(ios::failbit); return StrmWe;} StrmWe.ignore( ); I to już wystarczy. return StrmWe; } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Sygnalizacja błędu struct LiczbaZespolona { float re, im; }; istream & operator >> ( istream & StrmWe, LiczbaZespolona & Lz ) { StrmWe >> lz.re >> lz.im; if ( StrmWe.fail() ) return StrmWe; if (StrmWe.peek( ) != ’ i ’) { StrmWe.setstate(ios::failbit); return StrmWe;} StrmWe.ignore( ); Można jeszcze bardziej skrócić i zagęścić ten return StrmWe; zapis, ale to już przy innej okazji. } int main( ) { LiczbaZespolona LZesp; cin >> LZesp; if ( cin.fail() ) { . . . ... Programowanie obiektowe Wczytywana liczba: 2+5i Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Przykładowy problem Jak wyczyścić bufor klawiatury? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Rozwiązanie – przynajmniej częściowe Problem czyszczenia buforu klawiatury można częściowo rozwiązać wykorzystująć metodę ignore. istream& istream::ignore( streamsize n = 1, int delim = EOF ); Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Rozwiązanie – przynajmniej częściowe Problem czyszczenia buforu klawiatury można częściowo rozwiązać wykorzystująć metodę ignore. istream& istream::ignore( streamsize n = 1, int delim = EOF ); cin.ignore(1000,’\n’); W ten sposób pominiemy wszystkie znaki, o ile jest ich nie więcej niż 999. Operacja zostanie wykonana dopiero po naciśnięciu klawisza Enter (dlaczego?). Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Rozwiązanie – przynajmniej częściowe Problem czyszczenia buforu klawiatury można częściowo rozwiązać wykorzystująć metodę ignore. istream& istream::ignore( streamsize n = 1, int delim = EOF ); cin.ignore(1000,’\n’); A co zrobić gdy mamy upartego użytkownika, który wprowadzi więcej znaków? Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Rozwiązanie – przynajmniej częściowe Problem czyszczenia buforu klawiatury można częściowo rozwiązać wykorzystująć metodę ignore. istream& istream::ignore( streamsize n = 1, int delim = EOF ); cin.ignore( numeric limits<streamsize>::max( ), ’\n’); Można dać jako ograniczenie maksymalny rozmiar strumienia!!! Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Właściwe użycie metody ignore #include<iostream> #include<limits> using namespace std; ... cin.ignore( numeric limits<streamsize>::max( ), ’\n’); Aby wszystko było dobrze, nie można zapomnieć o wcześniejszym dołączeniu właściwych plików nagłówkowych. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Plan prezentacji 1 Użycie modyfikatora const Modyfikator const w połączeniu z typem wskaźnikowym Metody const 2 Referencja Czym jest referencja Porównanie – referencje i zmienne wskaźnikowe 3 Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumieniach Ustawianie precyzji wyświetlania liczb Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Manipulator setprecision(.) Manipulator setprecision(.) pozwala ustawić ilość wyświetlanych znaczących cyfr danej liczby. Działanie takie odnosi się do domyślnego formatu wyświetlania liczb zmiennoprzecinkowych. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Przykład użycia manipulatora setprecision(.) int main() { float fLiczba = 123.456789; int iDomyslnaPrecyzja = cout.precision(); } cout << ” << fLiczba << endl; cout << ”Domyslny format po zmianie precyzji: ” << setprecision(4) << fLiczba << endl; cout << ” Powrot do formatu domyslnego: ” << setprecision(iDomyslnaPrecyzja) << fLiczba << endl; Konsola: Domyslny format: ” Domyslny format: 123.457 Domyslny format po zmianie precyzji: 123.5 Powrot do formatu domyslnego: 123.457 Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Stały przecinek Notację dzisiętną ze stała ilością cyfr po przecinku możemy uzyskać wykorzystując manipulator fixed. Manipulator setprecision(.) pozwala wówczas określić ilość cyfr po przecinku, które zostaną wyświetlone. Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Zapis i czytanie liczby zepolonej Czyszczenie bufora – przykład wykorzystania operacji na strumienia Ustawianie precyzji wyświetlania liczb Przykład użycia manipulatora fixed int main() { float fLiczba = 123.456789; int iDomyslnaPrecyzja = cout.precision(); } cout << ” Ustalona liczba cyfr po przecinku: ” << setprecision(4) << fixed << fLiczba << endl; cout << ” Powrot do formatu domyslnego: ” << setprecision(iDomyslnaPrecyzja) << resetiosflags(ios::fixed) << fLiczba << endl; Konsola: Ustalona liczba cyfr po przecinku: 123.5678 Powrot do formatu domyslnego: 123.457 Programowanie obiektowe Referencje i modyfikator const Użycie modyfikatora const Referencja Przeciążanie operacji czytania i zapisu do strumienia Koniec prezentacji Programowanie obiektowe Referencje i modyfikator const