30
Wstęp do programowaia Dariusz Wardecki, wyk. IX

Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Wstęp do programowaia

Dariusz Wardecki, wyk. IX

Page 2: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Generator liczb pseudolosowych

xn = (axn�1 + c) mod m

Liniowy kongruencyjny generator liczb losowych

xn n-ta liczba losowa

a

c

m

mnożnik

przyrost

moduł

Page 3: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Generator liczb pseudolosowych

Cechy:•ściśle określony ciąg liczb•możliwe wartości od 0 do m-1

x_0 -> x_1 -> x_2 -> … x_m-2 -> x_m-1 -> x_0 -> x_1 -> ...

Jeśli współczynniki a, c, m są źle dobrane to okres może być mniejszy.

Page 4: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Generator liczb pseudolosowych

Przykład: liczby pseudolosowe od 0 do 11

m = x_max + 1m = 12

NWD(c,m) = 1, m = 2*2*3c = 7

a - 1 podzielne przez każdy czynnik pierwszy m

a = 13

Page 5: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Generator liczb pseudolosowych

Przykład: liczby pseudolosowe od 0 do 11

x_n = (13*x_n-1 + 7) mod 12

x_1 = 13* 0 + 7 mod 12 = 7 mod 12 = 7x_2 = 13* 7 + 7 mod 12 = 98 mod 12 = 2x_3 = 13* 2 + 7 mod 12 = 33 mod 12 = 9x_4 = 13* 9 + 7 mod 12 = 124 mod 12 = 4

x_5 = 13* 4 + 7 mod 12 = 59 mod 12 = 11x_6 = 13*11 + 7 mod 12 = 150 mod 12 = 6x_7 = 13* 6 + 7 mod 12 = 85 mod 12 = 1

x_8 = 13* 1 + 7 mod 12 = 20 mod 12 = 8x_9 = 13* 8 + 7 mod 12 = 111 mod 12 = 3x_10 = 13* 3 + 7 mod 12 = 46 mod 12 = 10x_11 = 13*10 + 7 mod 12 = 137 mod 12 = 5x_12 = 13* 5 + 7 mod 12 = 72 mod 12 = 0x_13 = 13* 0 + 7 mod 12 = 7 mod 12 = 7x_14 = 13* 7 + 7 mod 12 = 98 mod 12 = 2

Page 6: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Liczby pseudolosowe w przedziale

Zagadnienie: chcemy aby nasz generator losował tylko liczby całkowite z wybranego przedziału <x,y>.

Przykład: gra w kostkę

•dobieramy tak parametry a, c, m aby okres był duży•generujemy liczbe x = (ax + c) mod m•obliczamy (x mod 6) + 1

Page 7: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Funkcja rand()

rand() - generuje liczby w przdziale od 0 do RAND_MAX

srand() - początkowa wartość ziarna (ang. seed)

Page 8: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Liczby losowe generowane sprzętowo

W środowisku linksowyn lik sprzętowy (device file)/dev/random

Page 9: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Metody constZ≥oøone typy danych w C++ Definiowanie klas

Metody „const”

Jeøeli pola, z których korzysta metoda, nie sπ przez niπ zmieniane, moønato zadeklarowaÊ umieszczajπc const w nag≥ówku.

class Vector {

public:

double x, y;

double norm(void) const

{

return x*x + y*y;

}

double length(void) const

{

return sqrt(norm());

}

};

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 27 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Metody „const”

Jeøeli pola, z których korzysta metoda, nie sπ przez niπ zmieniane, moønato zadeklarowaÊ umieszczajπc const w nag≥ówku.

class Vector {

public:

double x, y;

double norm(void) const

{

return x*x + y*y;

}

double length(void) const

{

return sqrt(norm());

}

};

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 27 / 55

Page 10: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Statyczne polaZ≥oøone typy danych w C++ Definiowanie klas

Statyczne pola

Pola bÍdπce sk≥adnikami klas moøna zadeklarowaÊ z atrybutem static.

Wówczas sπ one wspólne dla wszystkich obiektów danej klasy i sπinicjowane przed rozpoczÍciem wykonywania funkcji main().

class Klasa {public:

static int statyczne_pole; // pole wspólne dla wszystkich obiektów tej klasy...

};

...Klasa a, b;

...a.statyczne_pole = 123;cout << b.statyczne_pole << endl; // wydrukuje 123cout << Klasa::statyczne_pole << endl; // wydrukuje 123

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 28 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Statyczne pola

Pola bÍdπce sk≥adnikami klas moøna zadeklarowaÊ z atrybutem static.

Wówczas sπ one wspólne dla wszystkich obiektów danej klasy i sπinicjowane przed rozpoczÍciem wykonywania funkcji main().

class Klasa {public:

static int statyczne_pole; // pole wspólne dla wszystkich obiektów tej klasy...

};

...Klasa a, b;

...a.statyczne_pole = 123;cout << b.statyczne_pole << endl; // wydrukuje 123cout << Klasa::statyczne_pole << endl; // wydrukuje 123

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 28 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Statyczne pola

Pola bÍdπce sk≥adnikami klas moøna zadeklarowaÊ z atrybutem static.

Wówczas sπ one wspólne dla wszystkich obiektów danej klasy i sπinicjowane przed rozpoczÍciem wykonywania funkcji main().

class Klasa {public:

static int statyczne_pole; // pole wspólne dla wszystkich obiektów tej klasy...

};

...Klasa a, b;

...a.statyczne_pole = 123;cout << b.statyczne_pole << endl; // wydrukuje 123cout << Klasa::statyczne_pole << endl; // wydrukuje 123

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 28 / 55

Page 11: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Stałe skojarzone z klasamiZ≥oøone typy danych w C++ Definiowanie klas

Sta≥e skojarzone z klasami

W definicji klasy moøna umieúciÊ definicjÍ sta≥ej.

class Klasa {

public:

static const double jeden = 1; // sta≥a

...

};

