03 referencje

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

1

Referencja

Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe

Plan prezentacji

1

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym
Porównanie – referencje i zmienne wskaźnikowe

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Plan prezentacji

1

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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:

charwNapis;

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

background image

Referencja

Czym jest referencja

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:

charwNapis;

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

background image

Referencja

Czym jest referencja

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:

charwNapis;

Modyfikator const w połączeniu z typem wskaźnikowym pozwala
na zadeklarowanie:

const charwNapis;

wskaźnika stałego na modyfikowalny obszar pamięci,

wskaźnika stałego na niemodyfikowalny obszar pamięci.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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:

charwNapis;

Modyfikator const w połączeniu z typem wskaźnikowym pozwala
na zadeklarowanie:

const charwNapis;

wskaźnika stałego na modyfikowalny obszar pamięci

,

wskaźnika stałego na niemodyfikowalny obszar pamięci.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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:

charwNapis;

Modyfikator const w połączeniu z typem wskaźnikowym pozwala
na zadeklarowanie:

const charwNapis;

charconst wNapis;

wskaźnika stałego na niemodyfikowalny obszar pamięci.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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:

charwNapis;

Modyfikator const w połączeniu z typem wskaźnikowym pozwala
na zadeklarowanie:

const charwNapis;

charconst wNapis;

wskaźnika stałego na niemodyfikowalny obszar pamięci

.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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:

charwNapis;

Modyfikator const w połączeniu z typem wskaźnikowym pozwala
na zadeklarowanie:

const charwNapis;

charconst wNapis;

const charconst wNapis;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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;

charconst

wNapis;

const charconst

wNapis;

Wskaźnik na tekst, który może być modyfikowany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

charObszarPam2[ ] = ”udka”;

wNapis = ObszarPam2;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

charObszarPam2[ ] = ”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

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

charObszarPam2[ ] = ”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

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

charObszarPam2[ ] = ”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

background image

Referencja

Czym jest referencja

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”;

charwNapis = ObszarPam;

wNapis[0] = ’w’;

charObszarPam2[ ] = ”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

background image

Referencja

Czym jest referencja

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”;

charwNapis;

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

background image

Referencja

Czym jest referencja

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;

charconst

wNapis;

const charconst

wNapis;

Wskaźnik na tekst, który nie może być modyfikalny.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = ObszarPam;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = ObszarPam;

wNapis[0] = ’w’;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = ObszarPam;

wNapis[0] = ’w’;

P

P

P

³

³

³

wNapis = ”budka”;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis = 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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 charwNapis;

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

const charwNapis = ”łódka”;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łódka”;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łódka”;

Takie podstawienie może być zródłem poważnych błędów

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łódka”;

wNapis[0] = ’w’;

napis.cpp:6: warning: deprecated conversion from string constant to ‘char*’

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łódka”;

wNapis[0] = ’w’;

Jeżeli jednak zignorujemy ostrzeżenie, to ...

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łódka”;

wNapis[0] = ’w’;

Segmentation fault (core dumped)

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Dlaczego czasem coś nie działa

charwNapis = ”łó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

background image

Referencja

Czym jest referencja

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;

charconst

wNapis;

const charconst

wNapis;

Wskaźnik staly na tekst, który może być modyfikowany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst wNapis = ObszarPam;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst wNapis = ObszarPam;

wNapis[0] = ’w’;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst wNapis = ObszarPam;

wNapis[0] = ’w’;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst wNapis = ObszarPam;

wNapis[0] = ’w’;

wNapis = ”budka”;

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst wNapis = ObszarPam;

wNapis[0] = ’w’;

wNapis = ”budka”;

P

P

P

³

³

³

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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”;

charconst 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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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;

charconst

wNapis;

const charconst

wNapis;

Wskaźnik stały na tekst, który nie może być modyfikalny.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Podsumowanie

char

wNapis

const char

wNapis

charconst

wNapis

const charconst

wNapis

Wskaźnik na tekst, który może być modyfikany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Podsumowanie

char

wNapis

const char

wNapis

charconst

wNapis

const charconst

wNapis

Wskaźnik na tekst, który nie może być modyfikany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Podsumowanie

char

wNapis

const char

wNapis

charconst

wNapis

const charconst

wNapis

Wskaźnik stały na tekst, który może być modyfikany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Podsumowanie

char

wNapis

const char

wNapis

charconst

wNapis

const charconst

wNapis

Wskaźnik stały na tekst, który nie może być modyfikany.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Konwencja zapisu

char

wNapis

const char

wNapis

charconst

wNapis

const charconst

wNapis

Konwencja zapisu deklaracji zmiennej wskaźnikowej
nie jest jednoznaczna.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Konwencja zapisu

char

wNapis

char const

wNapis

charconst

wNapis

char constconst

wNapis

Konwencja zapisu deklaracji zmiennej wskaźnikowej
nie jest jednoznaczna.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja

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

Referencje i modyfikator const

background image

Referencja

Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Plan prezentacji

1

Referencja

Czym jest referencja
Modyfikator const w połączeniu z typem wskaźnikowym

Porównanie – referencje i zmienne wskaźnikowe

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

zmiennę/
referencję

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

zmiennę/

procedure Proc(var Li :integer);

void Fun(int& Li);

referencję

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

zmiennę/

procedure Proc(var Li :integer);

void Fun(int& Li);

referencję

referencję
const

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

zmiennę/

procedure Proc(var Li :integer);

void Fun(int& Li);

referencję

referencję

void Fun(const int& Li);

const

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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(intwLi);

void Fun(intwLi);

zmiennę/

procedure Proc(var Li :integer);

void Fun(int& Li);

referencję

referencję

void Fun(const int& Li);

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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(intwsk p);

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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(intwsk p);

&

Domyślne rozumienie działania:

Zakładamy, że po wykonaniu tej
operacji p nie ulegnie zmianie.

Programowanie obiektowe

Referencje i modyfikator const

background image

Referencja

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(intwsk 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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

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

Referencje i modyfikator const

background image

Referencja

I to już koniec.

Programowanie obiektowe

Referencje i modyfikator const


Document Outline


Wyszukiwarka

Podobne podstrony:
03 Reference Information
Audi TB 01 03 05 Readiness Quick Reference
Audi TB 01 03 05 Readiness Quick Reference
Audi TB 01 03 05 Readiness Quick Reference
03 Sejsmika04 plytkieid 4624 ppt
03 Odświeżanie pamięci DRAMid 4244 ppt
podrecznik 2 18 03 05
od Elwiry, prawo gospodarcze 03
Probl inter i kard 06'03
TT Sem III 14 03
03 skąd Państwo ma pieniądze podatki zus nfzid 4477 ppt
03 PODSTAWY GENETYKI
Wyklad 2 TM 07 03 09

więcej podobnych podstron