K URS JĘZYKA C++ – WYKŁAD 3 (11.03.2015) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.

Slides:



Advertisements
Podobne prezentacje
C++ wykład 9 ( ) Szablony.
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
PROGRAMOWANIE STRUKTURALNE
formatowanie kodu źródłowego
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Wskaźniki. Definiowanie wskaźników Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Real; Przykłady: Wskaźnik.
Struktury.
Tablice.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Biblioteki i przestrzenie nazw
C++ wykład 2 ( ) Klasy i obiekty.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Podstawy programowania II
Podstawy informatyki 2013/2014
Podstawy programowania
Programowanie obiektowe III rok EiT
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Programowanie obiektowe – zastosowanie języka Java SE
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Podstawy informatyki 2013/2014
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe 2013/2014
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 8 ( )
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Programowanie strukturalne i obiektowe C++
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie.
Konstruktory i Destruktory. Konstruktor Konstruktor — co to? Konstruktor — co to? jest metodą służącą do inicjowania obiektów danej klasy jest metodą.
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Kurs języka C++ – wykład 3 ( )
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Programowanie obiektowe – zastosowanie języka Java SE
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne

S PIS TREŚCI Argumenty tymczasowe Semantyka przenoszenia Inicjalizacja za pomocą list Składowe statyczne static Funkcje i metody wbudowane inline Argumenty domyślne

A RGUMENTY TYMCZASOWE Obiekty tymczasowe (określane jako r-wartości), to wartości stojące po prawej stronie operatora przypisania (analogicznie zwykła referencja do zmiennej stojącej po lewej stronie przypisania nazywa się l-wartością). Obiekty tymczasowe (określane jako r-wartości), mogą być przekazywane do funkcji jako referencje do stałych. Z punktu widzenia funkcji, której argumentem jest referencja do stałej, nie jest możliwe rozróżnienie pomiędzy aktualną r- wartością a zwykłym obiektem przekazanym przez referencję.

A RGUMENTY TYMCZASOWE Argument w funkcji będący referencją do r-wartości definiujemy jako TYP &&arg. Argument będący r-referencją może być akceptowany jako niestała wartość, co pozwala funkcjom na ich modyfikację. Z punktu widzenia funkcji, której argumentem jest referencja do stałej, nie jest możliwe rozróżnienie pomiędzy aktualną r- wartością a zwykłym obiektem przekazanym referencję. Argumenty r-referencyjne umożliwiają pewnym obiektom na stworzenie semantyki przenoszenia za pomocą konstruktorów przenoszących oraz przypisań przenoszących.

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.

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); } ~string() { delete[] data; }

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

S EMANTYKA PRZENOSZENIA Przykład (3): string& operator= (const string &that) { if (this == &that) return *this; this->~string(); size_t size = strlen(that.data) + 1; data = new char[size]; memcpy(data, that.data, size); return *this; } string& operator= (string &&that) { std::swap(data, that.data); return *this; } };

I NICJALIZACJA ZA POMOCĄ LIST Inicjowanie list jest w C++ zapożyczone z języka C. Ideą jest, by struktura lub tablica były tworzone przez podanie listy argumentów o kolejności zgodnej, odpowiednio, z kolejnością definicji składowych struktury lub kolejnymi elementami tablicy. Listy inicjalizujące są rekursywne i mogą być zastosowane także do tablicy struktur albo struktury zawierającej inne struktury. W C++ można definiować konstruktory, które naśladują takie inicjalizowanie obiektu za pomocą listy wartości. C++ wiąże koncepcję inicjalizowania list z typem std::initializer_list<>.

I NICJALIZACJA ZA POMOCĄ LIST Konstruktor inicjalizujący za pomocą listy, zwany też konstruktorem sekwencji, definiujemy w klasie Klasa z jednym argumentem typu initializer_list<> : Klasa::Klasa (initializer_list ); To pozwala obiektowi typu Klasa być skonstruowanym z sekwencji wartości typu T przy użyciu składni z klamrami. Przykład: class JakasKlasa { public: JakasKlasa(std::initializer_list list); //… }; //… JakasKlasa ob1 = {2, 3, 5, 7}; JakaKlasa ob2{11, 13, 17, 19};

J EDNOLITA INICJALIZACJA …

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.

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

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

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).

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. Statyczna funkcja składowa nie może się bezpśrednio odwoływać do składowych instancyjnych.

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.

F UNKCJE WBUDOWANE Wbudowywanie funkcji w kod ma sens w przypadku krótkich funkcji, które są często wywoływane. 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); }

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ą (aby funkcja wbudowana była wstawiana w miejsce wywołania, to jej definicja powinna się znaleźć w pliku nagłówkowym).

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

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.

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.

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

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) { /*…*/ }

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