Dalej moøna odwo≥ywaÊ siÍ do takiej sta≥ej ≥πczπc nazwÍ klasy z jej nazwπ.

cout << Klasa::jeden << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 29 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Sta≥e skojarzone z klasami

W definicji klasy moøna umieúciÊ definicjÍ sta≥ej.

class Klasa {

public:

static const double jeden = 1; // sta≥a

...

};

Dalej moøna odwo≥ywaÊ siÍ do takiej sta≥ej ≥πczπc nazwÍ klasy z jej nazwπ.

cout << Klasa::jeden << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 29 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Sta≥e skojarzone z klasami

W definicji klasy moøna umieúciÊ definicjÍ sta≥ej.

class Klasa {

public:

static const double jeden = 1; // sta≥a

...

};

Dalej moøna odwo≥ywaÊ siÍ do takiej sta≥ej ≥πczπc nazwÍ klasy z jej nazwπ.

cout << Klasa::jeden << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 29 / 55

Z≥oøone typy danych w C++ Definiowanie klas

Sta≥e skojarzone z klasami

W definicji klasy moøna umieúciÊ definicjÍ sta≥ej.

class Klasa {

public:

static const double jeden = 1; // sta≥a

...

};

Dalej moøna odwo≥ywaÊ siÍ do takiej sta≥ej ≥πczπc nazwÍ klasy z jej nazwπ.

cout << Klasa::jeden << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 29 / 55

Page 12: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Rola funkcji w programach

Referencje w C++ Przekazywanie danych do funkcji

Rola funkcji (procedur) w programach

Funkcje (procedury) s≥uøπ do tego, aby kod, który jest (lub moøe byÊ)wielokrotnie powtarzany w programie, moøna by≥o zapisaÊ tylko raz, apóüniej odwo≥ywaÊ siÍ do niego w okreúlony sposób (z pomocπ nazwyfunkcji).

Na ogó≥ wygodnie jest uøywaÊ funkcji (procedur) do logicznej separacjiczÍúci kodu przeznaczonych do róønych zadaÒ.

Metody w klasach sπ specjalnym rodzajem funkcji.

Aby funkcje mog≥y spe≥niaÊ swoje zadania, muszπ operowaÊ na okreúlonychdanych, które trzeba przekazywaÊ do kodu zapisanego w postaci funkcji.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 30 / 55

Referencje w C++ Przekazywanie danych do funkcji

Rola funkcji (procedur) w programach

Funkcje (procedury) s≥uøπ do tego, aby kod, który jest (lub moøe byÊ)wielokrotnie powtarzany w programie, moøna by≥o zapisaÊ tylko raz, apóüniej odwo≥ywaÊ siÍ do niego w okreúlony sposób (z pomocπ nazwyfunkcji).

Na ogó≥ wygodnie jest uøywaÊ funkcji (procedur) do logicznej separacjiczÍúci kodu przeznaczonych do róønych zadaÒ.

Metody w klasach sπ specjalnym rodzajem funkcji.

Aby funkcje mog≥y spe≥niaÊ swoje zadania, muszπ operowaÊ na okreúlonychdanych, które trzeba przekazywaÊ do kodu zapisanego w postaci funkcji.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 30 / 55

Referencje w C++ Przekazywanie danych do funkcji

Rola funkcji (procedur) w programach

Funkcje (procedury) s≥uøπ do tego, aby kod, który jest (lub moøe byÊ)wielokrotnie powtarzany w programie, moøna by≥o zapisaÊ tylko raz, apóüniej odwo≥ywaÊ siÍ do niego w okreúlony sposób (z pomocπ nazwyfunkcji).

Na ogó≥ wygodnie jest uøywaÊ funkcji (procedur) do logicznej separacjiczÍúci kodu przeznaczonych do róønych zadaÒ.

Metody w klasach sπ specjalnym rodzajem funkcji.

Aby funkcje mog≥y spe≥niaÊ swoje zadania, muszπ operowaÊ na okreúlonychdanych, które trzeba przekazywaÊ do kodu zapisanego w postaci funkcji.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 30 / 55

Page 13: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Przykład - dodawanie macierzy 2x2

Referencje w C++ Przekazywanie danych do funkcji

Przyk≥ad – dodawanie macierzy 2x2

class Matrix22 {public:double w1k1, w1k2, w2k1, w2k2;Matrix22(void): w1k1(0), w1k2(0), w2k1(0), w2k2(0) {}Matrix22(double r): w1k1(r), w1k2(0), w2k1(0), w2k2(r) {}Matrix22(double a, double b, double c, double d):

w1k1(a), w1k2(b), w2k1(c), w2k2(d) {}double det(void) const { return w1k1*w2k2 - w1k2*w2k1; }Matrix22 operator +(Mattix22 m){return Matrix22(w1k1 + m.w1k1, w1k2 + m.w1k2,

w2k1 + m.w2k1, w2k2 + m.w2k2);}

};

int main(){Matrix22 A(1), B(2), C;

C = A + B;cout << C.w1k1 << " " << C.w1k2 << " " << C.w2k1 << " " << C.w2k2 << endl;A = C + B;cout << A.w1k1 << " " << A.w1k2 << " " << A.w2k1 << " " << A.w2k2 << endl;B = A + C;cout << B.w1k1 << " " << B.w1k2 << " " << B.w2k1 << " " << B.w2k2 << endl;return 0;

}

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 31 / 55

Page 14: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Przekazywanie argumentu przez wartośćReferencje w C++ Przekazywanie danych do funkcji

Przekazywanie argumentu przez wartoúÊ

Aby uniknπÊ wielokrotnego powtarzania tego samego kodu wprowadzamyfunkcjÍ drukuj():

void drukuj(Matrix22 M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;

}

int main(){Matrix22 A(1), B(2), C;

C = A + B;drukuj(C);A = C + B;drukuj(A);B = A + C;drukuj(B);return 0;

}

