Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Wstęp do programowaia
Dariusz Wardecki, wyk. IX
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ł
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.
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
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
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
Funkcja rand()
rand() - generuje liczby w przdziale od 0 do RAND_MAX
srand() - początkowa wartość ziarna (ang. seed)
Liczby losowe generowane sprzętowo
W środowisku linksowyn lik sprzętowy (device file)/dev/random
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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