Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

K URS JĘZYKA C++ – WYKŁAD 3 (17.03.2014) Przenoszenie Składowe statyczne Funkcje wbudowane Funkcje zaprzyjaźnione.

Podobne prezentacje


Prezentacja na temat: "K URS JĘZYKA C++ – WYKŁAD 3 (17.03.2014) Przenoszenie Składowe statyczne Funkcje wbudowane Funkcje zaprzyjaźnione."— Zapis prezentacji:

1 K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Funkcje zaprzyjaźnione

2 S PIS TREŚCI Semantyka przenoszenia Składowe statyczne static Funkcje i metody wbudowane inline

3 S EMANTYKA PRZENOSZENIA Konstruktor przenoszący służy do utworzenia nowego obiektu przez przeniesienie danych z obiektu tymczasowego. Konstruktorem przenoszącym jest konstruktor w klasie Klasa, który można wywołać z jednym argumentem typu: Klasa::Klasa (Klasa &&); Klasa::Klasa (const Klasa &&); Kopiowanie przenoszące służy do przeniesienia danych z obiektu tymczasowego (najczęściej poprzez wymianę danych z obiektem tymczasowym). Kopiowanie przenoszące jest przypisaniem w klasie Klasa, który można wywołać z jednym argumentem typu: Klasa & Klasa::operator= (Klasa &&); Klasa & Klasa::operator= (const Klasa &&); Semantyka przenoszenia jest utożsamiana z wykradaniem danych z obiektu tymczasowego.

4 S EMANTYKA PRZENOSZENIA Przykład (1): #include #include class string { char* data; public: string(const char* p) { size_t size = strlen(p) + 1; data = new char[size]; memcpy(data, p, size); }

5 S EMANTYKA PRZENOSZENIA Przykład (2): ~string() { delete[] data; } string(const string& that) { size_t size = strlen(that.data) + 1; data = new char[size]; memcpy(data, that.data, size); }

6 S EMANTYKA PRZENOSZENIA Przykład (3): string (string&& that) { data = that.data; that.data = nullptr; } string& operator= (string that) { std::swap(data, that.data); return *this; } };

7 P OLA STATYCZNE Każdy obiekt danej klasy ma swój własny zestaw pól z danymi. Pole statyczne, z deklaratorem static, nie jest częścią obiektu, istnieje poza jakimkolwiek obiektem i jest wspólne dla wszystkich obiektów danej klasy. Pole statyczne istnieje przez cały czas życia programu, nawet wtedy gdy nie utworzono żadnego obiektu danej klasy.

8 P OLA STATYCZNE Deklaracja pola statycznego w ciele klasy (w pliku nagłówkowym) nie jest jego definicją. Przykład klasy z deklaracją pola statycznego: class data { int dz, mies, rok; public: data (int d, int m, int r) : dz(d), mies(m), rok(r) {/*…*/} static data poczatek_kalendarza; }; Definicję pola statycznego należy umieścić poza klasą (w pliku źródłowym). Przykład definicji pola statycznego poza klasą: data data::poczatek_kalendarza(15,10,1582);

9 P OLA STATYCZNE Odniesienie się do pola statycznego poprzez nazwę klasy: klasa::pole_stat Do pola statycznego można się też odnieść poprzez jakikolwiek obiekt danej klasy: klasa ob, *wsk; // … ob.pole_stat wsk->pole_stat

10 S TATYCZNE FUNKCJE SKŁADOWE Statyczna funkcja składowa, z deklaratorem static, nie odnosi się do żadnego obiektu danej klasy. Statyczna funkcja składowa może być wywołana w dowolnym momencie, nawet wtedy gdy nie utworzono żadnego obiektu danej klasy. Deklaracja statycznej funkcji składowej znajduje się w ciele klasy (w pliku nagłówkowym) a jej definicja jest poza klasą (w pliku źródłowym).