Przy kaødym wywo≥aniu drukuj() tworzona jest kopia obiektuprzekazywanego jako argument (uøywana w funkcji pod nazwπ M).

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 32 / 55

Referencje w C++ Przekazywanie danych do funkcji

Przekazywanie argumentu przez wartoúÊ

Aby uniknπÊ wielokrotnego powtarzania tego samego kodu wprowadzamyfunkcjÍ drukuj():

void drukuj(Matrix22 M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;

}

int main(){Matrix22 A(1), B(2), C;

C = A + B;drukuj(C);A = C + B;drukuj(A);B = A + C;drukuj(B);return 0;

}

Przy kaødym wywo≥aniu drukuj() tworzona jest kopia obiektuprzekazywanego jako argument (uøywana w funkcji pod nazwπ M).

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 32 / 55

Page 15: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Wady przekazywania argumentu przez wartośćReferencje w C++ Przekazywanie danych do funkcji

Wady przekazywania argumentów funkcji przez wartoúÊ

Kaødym wywo≥anie funkcji drukuj() wymaga1 zarezerwowania pamiÍci na 4 zmienne typu double,2 przeprowadzenia operacji kopiowania 4 wartoúci typu double(poúwiÍcamy czas).

Ponosimy zatem koszty zwiπzane z uøyciem funkcji.

Koszty te nie by≥yby ponoszone, gdyby moøna by≥o „powiedzieÊ” funkcji,øe ma pos≥ugiwaÊ siÍ tym samym obiektem, który jest przekazywany jakoargument (bez kopiowania go).

Do tego celu s≥uøπ referencje (ang. reference).

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 33 / 55

Referencje w C++ Przekazywanie danych do funkcji

Wady przekazywania argumentów funkcji przez wartoúÊ

Kaødym wywo≥anie funkcji drukuj() wymaga1 zarezerwowania pamiÍci na 4 zmienne typu double,2 przeprowadzenia operacji kopiowania 4 wartoúci typu double(poúwiÍcamy czas).

Ponosimy zatem koszty zwiπzane z uøyciem funkcji.

Koszty te nie by≥yby ponoszone, gdyby moøna by≥o „powiedzieÊ” funkcji,øe ma pos≥ugiwaÊ siÍ tym samym obiektem, który jest przekazywany jakoargument (bez kopiowania go).

Do tego celu s≥uøπ referencje (ang. reference).

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 33 / 55

Referencje w C++ Przekazywanie danych do funkcji

Wady przekazywania argumentów funkcji przez wartoúÊ

Kaødym wywo≥anie funkcji drukuj() wymaga1 zarezerwowania pamiÍci na 4 zmienne typu double,2 przeprowadzenia operacji kopiowania 4 wartoúci typu double(poúwiÍcamy czas).

Ponosimy zatem koszty zwiπzane z uøyciem funkcji.

Koszty te nie by≥yby ponoszone, gdyby moøna by≥o „powiedzieÊ” funkcji,øe ma pos≥ugiwaÊ siÍ tym samym obiektem, który jest przekazywany jakoargument (bez kopiowania go).

Do tego celu s≥uøπ referencje (ang. reference).

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 33 / 55

Page 16: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Przekazywanie argumentu przez referencję

Referencje w C++ Funkcje i referencje

Przekazywanie argumentu przez referencjÍ

Aby uniknπÊ kopiowania obiektu przekazywanego jako argument do funkcjimoøna uøyÊ referencji:

void drukuj(Matrix22& M)

{

cout << M.w1k1 << " " << M.w1k2 << " "

<< M.w2k1 << " " << M.w2k2 << endl;

}

Wtedy funkcja bÍdzie uøywaÊ tego samego obiektu, który zosta≥przekazany jako argument (bez kopiowania go), ale pod innπ nazwπ.

Wówczas modyfikacje tego obiektu przez funkcjÍ zostanπ zachowane ibÍdπ „widoczne” po zakoÒczeniu wykonywania jej.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 34 / 55

Referencje w C++ Funkcje i referencje

Przekazywanie argumentu przez referencjÍ

Aby uniknπÊ kopiowania obiektu przekazywanego jako argument do funkcjimoøna uøyÊ referencji:

void drukuj(Matrix22& M)

{

cout << M.w1k1 << " " << M.w1k2 << " "

<< M.w2k1 << " " << M.w2k2 << endl;

}

Wtedy funkcja bÍdzie uøywaÊ tego samego obiektu, który zosta≥przekazany jako argument (bez kopiowania go), ale pod innπ nazwπ.

Wówczas modyfikacje tego obiektu przez funkcjÍ zostanπ zachowane ibÍdπ „widoczne” po zakoÒczeniu wykonywania jej.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 34 / 55

Referencje w C++ Funkcje i referencje

Przekazywanie argumentu przez referencjÍ

Aby uniknπÊ kopiowania obiektu przekazywanego jako argument do funkcjimoøna uøyÊ referencji:

void drukuj(Matrix22& M)

{

cout << M.w1k1 << " " << M.w1k2 << " "

<< M.w2k1 << " " << M.w2k2 << endl;

}

Wtedy funkcja bÍdzie uøywaÊ tego samego obiektu, który zosta≥przekazany jako argument (bez kopiowania go), ale pod innπ nazwπ.

Wówczas modyfikacje tego obiektu przez funkcjÍ zostanπ zachowane ibÍdπ „widoczne” po zakoÒczeniu wykonywania jej.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 34 / 55

Page 17: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Zwracanie referencji przez funkcjęReferencje w C++ Funkcje i referencje

Zwracanie referencji przez funkcje

Referencje mogπ byÊ zwracane przez funkcje (lub metody) jako wyniki.

Coú takiego oznacza, øe funkcja przekazuje kontrolÍ nad obiektem, którympos≥ugiwa≥a siÍ, do funkcji wywo≥ujπcej jπ.

