Referencje i modyfikator const
Bogdan Kreczmer
bogdan.kreczmer@pwr.wroc.pl
Zakład Podstaw Cybernetyki i Robotyki
Instytut Informatyki, Automatyki i Robotyki
Politechnika Wrocławska
Kurs: Programowanie obiektowe
Copyright c
°2010 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
Niniejsza prezentacja została wykonana przy użyciu sys-
temu składu L
A
TEX oraz stylu beamer, którego autorem
jest Till Tantau.
Strona domowa projektu Beamer:
http://latex-beamer.sourceforge.net
Programowanie obiektowe
1
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Plan prezentacji
1
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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
Modyfikator const w połączeniu z typem wskaźnikowym
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;
int
Licznik;
int
&refLicznik = Licznik;
Definiując referencję (podobnie jak stały wskaźnik)
należy ją od razu zainicjalizować
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
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;
int
Licznik;
int
&refLicznik = Licznik;
refLicznik = 15;
cerr
<<
Licznik;
Referencją posługujemy się tak samo jak samą
zmienną.
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
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* const wskZnak = &Znak;
*wskZnak = ’a’;
cerr
<<
Znak;
char
Znak;
char
&refZnak = Znak;
refZnak = ’a’;
cerr
<<
Znak;
Referencją posługujemy się tak samo jak samą
zmienną.
Dotyczy to zmiennych każdego typu.
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Plan prezentacji
1
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ wNapis = ObszarPam;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
char∗ ObszarPam2[ ] = ”udka”;
wNapis = ObszarPam2;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
P
³
³
³
napis.cpp: In function ‘int main()’:
napis.cpp:22: error: assignment of read-only location ‘* wNapis’
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
P
³
³
³
wNapis = ”budka”;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik na niemodyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
const char∗ wNapis;
wNapis = ObszarPam;
wNapis[0] = ’w’;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dlaczego czasem coś nie działa
const char∗ wNapis = ”łódka”;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dlaczego czasem coś nie działa
char∗ wNapis = ”łódka”;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dlaczego czasem coś nie działa
char∗ wNapis = ”łódka”;
Takie podstawienie może być zródłem poważnych błędów
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dlaczego czasem coś nie działa
char∗ wNapis = ”łódka”;
wNapis[0] = ’w’;
Jeżeli jednak zignorujemy ostrzeżenie, to ...
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dlaczego czasem coś nie działa
char∗ wNapis = ”łódka”;
wNapis[0] = ’w’;
Segmentation fault (core dumped)
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
P
³
³
³
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis = ObszarPam;
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Wskaźnik stały na modyfikowalny obszar pamięci
char ObszarPam[ ] = ”łódka”;
char∗ const wNapis;
P
P
P
³
³
³
wNapis = ObszarPam;
P
P
P
³
³
³
wNapis[0] = ’w’;
wNapis = ”budka”;
P
P
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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 we-
wnątrz funkcji.
Pozwala to wykryć błąd o znaczeniu semantycznym.
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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 we-
wnątrz funkcji.
Pozwala to wykryć błąd o znaczeniu semantycznym.
Programowanie obiektowe
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Plan prezentacji
1
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Referencje versus zmienne wskaźnikowe
int Zm;
int & refZm = Zm;
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
Jaka wartość zostanie wyświetlona
w tym przypadku?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
Jaka wartość zostanie wyświetlona
w tym przypadku?
A jaka wyświetli się tutaj?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
Jaka wartość zostanie wyświetlona
w tym przypadku?
Tego nikt nie wie!!! Gdyż . . .
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
Jaka wartość zostanie wyświetlona
w tym przypadku?
Tego nikt nie wie!!! Gdyż można
wymusić zmianę wskaźnika.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
. . .
const cast <int ∗>(wskZm) = new
int ;
. . .
∗wskZm = 2;
cout << Zm << endl;
Jaka wartość zostanie wyświetlona
w tym przypadku?
Tego nikt nie wie!!! Gdyż można
wymusić zmianę wskaźnika.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
. . .
const cast <int ∗>(wskZm) = new
int ;
. . .
∗wskZm = 2;
cout << Zm << endl;
Tu na pewno wyświetli się 2, gdyż
. . .
Tego nikt nie wie!!! Gdyż można
wymusić zmianę wskaźnika.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
. . .
const cast <int ∗>(wskZm) = new
int ;
. . .
∗wskZm = 2;
cout << Zm << endl;
Tu na pewno wyświetli się 2, gdyż
referencja nie może być zmieniona.
Tego nikt nie wie!!! Gdyż można
wymusić zmianę wskaźnika.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
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;
}
void Poteguj(int ∗ const wWart)
{
∗wWart ∗= ∗wWart;
}
int main( )
{
int Zm=2;
Poteguj(&Zm);
cout
<<
Zm
<<
endl;
}
Analog tej konstrukcji możemy napisać wykorzystując przekazywanie parametru
poprzez wskaźnik.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(Zm);
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(&Zm);
cout
<<
Zm
<<
endl;
}
Zapiszmy funkcję Poteguj faktycznie jako funkcje, tzn. procedurę obliczeniową
zwracającą wyliczoną wartość.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2);
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2
P
P
P
³
³
³
)
;
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2
P
P
P
³
³
³
);
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(&2);
cout
<<
Zm
<<
endl;
}
A czy analogiczna konstrukcja byłaby poprawna przy przekazaniu parametru przez
wskaźnik?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2
P
P
P
³
³
³
);
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(&2
P
P
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2
P
P
P
³
³
³
);
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(&2
P
P
P
³
³
³
);
cout
<<
Zm
<<
endl;
}
Czy naprawdę nic się nie da tu zrobić?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(
const int &
Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm =
Poteguj(2)
;
cout
<<
Zm
<<
endl;
}
int Poteguj(int ∗ const wWart)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(&2
P
P
P
³
³
³
);
cout
<<
Zm
<<
endl;
}
W przypadku parametru przekazywanego przez referencję wystarczy, że parametr
ten zadeklarujemy jako parametr niemodyfikowalny.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(const int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2);
cout
<<
Zm
<<
endl;
}
int Poteguj(
const int ∗ const wWart
)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
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
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję
int Poteguj(const int & Wart)
{
return Wart ∗ Wart;
}
int main( )
{
int Zm=2;
Zm = Poteguj(2);
cout
<<
Zm
<<
endl;
}
int Poteguj(
const int ∗ const wWart
)
{
return ∗wWart ∗ ∗wWart;
}
int main( )
{
int Zm=2;
Zm =
Poteguj(&2
P
P
P
³
³
³
)
;
cout
<<
Zm
<<
endl;
}
Tak jednak nie jest. Nie można posługiwać się jawnymi adresami do stałych ska-
larnych, gdyż nie muszą się one w ogóle znajdować w obszarze danych programu.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
Podstawowymi sposobami przekazania parametrów do funkcji/procedury, jest prze-
kazanie 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.
Pascal
C
C++
wartość
wskaźnik
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
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.
Pascal
C
C++
wartość
procedure Proc(Li :integer);
void Fun(int Li);
void Fun(int Li);
wskaźnik
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wartość
Jako przykład rozważmy prostą funkcję.
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wartość
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 . . .
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wartość
. . . to będzie to co powyżej :)
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
jk@diablo> ./prog
Przed: 2
Po: 2
Wynik: 4
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
Drugim wariantem przekazywania parametrów do funkcji jest użycie wskaźnika.
Pascal
C
C++
wartość
procedure Proc(Li :integer);
void Fun(int Li);
void Fun(int Li);
wskaźnik
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
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.
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);
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wskaźnik
Np. rozważmy ponownie prosty przykład.
#include
<
iostream
>
using namespace std;
void PotegujParametr(float ∗wLi)
{
∗wLi ∗= ∗wLi;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(&Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wskaźnik
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 . . .
#include
<
iostream
>
using namespace std;
void PotegujParametr(float ∗wLi)
{
∗wLi ∗= ∗wLi;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(&Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez wskaźnik
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.
#include
<
iostream
>
using namespace std;
void PotegujParametr(float ∗wLi)
{
∗wLi ∗= ∗wLi;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(&Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
jk@diablo> ./prog
Przed: 2
Po: 4
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
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”.
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ę
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
Tym sposobem jest przekazywanie parametru przez referencję. Jest to de facto prze-
kazanie przez wskaźnik. Niemniej zapis jest prostszy i daje potencjalne możliwości
lepszej optymalizacji kodu.
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ę/
procedure Proc(var Li :integer);
—
void Fun(int& Li);
referencję
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do zmiennej
Rozważmy prosty przykład.
#include
<
iostream
>
using namespace std;
void PotegujParametr(float &Li)
{
Li ∗= Li;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do zmiennej
Program zawiera funkcję, która modyfikuje zawartość parametru formalnego. Jak
łatwo się domyśleć wynik działania programu będzie . . .
#include
<
iostream
>
using namespace std;
void PotegujParametr(float &Li)
{
Li ∗= Li;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do zmiennej
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.
#include
<
iostream
>
using namespace std;
void PotegujParametr(float &Li)
{
Li ∗= Li;
}
int main( )
{
float Zm = 2;
cout
<<
”Przed: ”
<<
Zm
<<
endl;
PotegujParametr(Zm);
cout
<<
”
Po: ”
<<
Zm
<<
endl;
}
jk@diablo> ./prog
Przed: 2
Po: 4
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
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.
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ę/
procedure Proc(var Li :integer);
—
void Fun(int& Li);
referencję
referencję
const
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
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.
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ę/
procedure Proc(var Li :integer);
—
void Fun(int& Li);
referencję
referencję
—
—
void Fun(const int& Li);
const
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
Ponownie rozważmy prosty przykład.
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
Zawiera on funkcję, do której parametr przekazywany jest przez referencję. Można
się domyśleć, że program wyświetli . . .
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
Program nic nie wyświetli!!! Gdyż w programie jest błąd! Gdzie?
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
prog.cpp: In function ‘float Poteguj(const float&)’:
prog.cpp:6: error: assignment of read-only reference ‘Li’
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
W funkcji Poteguj następuje niedozwolona modyfikacja parametru. W tym przy-
padku kompilator pomaga nam wykryć przypadkowy błąd.
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
Teraz jest już dobrze. A więc jak można się domyśleć wyświetli się . . .
(choć nigdy do
końca nie wiadomo czy na pewno ;)
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów przez referencję do stałej
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ść.
#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
<<
”
Po: ”
<<
Zm
<<
endl;
cout
<<
”Wynik: ”
<<
Wynik
<<
endl;
}
jk@diablo> ./prog
Przed: 2
Po: 2
Wynik: 4
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów do funkcji
Język C++ daje większą elastyczność, a zarazem pozwala lepiej kontrolować spo-
sób dostępu do przekazywanych parametrów.
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ę/
procedure Proc(var Li :integer);
—
void Fun(int& Li);
referencję
referencję
—
—
void Fun(const int& Li);
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Dylematy
Pytanie
Co powinno decydować o wyborze sposobu przekazywania parametru
do funkcji?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(int∗ wsk p);
⇒
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(int∗ wsk p);
⇒
&
Domyślne rozumienie działania:
Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(int∗ wsk p);
⇒
&
%?
Domyślne rozumienie działania:
Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.
Przekazanie parametru przez wskaźnik nie daje gwa-
rancji, że programista napisał kod całkowicie zgodny z
domyślnym rozumieniem żądanej operacji.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(int& p);
⇒
&
%?
Domyślne rozumienie działania:
Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.
Przekazanie parametru przez referencję poprawia czy-
telność, ale wciąż nie rozwiązuje podstawowego proble-
mu.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(const int& p);
⇒
&
%?
Domyślne rozumienie działania:
Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.
Zastosowanie referencji do obiektu niemodyfikowalnego
daje pewność poprawności przy założeniu, że program
był pisany przez rozsądnego programistę.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Należy wyliczyć liczbę Mersenne’a
dla p = 16, 17, 18.
y = 2
p
− 1
Implementacja narzędzia:
Prototyp funkcji bibliotecznej:
int LiczbaMersennea(int p);
⇒
&
%!!!
Domyślne rozumienie działania:
Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.
W tym przypadku przekazanie parametru przez wartość
daje 100% pewności, że jego ewentualne modyfikcje we-
wnątrz funkcji nie będą widoczne po zakończeniu jej
działania.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przykład zadania
Zadanie:
Sformułowanie problemu
Warunki wstępne
Warunki końcowe
Implementacja narzędzia:
Spójne rozwiązanie uwzględniające
uwarunkowania problemu i intuicje
użytkownika/programisty
⇒
&
%
Domyślne rozumienie i intuicje:
Dodatkowe uwarunkowania
Dążymy do tego, aby kod jak najwierniej odzwierciedlał
strukturę logiczną rozwiązania problemu oraz dodatko-
we uwarunkowania, które nie zawsze są jawnie podane.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Przekazywanie parametrów – referencja versus wartość
Czy sposób przekazywania argumentów do funkcji jest w
ogóle ważny?
Czy jest istotne, czy przekażemy parametr przez wartość,
czy też przez referencję do zmiennej niemodyfikowalnej?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Benchmark – przekazywanie przez wartość
. . .
#define ROZMIAR 10000
struct ZbiorLiczb {
int
Tab[ROZMIAR]; };
int Najwieksza(ZbiorLiczb ZbL, int Idx)
{ return
ZbL. Tab[Idx-1]
>
ZbL. Tab[Idx] ? ZbL. Tab[Idx-1] : ZbL. Tab[Idx]; }
int main( )
{
struct tms CzasProcesu o, CzasProcesu n;
ZbiorLiczb ZestawLiczb;
int Wynik;
times(&CzasProcesu o);
for
(int IloscPowtorzen = 0; IloscPowtorzen
<
100; ++IloscPowtorzen) {
for
(int i = 0; i
<
ROZMIAR; ++i) {
Wynik = Najwieksza(ZestawLiczb,i);
ZestawLiczb. Tab[i] = Wynik;
};
times(&CzasProcesu n);
cout
<<
”Czas procesu (wartosc): ”
<<
CzasProcesu n.tms utime-CzasProcesu o.tms utime
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Benchmark – przekazywanie przez wartość
. . .
#define ROZMIAR 10000
struct ZbiorLiczb {
int
Tab[ROZMIAR]; };
int Najwieksza(ZbiorLiczb ZbL, int Idx)
{ return
ZbL. Tab[Idx-1]
>
ZbL. Tab[Idx] ? ZbL. Tab[Idx-1] : ZbL. Tab[Idx]; }
int main( )
{
struct tms CzasProcesu o, CzasProcesu n;
ZbiorLiczb ZestawLiczb;
int Wynik;
times(&CzasProcesu o);
for
(int IloscPowtorzen = 0; IloscPowtorzen
<
100; ++IloscPowtorzen) {
for
(int i = 0; i
<
ROZMIAR; ++i) {
Wynik = Najwieksza(ZestawLiczb,i);
ZestawLiczb. Tab[i] = Wynik;
};
times(&CzasProcesu n);
cout
<<
”Czas procesu (wartosc): ”
<<
CzasProcesu n.tms utime-CzasProcesu o.tms utime
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Benchmark – przekazywanie przez wartość
. . .
#define ROZMIAR 10000
struct ZbiorLiczb {
int
Tab[ROZMIAR]; };
int Najwieksza(ZbiorLiczb ZbL, int Idx)
{ return
ZbL. Tab[Idx-1]
>
ZbL. Tab[Idx] ? ZbL. Tab[Idx-1] : ZbL. Tab[Idx]; }
int main( )
{
struct tms CzasProcesu o, CzasProcesu n;
ZbiorLiczb ZestawLiczb;
int Wynik;
times(&CzasProcesu o);
for
(int IloscPowtorzen = 0; IloscPowtorzen
<
100; ++IloscPowtorzen) {
for
(int i = 0; i
<
ROZMIAR; ++i) {
Wynik = Najwieksza(ZestawLiczb,i);
ZestawLiczb. Tab[i] = Wynik;
};
times(&CzasProcesu n);
cout
<<
”Czas procesu (wartosc): ”
<<
CzasProcesu n.tms utime-CzasProcesu o.tms utime
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Benchmark – przekazywanie przez referencję
. . .
#define ROZMIAR 10000
struct ZbiorLiczb {
int
Tab[ROZMIAR]; };
int Najwieksza(const ZbiorLiczb &ZbL, int Idx)
{ return
ZbL. Tab[Idx-1]
>
ZbL. Tab[Idx] ? ZbL. Tab[Idx-1] : ZbL. Tab[Idx]; }
int main( )
{
struct tms CzasProcesu o, CzasProcesu n;
ZbiorLiczb ZestawLiczb;
int Wynik;
times(&CzasProcesu o);
for
(int IloscPowtorzen = 0; IloscPowtorzen
<
100; ++IloscPowtorzen) {
for
(int i = 0; i
<
ROZMIAR; ++i) {
Wynik = Najwieksza(ZestawLiczb,i);
ZestawLiczb. Tab[i] = Wynik;
};
times(&CzasProcesu n);
cout
<<
”Czas procesu (wartosc): ”
<<
CzasProcesu n.tms utime-CzasProcesu o.tms utime
<<
endl;
}
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
int Najwieksza(ZbiorLiczb ZbL, int Idx)
int Najwieksza(const ZbiorLiczb &ZbL, int Idx)
Czas
procesu [ms]
bez optymalizacji
Czas
procesu [ms]
optymalizacja -O2
Program w obu wersjach został skompilowany poleceniem:
g++ -pedantic prog.cpp
(CPU: Intel Duo CPU E8400 3.00GHz)
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
int Najwieksza(ZbiorLiczb ZbL, int Idx)
int Najwieksza(const ZbiorLiczb &ZbL, int Idx)
Czas
procesu [ms]
10 615
bez optymalizacji
Czas
procesu [ms]
optymalizacja -O2
W pierwszym przypadku czas realizacji procesu był powyżej 10s.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
int Najwieksza(ZbiorLiczb ZbL, int Idx)
int Najwieksza(const ZbiorLiczb &ZbL, int Idx)
Czas
procesu [ms]
10 615
1
bez optymalizacji
Czas
procesu [ms]
optymalizacja -O2
Po użyciu referencji, która zapobiegała tworzeniu kopii parametru, czas realizacji
procesu był ponad 10000 razy krótszy!
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
int Najwieksza(ZbiorLiczb ZbL, int Idx)
int Najwieksza(const ZbiorLiczb &ZbL, int Idx)
Czas
procesu [ms]
10 615
1
bez optymalizacji
Czas
procesu [ms]
0
0
optymalizacja -O2
Po zastosowaniu optymalizacji kodu:
g++ -pedantic -O2 prog.cpp
w obu przypadkach czas realizacji procesu był poniżej 1ms!
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
A więc jak przekazywać parametry?
W przypadku dużych struktur, jeśli obiekty tego typu mają słu-
żyć tylko do odczytu, bezwględnie należy je przekazywać przez
referencję do obiektu niemodyfikowalnego.
W ten sposób unikamy zbędnego tworzenia kopii obiektu. Ope-
racja tworzenia kopii zawsze wymaga dodatkowego czasu pracy
procesu (nawet po zastosowaniu optymalizacji).
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
A więc jak przekazywać parametry?
W przypadku dużych struktur, jeśli obiekty tego typu mają słu-
żyć tylko do odczytu, bezwględnie należy je przekazywać przez
referencję do obiektu niemodyfikowalnego.
W ten sposób unikamy zbędnego tworzenia kopii obiektu. Ope-
racja tworzenia kopii zawsze wymaga dodatkowego czasu pracy
procesu (nawet po zastosowaniu optymalizacji).
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
A więc jak przekazywać parametry?
Zastanówmy się . . . >:-\
A jak to wygląda w przypadku zmiennych o skrajnie
małym rozmiarze, np. zmiennych typów wbudowanych,
takich jak char, int itp. ?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
int
Czas [ms]
long int
Czas [ms]
float
Czas [ms]
double
Czas [ms]
Porównajmy czasy pracy procesu, gdy parametrami funkcji są wartości lub referen-
cje do: char, int, long int, float oraz double.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
long int
Czas [ms]
float
Czas [ms]
double
Czas [ms]
Dla char trochę lepiej jest, gdy parametry przekazywane są przez referencje.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
float
Czas [ms]
double
Czas [ms]
Dla int natomiast jest odwrotnie.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
3 914
4 016
float
Czas [ms]
double
Czas [ms]
Tak samo jest również dla long int.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
3 914
4 016
float
Czas [ms]
10 121
10 089
double
Czas [ms]
Dla float różnice nie są już takie znaczne.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
3 914
4 016
float
Czas [ms]
10 121
10 089
double
Czas [ms]
12 371
9 534
Dla double ponownie lepiej jest przekazać parametr przez referencję.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
3 914
4 016
float
Czas [ms]
10 121
10 089
double
Czas [ms]
12 371
9 534
Generalnie, różnice nie są zbyt duże. Skąd one jednak wynikają?
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
sizeof(.)
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
5 238
3 832
int
Czas [ms]
3 823
4 103
long int
Czas [ms]
3 914
4 016
float
Czas [ms]
10 121
10 089
double
Czas [ms]
12 371
9 534
sizeof(void∗) = 4
Stanie się to odrobinę bardziej jasne, gdy porównamy rozmiar rozmiar zmiennych
oraz rozmiar wskaźnika.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
Zestawienie czasów procesów
sizeof(.)
Przekazanie przez wartość
Przekazanie przez referencję
TYP Porownaj(TYP L1, TYP L2)
TYP Porownaj(const TYP &L1, const TYP &L2)
char
Czas [ms]
1
5 238
3 832
int
Czas [ms]
4
3 823
4 103
long int
Czas [ms]
4
3 914
4 016
float
Czas [ms]
4
10 121
10 089
double
Czas [ms]
8
12 371
9 534
sizeof(void∗) = 4
Tak jest w przypadku komputera PC z procesorem Intel. Dla AMD64 long int ma
rozmiar 8 bajtów.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
A więc jak przekazywać parametry?
Jak stąd wniosek?
Generalnie, jeżeli rozmiar zmiennej jest większy niż
rozmiar wskaźnika, to zaczyna się bardziej opłacać
przekazywanie parametrów przez referencję.
Wyjątkiem jest przypadek typu char. Tutaj jednak zależy
to silnie od architektury samego procesora i komputera.
Programowanie obiektowe
Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe
A więc jak przekazywać parametry?
Jak stąd wniosek?
Generalnie, jeżeli rozmiar zmiennej jest większy niż
rozmiar wskaźnika, to zaczyna się bardziej opłacać
przekazywanie parametrów przez referencję.
Wyjątkiem jest przypadek typu char. Tutaj jednak zależy
to silnie od architektury samego procesora i komputera.
A co z tego należy zapamiętać?
Jeżeli wartość parametrów po zakończeniu działania
funkcji ma pozostać niezmieniona, to w przypadków
typów skalarnych najlepiej przekazywać je przez wartość.
Programowanie obiektowe