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

Podobne dokumenty