Ma to sens jedynie w przypadku obiektów, o których wiadomo, øe bÍdπistnia≥y po zakoÒczeniu wykonywania funkcji zwracajπcych referencje donich (tzn. nie wolno zwracaÊ referencji do obiektów bÍdπcych zmiennymilokalnymi w funkcji zwracajπcej referencjÍ do obiektu).

Matrix22& drukuj(ostream& out, Matrix22& M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;return M; // Przekazanie kontroli nad (obiektem reprezentowanym przez) M z powrotem.

}

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 35 / 55

Referencje w C++ Funkcje i referencje

Zwracanie referencji przez funkcje

Referencje mogπ byÊ zwracane przez funkcje (lub metody) jako wyniki.

Coú takiego oznacza, øe funkcja przekazuje kontrolÍ nad obiektem, którympos≥ugiwa≥a siÍ, do funkcji wywo≥ujπcej jπ.

Ma to sens jedynie w przypadku obiektów, o których wiadomo, øe bÍdπistnia≥y po zakoÒczeniu wykonywania funkcji zwracajπcych referencje donich (tzn. nie wolno zwracaÊ referencji do obiektów bÍdπcych zmiennymilokalnymi w funkcji zwracajπcej referencjÍ do obiektu).

Matrix22& drukuj(ostream& out, Matrix22& M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;return M; // Przekazanie kontroli nad (obiektem reprezentowanym przez) M z powrotem.

}

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 35 / 55

Referencje w C++ Funkcje i referencje

Zwracanie referencji przez funkcje

Referencje mogπ byÊ zwracane przez funkcje (lub metody) jako wyniki.

Coú takiego oznacza, øe funkcja przekazuje kontrolÍ nad obiektem, którympos≥ugiwa≥a siÍ, do funkcji wywo≥ujπcej jπ.

Ma to sens jedynie w przypadku obiektów, o których wiadomo, øe bÍdπistnia≥y po zakoÒczeniu wykonywania funkcji zwracajπcych referencje donich (tzn. nie wolno zwracaÊ referencji do obiektów bÍdπcych zmiennymilokalnymi w funkcji zwracajπcej referencjÍ do obiektu).

Matrix22& drukuj(ostream& out, Matrix22& M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;return M; // Przekazanie kontroli nad (obiektem reprezentowanym przez) M z powrotem.

}

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 35 / 55

Referencje w C++ Funkcje i referencje

Zwracanie referencji przez funkcje

Referencje mogπ byÊ zwracane przez funkcje (lub metody) jako wyniki.

Coú takiego oznacza, øe funkcja przekazuje kontrolÍ nad obiektem, którympos≥ugiwa≥a siÍ, do funkcji wywo≥ujπcej jπ.

Ma to sens jedynie w przypadku obiektów, o których wiadomo, øe bÍdπistnia≥y po zakoÒczeniu wykonywania funkcji zwracajπcych referencje donich (tzn. nie wolno zwracaÊ referencji do obiektów bÍdπcych zmiennymilokalnymi w funkcji zwracajπcej referencjÍ do obiektu).

Matrix22& drukuj(ostream& out, Matrix22& M){cout << M.w1k1 << " " << M.w1k2 << " " << M.w2k1 << " " << M.w2k2 << endl;return M; // Przekazanie kontroli nad (obiektem reprezentowanym przez) M z powrotem.

}

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 35 / 55

Page 18: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Na czym polega przeciążanie operatorówZasady przeciπøania operatorów Zasady ogólne

Na czym polega przeciπøanie operatorów

Zamiast podawaÊ nazwÍ metody, moøna jπ oznaczyÊ z pomocπ symboluoperatora. Wtedy liczba argumentów metody zaleøy od liczby argumentówoperatora.

class Wektor {public:

double x, y;void add(Wektor w);

};