11 S TATYCZNE FUNKCJE SKŁADOWE Przykład klasy z deklaracją statycznej funkcji składowej: class data { int dz, mies, rok; public: data (int d, int m, int r) : dz(d), mies(m), rok(r) {/*…*/} static int roznica (data p, data k); }; Przykład definicji statycznej funkcji składowej: int data::roznica (data p, data k) {/*…*/} W ciele statycznej funkcji składowej nie wolno odnosić się do składowych instancyjnych ani do wskaźnika this. Do statycznej funkcji składowej można odnieść się poprzez nazwę klasy albo poprzez jakikolwiek obiekt danej klasy.

12 F UNKCJE WBUDOWANE Funkcje wbudowane, oznaczone deklaratorem inline, są rozwijane w miejscu wywołania. Ich definicja musi być znana w momencie kompilacji a nie linkowania, dlatego nie tylko ich deklaracja ale również definicja znajduje się w pliku nagłówkowym. Deklarator inline to tylko sugestia dla kompilatora aby wbudowywał funkcję w miejscu jej wywołania. Funkcja inline zostanie skompilowane jako outline w przypadku, gdy: kompilujemy program do pracy z debuggerem, funkcja jest rekurencyjna, pobieramy w programie adres funkcji.

13 F UNKCJE WBUDOWANE Wbudowywanie funkcji w kod ma sens w przypadku krótkich funkcji. Funkcje wbudowane zwiększają rozmiar programu wynikowego ale przyspieszają jego działanie. Przykład funkcji wbudowanej: inline int zaokraglenie (double d) { return d<0 ? int(d-.5) : int(d+.5); }

14 W BUDOWANE FUNKCJE SKŁADOWE W klasie też można definiować wbudowane funkcje składowe. Metoda zdefiniowana w klasie jest traktowana jako wbudowana. Metody wbudowane można także definiować poza klasą.

15 W BUDOWANE FUNKCJE SKŁADOWE Przykład klasy z metodami wbudowanymi: class data { int dz, mies, r; public: data (int d, int m, int r); int dzien (void) const; int miesiac (void) const { return mies; } inline int rok (void) const { return r; } }; inline data::data (int d, int m, int r) : dz(d), mies(m), r(r) {} inline int data::dzien (void) const { return dz; }

16 A RGUMENTY DOMYŚLNE Często mamy taką sytuację, że w ogólnym przypadku funkcja wymaga podania większej liczby argumentów niż w przypadku najprostszym, albo że wartości niektórych argumentów często się powtarzają. Argumenty funkcji globalnych i funkcji składowych w klasie mogą posiadać argumenty domyślne. Argumenty domyślne są formą przeciążania nazwy funkcji.

17 A RGUMENTY DOMYŚLNE Argumenty domyślne mogą występować tylko na końcu listy argumentów. Wartości domyślne nadawane argumentom domyślnym podaje się tylko w deklaracji funkcji, w definicji się tego nie powtarza. Przy wywoływaniu funkcji z argumentami domyślnymi można pomijać argumenty domyślne od końca. Wszystkie argumenty mogą być domyślne.

18 A RGUMENTY DOMYŚLNE Przykład funkcji z argumentem domyślnym: // deklaracja void drukuj (int x, int podst=10); // definicja void drukuj (int x, int podst) {/*…*/} // wywołania drukuj(63); // wynik 63 drukuj(63,16); // wynik 3F drukuj(63,2); // wynik

19 N IENAZWANE ARGUMENTY Jeśli argumentu nazwanego nie używa się w ciele funkcji lub funkcji składowej, to kompilator będzie generował ostrzeżenia. Argumenty, których nie używa się w ciele funkcji mogą nie posiadać swojej nazwy. Również argumenty domyślne mogą nie posiadać nazwy. Przykład funkcji z nienazwanym argumentem: void buczenie (int) { /*…*/ }

20 F UNKCJA BEZ ARGUMENTÓW Jeśli funkcja nie ma żadnych argumentów, to powinno się ją zadeklarować z argumentem void. Przykład: void buczenie (void); // to jest równoważne z // void buczenie (); // w języku C byłoby to równoważne z // void buczenie (...);


Pobierz ppt "K URS JĘZYKA C++ – WYKŁAD 3 (17.03.2014) Przenoszenie Składowe statyczne Funkcje wbudowane Funkcje zaprzyjaźnione."

Podobne prezentacje


Reklamy Google