void Wektor::add(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w.add(v);

class Wektor {public:

double x, y;void operator +=(Wektor w);

};

void Wektor::operator +=(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w += v; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 36 / 55

Zasady przeciπøania operatorów Zasady ogólne

Na czym polega przeciπøanie operatorów

Zamiast podawaÊ nazwÍ metody, moøna jπ oznaczyÊ z pomocπ symboluoperatora. Wtedy liczba argumentów metody zaleøy od liczby argumentówoperatora.

class Wektor {public:

double x, y;void add(Wektor w);

};

void Wektor::add(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w.add(v);

class Wektor {public:

double x, y;void operator +=(Wektor w);

};

void Wektor::operator +=(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w += v; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 36 / 55

Zasady przeciπøania operatorów Zasady ogólne

Na czym polega przeciπøanie operatorów

Zamiast podawaÊ nazwÍ metody, moøna jπ oznaczyÊ z pomocπ symboluoperatora. Wtedy liczba argumentów metody zaleøy od liczby argumentówoperatora.

class Wektor {public:

double x, y;void add(Wektor w);

};

void Wektor::add(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w.add(v);

class Wektor {public:

double x, y;void operator +=(Wektor w);

};

void Wektor::operator +=(Wektor w){

x += w.x;y += w.y;

}...

Wektor w, v;

...w += v; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 36 / 55

Page 19: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

ArgumentyZasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Argumenty

Argumenty funkcji wywo≥ywanej jako operator nie muszπ byÊ tego samegotypu jak obiekt, w kontekúcie którego wywo≥ywana jest metoda.

class Wektor {public:

double x, y;void operator *=(double r);

};

void Wektor::operator *=(double r){

x *= r;y *= r;

}...

Wektor w;

...w *= 2; // wywo≥anie metody operator *=

class Wektor {public:

double x, y;void operator +=(double r);

};

void Wektor::operator +=(double r){

x += r;}...

Wektor w;

...w += 1; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 37 / 55

Zasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Argumenty

Argumenty funkcji wywo≥ywanej jako operator nie muszπ byÊ tego samegotypu jak obiekt, w kontekúcie którego wywo≥ywana jest metoda.

class Wektor {public:

double x, y;void operator *=(double r);

};

void Wektor::operator *=(double r){

x *= r;y *= r;

}...

Wektor w;

...w *= 2; // wywo≥anie metody operator *=

class Wektor {public:

double x, y;void operator +=(double r);

};

void Wektor::operator +=(double r){

x += r;}...

Wektor w;

...w += 1; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 37 / 55

Zasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Argumenty

Argumenty funkcji wywo≥ywanej jako operator nie muszπ byÊ tego samegotypu jak obiekt, w kontekúcie którego wywo≥ywana jest metoda.

class Wektor {public:

double x, y;void operator *=(double r);

};

void Wektor::operator *=(double r){

x *= r;y *= r;

}...

Wektor w;

...w *= 2; // wywo≥anie metody operator *=

class Wektor {public:

double x, y;void operator +=(double r);

};

void Wektor::operator +=(double r){

x += r;}...

Wektor w;

...w += 1; // wywo≥anie metody operator +=

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 37 / 55

Page 20: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Przeciążanie operatora []Zasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Przeciπøanie symbolu []

Moøna takøe przeciπøaÊ operator wskazania elementu tablicy [].Reprezentujπca go funkcja najczÍúciej zwraca referencjÍ, aby moøna by≥ouøyÊ jej po lewej stronie operator przypisania =.

class Wektor {public:

double x, y;double& wsp(int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w.wsp(1) = 2; // wywo≥anie metody wsp()

class Wektor {public:

double x, y;double& operator [](int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w[1] = 2; // wywo≥anie metody operator []

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 38 / 55

Zasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Przeciπøanie symbolu []

Moøna takøe przeciπøaÊ operator wskazania elementu tablicy [].Reprezentujπca go funkcja najczÍúciej zwraca referencjÍ, aby moøna by≥ouøyÊ jej po lewej stronie operator przypisania =.

class Wektor {public:

double x, y;double& wsp(int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w.wsp(1) = 2; // wywo≥anie metody wsp()

class Wektor {public:

double x, y;double& operator [](int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w[1] = 2; // wywo≥anie metody operator []

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 38 / 55

Zasady przeciπøania operatorów Argumenty przeciπøonych operatorów

Przeciπøanie symbolu []

Moøna takøe przeciπøaÊ operator wskazania elementu tablicy [].Reprezentujπca go funkcja najczÍúciej zwraca referencjÍ, aby moøna by≥ouøyÊ jej po lewej stronie operator przypisania =.

class Wektor {public:

double x, y;double& wsp(int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w.wsp(1) = 2; // wywo≥anie metody wsp()

class Wektor {public:

double x, y;double& operator [](int n){

return n == 1 ? x : y;}

};

...

Wektor w;

...w[1] = 2; // wywo≥anie metody operator []

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 38 / 55

Page 21: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

KonstruktorKonstruktory i destruktory Konstruktory

Konstruktor

Jeúli w czasie tworzenia obiektu danej klasy naleøy wykonaÊ jakπú akcjÍ(np. zarezerwowaÊ pamiÍÊ), to jednym z jej sk≥adników powinien byÊkonstruktor (ang. constructor).

Konstruktor

Metoda wywo≥ywana automatycznie (z odpowiednimi argumentami)podczas tworzenia obiektu. Zawsze ma takπ nazwÍ, jak klasa, której jestsk≥adnikiem.

class Tablica {public:

double *elem;int n;double& operator [](int n);Tablica(int n_el);

};

Tablica::Tablica(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica tab(10); // wywo≥anie konstruktora

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 39 / 55

Konstruktory i destruktory Konstruktory

Konstruktor

Jeúli w czasie tworzenia obiektu danej klasy naleøy wykonaÊ jakπú akcjÍ(np. zarezerwowaÊ pamiÍÊ), to jednym z jej sk≥adników powinien byÊkonstruktor (ang. constructor).

Konstruktor

Metoda wywo≥ywana automatycznie (z odpowiednimi argumentami)podczas tworzenia obiektu. Zawsze ma takπ nazwÍ, jak klasa, której jestsk≥adnikiem.

class Tablica {public:

double *elem;int n;double& operator [](int n);Tablica(int n_el);

};

Tablica::Tablica(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica tab(10); // wywo≥anie konstruktora

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 39 / 55

Konstruktory i destruktory Konstruktory

Konstruktor

Jeúli w czasie tworzenia obiektu danej klasy naleøy wykonaÊ jakπú akcjÍ(np. zarezerwowaÊ pamiÍÊ), to jednym z jej sk≥adników powinien byÊkonstruktor (ang. constructor).

Konstruktor

Metoda wywo≥ywana automatycznie (z odpowiednimi argumentami)podczas tworzenia obiektu. Zawsze ma takπ nazwÍ, jak klasa, której jestsk≥adnikiem.

class Tablica {public:

double *elem;int n;double& operator [](int n);Tablica(int n_el);

};

Tablica::Tablica(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica tab(10); // wywo≥anie konstruktora

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 39 / 55

Konstruktory i destruktory Konstruktory

Konstruktor

Jeúli w czasie tworzenia obiektu danej klasy naleøy wykonaÊ jakπú akcjÍ(np. zarezerwowaÊ pamiÍÊ), to jednym z jej sk≥adników powinien byÊkonstruktor (ang. constructor).

Konstruktor

Metoda wywo≥ywana automatycznie (z odpowiednimi argumentami)podczas tworzenia obiektu. Zawsze ma takπ nazwÍ, jak klasa, której jestsk≥adnikiem.

class Tablica {public:

double *elem;int n;double& operator [](int n);Tablica(int n_el);

};

Tablica::Tablica(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica tab(10); // wywo≥anie konstruktora

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 39 / 55

Page 22: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Definiowanie wielu konstruktorówKonstruktory i destruktory Konstruktory

Definiowanie wielu konstruktorów

W jednej klasie moøe byÊ wiele konstruktorów, ale muszπ one róøniÊ siÍjednoznacznie liczbπ lub typami danych argumentów.

class Tablica {public:

double *elem;int n;double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);

};

void Tablica::init(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica::Tablica(int n_el){

init(n_el);}

Tablica::Tablica(int n_el, double r){

init(n_el);for (int i = 0; i < n; i++)

elem[i] = r;}

...Tablica tab(10); // Tablica(int)

...Tablica tmp(10, -1); // Tablica(int, double)

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 40 / 55

Konstruktory i destruktory Konstruktory

Definiowanie wielu konstruktorów

W jednej klasie moøe byÊ wiele konstruktorów, ale muszπ one róøniÊ siÍjednoznacznie liczbπ lub typami danych argumentów.

class Tablica {public:

double *elem;int n;double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);

};

void Tablica::init(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica::Tablica(int n_el){

init(n_el);}

Tablica::Tablica(int n_el, double r){

init(n_el);for (int i = 0; i < n; i++)

elem[i] = r;}

...Tablica tab(10); // Tablica(int)

...Tablica tmp(10, -1); // Tablica(int, double)

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 40 / 55

Konstruktory i destruktory Konstruktory

Definiowanie wielu konstruktorów

W jednej klasie moøe byÊ wiele konstruktorów, ale muszπ one róøniÊ siÍjednoznacznie liczbπ lub typami danych argumentów.

class Tablica {public:

double *elem;int n;double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);

};

void Tablica::init(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica::Tablica(int n_el){

init(n_el);}

Tablica::Tablica(int n_el, double r){

init(n_el);for (int i = 0; i < n; i++)

elem[i] = r;}

...Tablica tab(10); // Tablica(int)

...Tablica tmp(10, -1); // Tablica(int, double)

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 40 / 55

Page 23: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Kiedy wywoływane są konstruktoryKonstruktory i destruktory Konstruktory

Kiedy wywo≥ywane sπ konstruktory

Dla zmiennych lokalnych

Bezpoúrednio po utworzeniu zmiennej w czasie wykonywania blokuzawierajπcego jej definicjÍ (przewaønie w miejscu odpowiadajπcympo≥oøeniu definicji zmiennej w obrÍbie bloku).

Dla zmiennych dynamicznych

Bezpoúrednio po utworzeniu zmiennej z uøyciem new, np.:

wsk = new Tablica(10);

Dla zmiennych globalnych lub statycznych

Przed rozpoczÍciem wykonywania funkcji main(), bezpoúrednio pozarezerwowaniu pamiÍci na te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 41 / 55

Konstruktory i destruktory Konstruktory

Kiedy wywo≥ywane sπ konstruktory

Dla zmiennych lokalnych

Bezpoúrednio po utworzeniu zmiennej w czasie wykonywania blokuzawierajπcego jej definicjÍ (przewaønie w miejscu odpowiadajπcympo≥oøeniu definicji zmiennej w obrÍbie bloku).

Dla zmiennych dynamicznych

Bezpoúrednio po utworzeniu zmiennej z uøyciem new, np.:

wsk = new Tablica(10);

Dla zmiennych globalnych lub statycznych

Przed rozpoczÍciem wykonywania funkcji main(), bezpoúrednio pozarezerwowaniu pamiÍci na te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 41 / 55

Konstruktory i destruktory Konstruktory

Kiedy wywo≥ywane sπ konstruktory

Dla zmiennych lokalnych

Bezpoúrednio po utworzeniu zmiennej w czasie wykonywania blokuzawierajπcego jej definicjÍ (przewaønie w miejscu odpowiadajπcympo≥oøeniu definicji zmiennej w obrÍbie bloku).

Dla zmiennych dynamicznych

Bezpoúrednio po utworzeniu zmiennej z uøyciem new, np.:

wsk = new Tablica(10);

Dla zmiennych globalnych lub statycznych

Przed rozpoczÍciem wykonywania funkcji main(), bezpoúrednio pozarezerwowaniu pamiÍci na te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 41 / 55

Page 24: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

DestruktorKonstruktory i destruktory Destruktory

Destruktor

Jeøeli przed usuniÍciem obiektu z pamiÍci trzeba przeprowadziÊ jakπúdodatkowπ czynnoúÊ (np. zwolniÊ pamiÍÊ zarezerwowanπ przezkonstruktor), to jednym ze sk≥adników klasy powinien byÊ destruktor(ang. destructor).

Destruktor

Metoda wykonywana automatycznie bezpoúrednio przed usuniÍciemobiektu z pamiÍci. Jej nazwa musi sk≥adaÊ siÍ ze znaku ~ i nazwy klasy,której jest sk≥adnikiem.

Do destruktora nie moøna przekazywaÊ argumentów, wiÍc w kaødej klasiemoøe byÊ co najwyøej jeden destruktor.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 42 / 55

Konstruktory i destruktory Destruktory

Destruktor

Jeøeli przed usuniÍciem obiektu z pamiÍci trzeba przeprowadziÊ jakπúdodatkowπ czynnoúÊ (np. zwolniÊ pamiÍÊ zarezerwowanπ przezkonstruktor), to jednym ze sk≥adników klasy powinien byÊ destruktor(ang. destructor).

Destruktor

Metoda wykonywana automatycznie bezpoúrednio przed usuniÍciemobiektu z pamiÍci. Jej nazwa musi sk≥adaÊ siÍ ze znaku ~ i nazwy klasy,której jest sk≥adnikiem.

Do destruktora nie moøna przekazywaÊ argumentów, wiÍc w kaødej klasiemoøe byÊ co najwyøej jeden destruktor.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 42 / 55

Konstruktory i destruktory Destruktory

Destruktor

Jeøeli przed usuniÍciem obiektu z pamiÍci trzeba przeprowadziÊ jakπúdodatkowπ czynnoúÊ (np. zwolniÊ pamiÍÊ zarezerwowanπ przezkonstruktor), to jednym ze sk≥adników klasy powinien byÊ destruktor(ang. destructor).

Destruktor

Metoda wykonywana automatycznie bezpoúrednio przed usuniÍciemobiektu z pamiÍci. Jej nazwa musi sk≥adaÊ siÍ ze znaku�i nazwy klasy,której jest sk≥adnikiem.

Do destruktora nie moøna przekazywaÊ argumentów, wiÍc w kaødej klasiemoøe byÊ co najwyøej jeden destruktor.

Rafa≥ J. Wysocki (r wys@f uw. edu. pl ) WstÍp do programowania, czÍúÊ III 30 listopada 2011 42 / 55

Page 25: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Definiowanie destruktora

Konstruktory i destruktory Destruktory

Definiowanie destruktora

class Tablica {public:

double *elem;int n;double& operator [](int n){

return elem[n];}void init(int n_el);Tablica(int n_el){

init(n_el);}Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica::Tablica(int n_el, double r){

init(n_el);for (int i = 0; i < n; i++)

elem[i] = r;}

Tablica::~Tablica(void){

n = 0;if (elem)

delete [] elem;}

...Tablica *wsk;

...wsk = new Tablica(10, 0);...delete wsk; // ~Tablica()

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 43 / 55

Konstruktory i destruktory Destruktory

Definiowanie destruktora

class Tablica {public:

double *elem;int n;double& operator [](int n){

return elem[n];}void init(int n_el);Tablica(int n_el){

init(n_el);}Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el];if (elem)

n = n_el;}

Tablica::Tablica(int n_el, double r){

init(n_el);for (int i = 0; i < n; i++)

elem[i] = r;}

Tablica::~Tablica(void){

n = 0;if (elem)

delete [] elem;}

...Tablica *wsk;

...wsk = new Tablica(10, 0);...delete wsk; // ~Tablica()

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 43 / 55

Page 26: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Kiedy wywoływany jest destruktor?Konstruktory i destruktory Destruktory

Kiedy wywo≥ywany jest destruktor

Dla zmiennych lokalnych

Bezpoúrednio przed usuniÍciem zmiennej z pamiÍci po zakoÒczeniuwykonywania bloku zawierajπcego jej definicjÍ (przewaønie w miejscuodpowiadajπcym po≥oøeniu klamry } koÒczπcej blok).

Dla zmiennych dynamicznych

Bezpoúrednio przed usuniÍciem zmiennej z uøyciem delete.

Dla zmiennych globalnych lub statycznych

Po zakoÒczeniu wykonywania funkcji main(), bezpoúrednio przedzwolnieniem pamiÍci zajmowanej przez te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 44 / 55

Konstruktory i destruktory Destruktory

Kiedy wywo≥ywany jest destruktor

Dla zmiennych lokalnych

Bezpoúrednio przed usuniÍciem zmiennej z pamiÍci po zakoÒczeniuwykonywania bloku zawierajπcego jej definicjÍ (przewaønie w miejscuodpowiadajπcym po≥oøeniu klamry } koÒczπcej blok).

Dla zmiennych dynamicznych

Bezpoúrednio przed usuniÍciem zmiennej z uøyciem delete.

Dla zmiennych globalnych lub statycznych

Po zakoÒczeniu wykonywania funkcji main(), bezpoúrednio przedzwolnieniem pamiÍci zajmowanej przez te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 44 / 55

Konstruktory i destruktory Destruktory

Kiedy wywo≥ywany jest destruktor

Dla zmiennych lokalnych

Bezpoúrednio przed usuniÍciem zmiennej z pamiÍci po zakoÒczeniuwykonywania bloku zawierajπcego jej definicjÍ (przewaønie w miejscuodpowiadajπcym po≥oøeniu klamry } koÒczπcej blok).

Dla zmiennych dynamicznych

Bezpoúrednio przed usuniÍciem zmiennej z uøyciem delete.

Dla zmiennych globalnych lub statycznych

Po zakoÒczeniu wykonywania funkcji main(), bezpoúrednio przedzwolnieniem pamiÍci zajmowanej przez te zmienne.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 44 / 55

Page 27: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Składniki klasy dostępne tylko dla metodKlasy i wyraøenia Wykorzystanie private

Sk≥adniki klasy dostÍpne tylko dla metod

CzÍsto wygodnie jest zadeklarowaÊ sk≥adnik klasy jako dostÍpny tylko dlametod bÍdπcych jej sk≥adnikami.

W tym celu trzeba poprzedziÊ jego definicjÍ modyfikatorem dostÍpuprivate.

class Tablica {private:

double *elem;int n;

public:double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el]; // OKif (elem) // OK

n = n_el; // OK}

...Tablica tab(10);

...cout << tab.n << endl; // B≥πd!

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 45 / 55

Klasy i wyraøenia Wykorzystanie private

Sk≥adniki klasy dostÍpne tylko dla metod

CzÍsto wygodnie jest zadeklarowaÊ sk≥adnik klasy jako dostÍpny tylko dlametod bÍdπcych jej sk≥adnikami.

W tym celu trzeba poprzedziÊ jego definicjÍ modyfikatorem dostÍpuprivate.

class Tablica {private:

double *elem;int n;

public:double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el]; // OKif (elem) // OK

n = n_el; // OK}

...Tablica tab(10);

...cout << tab.n << endl; // B≥πd!

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 45 / 55

Klasy i wyraøenia Wykorzystanie private

Sk≥adniki klasy dostÍpne tylko dla metod

CzÍsto wygodnie jest zadeklarowaÊ sk≥adnik klasy jako dostÍpny tylko dlametod bÍdπcych jej sk≥adnikami.

W tym celu trzeba poprzedziÊ jego definicjÍ modyfikatorem dostÍpuprivate.

class Tablica {private:

double *elem;int n;

public:double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el]; // OKif (elem) // OK

n = n_el; // OK}

...Tablica tab(10);

...cout << tab.n << endl; // B≥πd!

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 45 / 55

Klasy i wyraøenia Wykorzystanie private

Sk≥adniki klasy dostÍpne tylko dla metod

CzÍsto wygodnie jest zadeklarowaÊ sk≥adnik klasy jako dostÍpny tylko dlametod bÍdπcych jej sk≥adnikami.

W tym celu trzeba poprzedziÊ jego definicjÍ modyfikatorem dostÍpuprivate.

class Tablica {private:

double *elem;int n;

public:double& operator [](int n);void init(int n_el);Tablica(int n_el);Tablica(int n_el, double r);~Tablica(void);

};

void Tablica::init(int n_el){

elem = new double[n_el]; // OKif (elem) // OK

n = n_el; // OK}

...Tablica tab(10);

...cout << tab.n << endl; // B≥πd!

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 45 / 55

Page 28: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Czym jest wskaźnik this

Klasy i wyraøenia Wskaünik this

Czym jest wskaünik this

Kaødy obiekt dowolnej klasy zawiera pole o nazwie this, które jestwskaünikiem, a jego wartoúciπ jest adres tego obiektu.

Wskaünik this jest typu (Klasa *), gdzie Klasa jest typem danych(klasπ) odpowiadajπcπ obiektowi, w sk≥ad którego on wchodzi.

Wskaünik this jest polem prywatnym, wiÍc moøe byÊ wykorzystywanytylko przez metody bÍdπce sk≥adnikami klasy obiektu.

Obiekt, w którego sk≥ad wchodzi pole this, jest wartoúciπ wyraøenia*this.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 46 / 55

Klasy i wyraøenia Wskaünik this

Czym jest wskaünik this

Kaødy obiekt dowolnej klasy zawiera pole o nazwie this, które jestwskaünikiem, a jego wartoúciπ jest adres tego obiektu.

Wskaünik this jest typu (Klasa *), gdzie Klasa jest typem danych(klasπ) odpowiadajπcπ obiektowi, w sk≥ad którego on wchodzi.

Wskaünik this jest polem prywatnym, wiÍc moøe byÊ wykorzystywanytylko przez metody bÍdπce sk≥adnikami klasy obiektu.

Obiekt, w którego sk≥ad wchodzi pole this, jest wartoúciπ wyraøenia*this.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 46 / 55

Klasy i wyraøenia Wskaünik this

Czym jest wskaünik this

Kaødy obiekt dowolnej klasy zawiera pole o nazwie this, które jestwskaünikiem, a jego wartoúciπ jest adres tego obiektu.

Wskaünik this jest typu (Klasa *), gdzie Klasa jest typem danych(klasπ) odpowiadajπcπ obiektowi, w sk≥ad którego on wchodzi.

Wskaünik this jest polem prywatnym, wiÍc moøe byÊ wykorzystywanytylko przez metody bÍdπce sk≥adnikami klasy obiektu.

Obiekt, w którego sk≥ad wchodzi pole this, jest wartoúciπ wyraøenia*this.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 46 / 55

Klasy i wyraøenia Wskaünik this

Czym jest wskaünik this

Kaødy obiekt dowolnej klasy zawiera pole o nazwie this, które jestwskaünikiem, a jego wartoúciπ jest adres tego obiektu.

Wskaünik this jest typu (Klasa *), gdzie Klasa jest typem danych(klasπ) odpowiadajπcπ obiektowi, w sk≥ad którego on wchodzi.

Wskaünik this jest polem prywatnym, wiÍc moøe byÊ wykorzystywanytylko przez metody bÍdπce sk≥adnikami klasy obiektu.

Obiekt, w którego sk≥ad wchodzi pole this, jest wartoúciπ wyraøenia*this.

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 46 / 55

Page 29: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Do czego przydaje się wskaźnik thisKlasy i wyraøenia Wskaünik this

Do czego przydaje siÍ this?

Wskaünik this przydaje siÍ (miÍdzy innymi) przy przeciπøaniu operatorainkrementacji.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(void){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = ++w;

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 47 / 55

Klasy i wyraøenia Wskaünik this

Do czego przydaje siÍ this?

Wskaünik this przydaje siÍ (miÍdzy innymi) przy przeciπøaniu operatorainkrementacji.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(void){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = ++w;

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 47 / 55

Klasy i wyraøenia Wskaünik this

Do czego przydaje siÍ this?

Wskaünik this przydaje siÍ (miÍdzy innymi) przy przeciπøaniu operatorainkrementacji.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(void){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = ++w;

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 47 / 55

Page 30: Wstęp do programowaiadward/wdp_wyk9.pdfReferencje w C++ Przekazywanie danych do funkcji ść Wady przekazywania argumentów funkcji przez wartoúÊ Kaødym wywo≥anie funkcji drukuj()

Przeciążenie postinkrementacjiKlasy i wyraøenia Wskaünik this

Przeciπøanie postinkrementacji

W celu przeciπøenia postinkrementacji trzeba zdefiniowaÊ metodÍ zjednym parametrem typu int, który otrzymuje wartoúÊ 0.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(int zero){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = w++; // v = w.operator++(0)

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 48 / 55

Klasy i wyraøenia Wskaünik this

Przeciπøanie postinkrementacji

W celu przeciπøenia postinkrementacji trzeba zdefiniowaÊ metodÍ zjednym parametrem typu int, który otrzymuje wartoúÊ 0.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(int zero){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = w++; // v = w.operator++(0)

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 48 / 55

Klasy i wyraøenia Wskaünik this

Przeciπøanie postinkrementacji

W celu przeciπøenia postinkrementacji trzeba zdefiniowaÊ metodÍ zjednym parametrem typu int, który otrzymuje wartoúÊ 0.

class Wektor {public:

double x, y;Wektor(void) {}Wektor(double a, double b){

x = a;y = b;

}double norma(void) const{

return x*x + y*y;}Wektor operator ++(int zero){

x++;y++;return *this;

}};

Wektor w(1, 1), v;

v = w++; // v = w.operator++(0)

cout << w.norma() << " " << v.norma() << endl;

Rafa≥ J. Wysocki ([email protected]) WstÍp do programowania, czÍúÊ III 30 listopada 2011 48 / 55