1=Przestrzenie nazw, wyjatki, geneza jezyka C++
Transkrypt
1=Przestrzenie nazw, wyjatki, geneza jezyka C++
Przestrzenie nazw Wyjątki Geneza języka C++ Przestrzenie nazw, wyjątki, geneza języka C++ Bogdan Kreczmer [email protected] Katedra Cybernetyki i Robotyki Politechnika Wrocławska Kurs: Programowanie obiektowe c Copyright2015 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Niniejsza prezentacja została wykonana przy użyciu systemu składu LATEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Zarys problemu Należy stworzyć zbiór klas modelujących pojęcie prostej w przestrzeni i na płaszczyźnie. Ich metody powinny umożliwić w łatwy sposób określenie, czy dany punkt w przestrzeni lub na płaszczyźnie należy do danej prostej czy też nie. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Te same nazwy, różne definicje prosta-plaszczyzna.hh prosta-przestrzen.hh class Wektor { double x, y; ... }; class Wektor { double x, y, z; ... }; class Prosta { Wektor WekNorm; double c; ... }; class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; #include ”prosta-plaszczyzna.hh” #include ”prosta-przestrzen.hh” int main( ) { Prosta Pr2; Prosta Pr3; ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Te same nazwy, różne definicje prosta-plaszczyzna.hh prosta-przestrzen.hh class Wektor { double x, y; ... }; class Wektor { double x, y, z; ... }; class Prosta { Wektor WekNorm; double c; ... }; class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; #include ”prosta-plaszczyzna.hh” #include ”prosta-przestrzen.hh” int main( ) { Prosta Pr2; Prosta Pr3; ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Zroznicownie nazw prosta2d.hh prosta3d.hh class Wektor2D { double x, y; ... }; class Wektor3D { double x, y, z; ... }; class Prosta2D { Wektor2D WekNorm; double c; ... }; class Prosta3D { Wektor3D WekOsiowy; Wektor3D PnkProstej; ... }; #include ”prosta2d.hh” #include ”prosta3d.hh” int main( ) { Prosta2D Pr2; Prosta3D Pr3; ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Zroznicownie nazw w stylu C d2 prosta.hh d3 prosta.hh class D2 Wektor { double x, y; ... }; class D3 Wektor { double x, y, z; ... }; class D2 Prosta { D2 Wektor WekNorm; double c; ... }; class D3 Prosta { D3 Wektor WekOsiowy; D3 Wektor PnkProstej; ... }; #include ”d2 prosta.hh” #include ”d3 prosta.hh” int main( ) { D2 Prosta Pr2; D3 Prosta Pr3; ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Przestrzenie nazw d2 prosta.hh d3 prosta.hh namespace D2 { class Wektor { double x, y; ... }; namespace D3 { class Wektor { double x, y, z; ... }; class Prosta { Wektor WekNorm; double c; ... }; } class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; } #include ”d2 prosta.hh” #include ”d3 prosta.hh” int main( ) { D2::Prosta Pr2; D3::Prosta Pr3; ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Blok przestrzeni nazw int ZmGlobalna; namespace D3 { class Wektor { double x, y, z; ... }; class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; } int main( ) { ZmGlobalna = 4; D3::Wektor Wk; D3::Prosta Pr; } Programowanie obiektowe W danej jednostce translacyjnej można stworzyć jednolity blok grupujący wszystkie definicje w wybranej przewstrzeni nazw. Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Blok przestrzeni nazw int ZmGlobalna; namespace D3 { class Wektor { double x, y, z; ... }; } namespace D3 { class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; } int main( ) { ZmGlobalna = 4; D3::Wektor Wk; D3::Prosta Pr; } Programowanie obiektowe Tę samą przestrzeń nazw można jednak rozbić na dowolną liczbę bloków. Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Ta sama przestrzeń nazw w różnych modułach d3 wektor.hh d3 prosta.hh ... #include “d3 wektor.hh” ... namespace D3 { class Wektor { double x, y, z; ... }; } ... namespace D3 { class Prosta { Wektor WekOsiowy; Wektor PnkProstej; ... }; } ... #include ”d3 wektor.hh” #include ”d3 prosta.hh” int main( ) { D3::Wektor D3::Prosta ... } Wk; Pr; Programowanie obiektowe Ta sama przestrzeń nazw może być rozbita na zbiór różnych jednostek translacyjnych (np. 3d wektor.cpp i 3d prosta.cpp) z własnymi plikami nagłówkowymi (np. 3d wektor.hh i 3d prosta.hh) zawierającymi definicje klas i zapowiedzi definicji metod. Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Co dają przestrzenie nazw Definiowanie przestrzeni nazw pozwala rozwiązać konflikty nazw. Tym samym daje znacznie większą swobodę programiście. Definicja przestrzeni nazw może być „kontynuowana” w kilku jednostek translacyjnych. Jedną z ważniejszych konsekwencji wykorzystywania przestrzeni nazw jest możliwość tworzenia modułów w sensie logicznym, a nie tak jak to ma miejsce, np. w języku C tylko w sensie stricte fizycznym. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Co dają przestrzenie nazw Definiowanie przestrzeni nazw pozwala rozwiązać konflikty nazw. Tym samym daje znacznie większą swobodę programiście. Definicja przestrzeni nazw może być „kontynuowana” w kilku jednostek translacyjnych. Jedną z ważniejszych konsekwencji wykorzystywania przestrzeni nazw jest możliwość tworzenia modułów w sensie logicznym, a nie tak jak to ma miejsce, np. w języku C tylko w sensie stricte fizycznym. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Co dają przestrzenie nazw Definiowanie przestrzeni nazw pozwala rozwiązać konflikty nazw. Tym samym daje znacznie większą swobodę programiście. Definicja przestrzeni nazw może być „kontynuowana” w kilku jednostek translacyjnych. Jedną z ważniejszych konsekwencji wykorzystywania przestrzeni nazw jest możliwość tworzenia modułów w sensie logicznym, a nie tak jak to ma miejsce, np. w języku C tylko w sensie stricte fizycznym. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dostęp do przesłoniętych zmiennych globalnych int Zm = 7; void Funkcja( ) { int Zm = 55; ::Zm = Zm; } int main( ) { cout << ”Zm. Globalna: ” Funkcja( ); cout << ”Zm. Globalna: ” } << Zm << endl; << Zm << endl; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dostęp do przesłoniętych zmiennych globalnych int Zm = 7; void Funkcja( ) { int Zm = 55; ::Zm = Zm; } int main( ) { cout << ”Zm. Globalna: ” Funkcja( ); cout << ”Zm. Globalna: ” } Wynik działania: Zm. Globalna: 7 Zm. Globalna: 55 << Zm << endl; << Zm << endl; W nienazwanej przestrzeni nazw znajdują się wszystkie globalnie definiowane zmiennych, typy oraz funkcje. Zmienne te można zawsze “odsłonić” stosując nazwę kwalifikowaną. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dostęp do przesłoniętych zmiennych globalnych int Zm = 7; void Funkcja( int Zm ) { ::Zm = Zm; } int main( ) { cout << ”Zm. Globalna: ” Funkcja( 10 ); cout << ”Zm. Globalna: ” } Wynik działania: Zm. Globalna: 7 Zm. Globalna: 10 << Zm << endl; << Zm << endl; W nienazwanej przestrzeni nazw znajdują się wszystkie globalnie definiowane zmiennych, typy oraz funkcje. Zmienne te można zawsze “odsłonić” stosując nazwę kwalifikowaną. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dostęp do przesłoniętych typów enum Symbole { a, b, c}; void Funkcja LokalnyTyp( Symbole Param ) { enum Symbole { x, y, z }; Symbole } ::Symbole ::Symbole int main( ) { Symbole } Zm1 = x; Zm2 = Param; Zm3 = ::a; Wynik działania: Zm. Globalna: 7 Zm. Globalna: 10 x = a; Funkcja LokalnyTyp( x ); W nienazwanej przestrzeni nazw znajdują się wszystkie globalnie definiowane zmiennych, typy oraz funkcje. Zmienne te można zawsze “odsłonić” stosując nazwę kwalifikowaną. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Zagnieżdżanie przestrzeni nazw int ZmGlobalna; namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } } int main( ) { ZmGlobalna = 4; D3::Wektor D3::Bryly::Szescian } Przestrzenie nazw mogą być zagnieżdżane. Wk; Sz; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dyrektywa using namespace int ZmGlobalna; namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } } using namespace D3; int main( ) { ZmGlobalna = 4; Wektor Wk; Bryly::Szescian Sz; } Programowanie obiektowe Użycie dyrektyw using namespace powoduje przeniesienie wszystkich nazw z danej podrzestrzeni, do której się ona odnosi, do przestrzeni nazw, w której jest zastosowana. W przedstawionym przykładzie nazwy z podprzestrzeni D3 zostały przeniesione do przestrzeni nienazwanej związanej z tradycyjnymi zmiennymi globalnymi. Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Użycie dyrektywy using namespace Dyrektywy using namespace nie należy używać w plikach nagłówkowych. Jej użycie tam jest przejawem bardzo złego stylu programowania. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dyrektywa using namespace int ZmGlobalna; namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } } using namespace D3::Bryly; int main( ) { ZmGlobalna = 4; D3::Wektor Wk; Szescian Sz; } Programowanie obiektowe Dyrektywę using namespace możemy stosować selektywnie do wybranych podprzestrzeni. W tym przykładzie została ona zastosowana do podprzestrzeni D3::Bryly. Do pozostałych elementów przestrzeni nazw D3 musimy odwoływać się poprzez pełną nazwę kwalifikowaną. Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dyrektywa using namespace namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } Szescian SzesWzorcowy; using namespace Bryly; Szescian DrugiSzes; } Dyrektywę using namespace możemy stosować również w podprzestrzeniach. Jej działanie ograniczone jest tylko do danej podprzestrzeni. W tym przykładzie dyrektywa using namespace powoduje przeniesienie wszystkich nazw z podprzestrzeni Bryla do przestrzeni nazw D3. int main( ) { D3::DrugiSzes = D3::SzesWzorcowy; } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dyrektywa using namespace namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } Szescian Bryly::Szescian SzesWzorcowy; DrugiSzes; } Bez tej dyrektywy nie stracimy podprzestrzeni Bryly i niezbędne jest wówczas odwoływanie się do jej poszczególnych elementów poprzez nazwy kwalifikowane. int main( ) { D3::DrugiSzes = D3::Bryly::SzesWzorcowy; } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Deklaracja using namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } Szescian SzesWzorcowy; Elementy danej podprzestrzeni nazw możemy przenosić selektywnie stosując deklarację using. Bryly::Szescian DrugiSzes; } using D3::Bryly::SzesWzorcowy; int main( ) { D3::DrugiSzes = SzesWzorcowy; } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Dyrektywa using namespace – ograniczanie zakresu namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } Szescian Bryly::Szescian SzesWzorcowy; DrugiSzes; } int main( ) { { using namespace D3; } Ograniczenie użycia dyrektywy using namespace możemy zrealiwać poprzez jej wykorzystanie w bloku ciała funkcji. Ogranicza on wówczas ważność stosowania tej deklaracji do tego bloku. DrugiSzes = Bryly::SzesWzorcowy; } D3::DrugiSzes = D3::Bryly::SzesWzorcowy; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Deklaracja using – ograniczanie zakresu namespace D3 { class Wektor { ... }; namespace Bryly { class Szescian { ... }; } Szescian Bryly::Szescian SzesWzorcowy; DrugiSzes; } Analogicznie można ograniczyć zakres ważności deklaracji using. int main( ) { { using D3::Bryly::SzescWzorcowy; } D3::DrugiSzes = SzesWzorcowy; } D3::DrugiSzes = D3::Bryly::SzesWzorcowy; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw Użycie deklaacji using W plikach nagłówkowych nie powinno używać się zarówno dyrektywy using namespace jak też deklaracji using. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Tradycyjny sposób obsługi błędów int Funkcja1() { ... if (Gdy cos jest zle) { errno = KOD BLEDU; return -1; } ... return 0; } ... int Funkcja() { int err; if (Funkcja1() < 0) { /∗ Obsługa błędu ∗/ ... if (Jezeli nie mozemy sobie poradzic) return -1; ... } if ((err = Funkcja2()) < 0) { /∗ Obsługa błędu ∗/ ... return 0; } Programowanie obiektowe ... } Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Czym jest obsługa wyjątków Wyjątki w C++ są sposobem na oddzielenie wykrywania błędów od ich obsługi. Mechanizm obsługi wyjątków jest nielokalną strukturą sterującą, która korzysta ze zwijania stosu. Zwijaniem stosu nazywamy proces przeszukiwania stosu w celu znalezienia procedury obsługi wyjątku. Mechanizmy obsługi wyjątków służą do sygnalizowania i obsługi zdarzeń wyjątkowych. Jednak to programista musi zdecydować co to znaczy wyjątkowy w danym programie. Wyjątki często w sposób naturalny tworzą rodziny. Oznacza to, że dziedziczenie może być użyteczne w strukturalizacji wyjątków i ich obsłudze. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Obsługa wyjątków – trochę tradycyjnie int Funkcja1( ) { ... if (Gdy cos jest zle) throw KOD BLEDU; // . . . . . . . . Tutaj zgłaszamy wyjątek ... } ... int Funkcja( ) { try { // . . . . . . . . . . . . . . . . . . . . W tej sekcji zakładamy możliwość zgłoszeń wyjątki ); .Funkcja1( .. } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . catch (int err) { // . . Tutaj rozpoczyna się przechwytywanie i obsługa wyjątków switch (err) { case KOD BLEDU: ... if (Jezeli nie mozemy sobie poradzic) throw KOD BLEDU; ... break ; ... } } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ ←− Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Przepływ sterowania – przypadek braku zgłoszenia wyjątku int Funkcja(int arg) { try { // ... ↓ cout << ”Tu coś się dzieje.” << endl; ↓ ... ↓ } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ←− catch (int const ∗wskKomunikat) { ... } catch (int Komunikat) { ... } catch ( . . . ) { ... } // −→ ... // Dalsza część kodu ↓ ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Przepływ sterowania – przypadek zgłoszenia wyjątku int Funkcja(int arg) { try { // ... ↓ throw 10; ↓ ... ↓ } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ←− catch (int const ∗wskKomunikat) { ... } −→ catch (int Komunikat) { ↓ cout << ”Obsługa zgłoszenia.” << endl; ←− ↓ } catch ( . . . ) { ... } // ... // Dalsza część kodu −→ ... ↓ } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Zgłoszenia wyjątku – wcześniejszy powrót z funkcji int Funkcja(int arg) { try { // ... ↓ throw 10; ↓ ... ↓ } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ←− catch (int const ∗wskKomunikat) { ... } −→ catch (int Komunikat) { ←− ↓ return 2; } catch ( . . . ) { ... } // ... // Dalsza część kodu ... −→ } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Funkcja w sekcji try [Gdy arg == 0] ↓ int Funkcja(int arg) // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . try { ... ↓ if ( arg == 0 ) throw 10; ←− ... // Ta część kodu jest osiągalna warunkowo return 0; } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . catch (int const ∗wskKomunikat) { ... return 0; } −→ ↓ catch (int Komunikat) { ... return -2; ←− ↓ } Sekcje catch muszą zwracać wartość catch ( . . . ) { tego samego typu co funkcja. ... return 0; } // Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Problem kopiowania zgłaszanej wartości class Blad { Blad( Blad const & ) { } Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) { nr bledu = nr; }; }; void Funkcja(int arg) { try { ... throw Blad(3); ... } catch ( Blad &Bl ) { cout <<”Nr Bledu: ” } ... } << Bl. nr bledu << endl; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Problem kopiowania zgłaszanej wartości class Blad { Blad( Blad const & ) { } Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) { nr bledu = nr; }; }; void Funkcja(int arg) { try { ... P throw Blad(3); PP ... } catch ( Blad &Bl ) { cout <<”Nr Bledu: ” } ... } Zgłoszenie wyjątku powoduje zawsze przekopiowanie parametru polecenia throw. << Bl. nr bledu << endl; Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Ominięcie problemu kopiowania obiektu class Blad { Blad( Blad const & ) { } Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) { nr bledu = nr; }; }; void Funkcja(int arg) { try { ... W tym przypadku kopiowany jest jedynie throw new Blad(3); wskaźnik. ... } catch ( const Blad∗ wB ) { cout <<”Nr Bledu: ” << B-> nr bledu << endl; delete wB; } ... } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Zwalnianie zasobów void Funkcja(int arg) { FILE ∗wPolecenie = popen(”last -n 100”,”r”); try { ... ... } catch ( . . . ) { pclose(wProc); throw ; } pclose(wProc); W przypadku zasobów, które nie mają charakteru lokalnego (np. dynamicznie przydzielana pamięć), należy pamiętać, // Powt”orne zg”loszenie wyj”atkuaby zwalniać je w trakcie obsługi zgłoszonego wyjątku. } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Wyjątki inaczej #include <iostream> #include <vector> #include <stdexcept> //Tu znajduje się definicje wyjątku std::out of range int PrzegladajTablice( const std::vector<int> &Tablica ) { try { for (int ind = 0; ; ++ind) { if (Tablica.at(ind) / 2) std::cout << Tablica.at(++ind) << std::endl; } } catch (std::out of range) { return 0; } return 0; } Zgłoszenie wyjątku może być sposobem na przerwanie pętli w sytuacji, gdy bezpo”srednie sprawdzanie warunku jest kłopotliwe w zapisie i sprawdzenie to musiałoby występować w wielu miejscach. Zgłoszenie wyjątku może być pomocne również w przypadkach konstrukcji niestrukturalnych, w których wykorzystywano instrukcję goto. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Konwersje typów w obsłudze wyjątków class Wektor2f { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . public : ... Wektor2f( ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . class LZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . public : ... LZespolona( ); LZespolona(const Wektor2f &W); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Przy obsłudze wyjątków domyślne int main() konwersje nie są realizowane. { throw Wektor2f( ); } try { catch (LZespolona Z) { // Czy wyjątek zgłoszony powyżej zostanie tu obsłużony? ... } } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Wyjątki standardowe Standardowe wyjątki zgłaszane przez Nazwa Zgłaszane przez bad alloc new bad cast dynamic cast bad typeid typeid bad exception specyfikacja wyjątku język Nagłówek <new> <typeinfo> <typeinfo> <exception> Standardowe wyjątki zgłaszane przez bibliotekę Nazwa Zgłaszane przez Nagłówek out of range at() <stdexcept> bitset< >::operator []() <stdexcept> invalid argument konstruktor bitset <stdexcept> overflow error bitset< >::to ulong() <stdexcept> ios base::failure ios base::clear() <ios> Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Ustawianie handlera dla obsługi wyjątków unexpected handler set unexpected(unexpected handler fun) throw(); Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Podstawowe idee Jak to działa Wyjątki standardowe Wyjątki dla operacji wejścia/wyjścia int main ( ) { ifstream Plik; int Liczba; Plik.exceptions( ifstream ::failbit | ifstream ::badbit ); try { Plik.open(”zbior liczba.txt”); while (!Plik.eof()) Plik >> Liczba; } catch (ifstream ::failure) { cout << ”Wyjątek operacji otwarcia lub czytania”; } return 0; } Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Bjarne Stroustrup Bjarne Stroustrup — (ur. 30.12.1950 – Århus, Dania) jest twórcą języka C++ i nadal aktywnie uczestniczy w jego dalszym rozwoju. Inspiracją do stworzenia tego typu języka były problemy i spostrzeżenia, których dokonał w trakcie swoich prac nad doktoratem w Uniwersytecie Cambridge. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Tło akcji Bezpośrednim przyczynkiem do powstania koncepcji języka C++ były prace Stroustrupa w Cambridge nad doktoratem. W trakcie swoich prac miał zbadać różne organizacje systemowego oprogramowania w systemach rozproszonych. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Zdarzenia Udana (w sensie konstrukcji aplikacji) realizacja symulatora systemu rozproszenego z wykorzystaniem Simuli. Pojęcie klasy w Simuli było bardzo pomocne na etapie projektu i implmentacji. Poważne problemy związne z wydajnością programów napisanego w Simuli zmusza do poszukiwania bardziej wydajnego narzędzia. Traumatycznie bolesne doświadczenia związane z koniecznością implementacji symulatora w oparciu o język BCPL. Osiągnięta została bardzo dobra wydajność kosztem wielu problemów przy realizacji implementacji. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Zdarzenia Udana (w sensie konstrukcji aplikacji) realizacja symulatora systemu rozproszenego z wykorzystaniem Simuli. Pojęcie klasy w Simuli było bardzo pomocne na etapie projektu i implmentacji. Poważne problemy związne z wydajnością programów napisanego w Simuli zmusza do poszukiwania bardziej wydajnego narzędzia. Traumatycznie bolesne doświadczenia związane z koniecznością implementacji symulatora w oparciu o język BCPL. Osiągnięta została bardzo dobra wydajność kosztem wielu problemów przy realizacji implementacji. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Zdarzenia Udana (w sensie konstrukcji aplikacji) realizacja symulatora systemu rozproszenego z wykorzystaniem Simuli. Pojęcie klasy w Simuli było bardzo pomocne na etapie projektu i implmentacji. Poważne problemy związne z wydajnością programów napisanego w Simuli zmusza do poszukiwania bardziej wydajnego narzędzia. Traumatycznie bolesne doświadczenia związane z koniecznością implementacji symulatora w oparciu o język BCPL. Osiągnięta została bardzo dobra wydajność kosztem wielu problemów przy realizacji implementacji. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Zdarzenia Udana (w sensie konstrukcji aplikacji) realizacja symulatora systemu rozproszenego z wykorzystaniem Simuli. Pojęcie klasy w Simuli było bardzo pomocne na etapie projektu i implmentacji. Poważne problemy związne z wydajnością programów napisanego w Simuli zmusza do poszukiwania bardziej wydajnego narzędzia. Traumatycznie bolesne doświadczenia związane z koniecznością implementacji symulatora w oparciu o język BCPL. Osiągnięta została bardzo dobra wydajność kosztem wielu problemów przy realizacji implementacji. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Epilog Po zakończeniu prac nad doktoratem Stroustrup postanawia stworzyć język programowania, który łączyłby koncepcje klas z Simuli oraz elastyczność tego języka z efektywnością kodu języka BCPL. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Kompilator Simuli dobrze wychwytywał błędy typu. Błędy te przeważnie były albo wynikiem “głupich” pomyłek w trakcie programowania albo też potknięć koncepcyjnych. Ten drugi rodzaj błędów ma wręcz fundamentalne znaczenie dla procesu projektowania i pisania programownia (autor kursu pozwolił sobie tę uwagę wzmocnić). Żaden inny prosty system sprawdzania ścisłej zgodności typów nie dostarczył tego rodzaju wsparcia. Przykładem może być system Pascala. Sprawiał on więcej kłopotów niż pozwalał ich uniknąć. Zmuszał do modyfikacji projektu, aby dostosować go do warunków narzuconych przez implementację (co nie zmienia faktu, że jest to bardzo dobry język dla początkowego kursu nauki informatyki – uwaga autora kursu). Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Kompilator Simuli dobrze wychwytywał błędy typu. Błędy te przeważnie były albo wynikiem “głupich” pomyłek w trakcie programowania albo też potknięć koncepcyjnych. Ten drugi rodzaj błędów ma wręcz fundamentalne znaczenie dla procesu projektowania i pisania programownia (autor kursu pozwolił sobie tę uwagę wzmocnić). Żaden inny prosty system sprawdzania ścisłej zgodności typów nie dostarczył tego rodzaju wsparcia. Przykładem może być system Pascala. Sprawiał on więcej kłopotów niż pozwalał ich uniknąć. Zmuszał do modyfikacji projektu, aby dostosować go do warunków narzuconych przez implementację (co nie zmienia faktu, że jest to bardzo dobry język dla początkowego kursu nauki informatyki – uwaga autora kursu). Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Kompilator Simuli dobrze wychwytywał błędy typu. Błędy te przeważnie były albo wynikiem “głupich” pomyłek w trakcie programowania albo też potknięć koncepcyjnych. Ten drugi rodzaj błędów ma wręcz fundamentalne znaczenie dla procesu projektowania i pisania programownia (autor kursu pozwolił sobie tę uwagę wzmocnić). Żaden inny prosty system sprawdzania ścisłej zgodności typów nie dostarczył tego rodzaju wsparcia. Przykładem może być system Pascala. Sprawiał on więcej kłopotów niż pozwalał ich uniknąć. Zmuszał do modyfikacji projektu, aby dostosować go do warunków narzuconych przez implementację (co nie zmienia faktu, że jest to bardzo dobry język dla początkowego kursu nauki informatyki – uwaga autora kursu). Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Kompilator Simuli dobrze wychwytywał błędy typu. Błędy te przeważnie były albo wynikiem “głupich” pomyłek w trakcie programowania albo też potknięć koncepcyjnych. Ten drugi rodzaj błędów ma wręcz fundamentalne znaczenie dla procesu projektowania i pisania programownia (autor kursu pozwolił sobie tę uwagę wzmocnić). Żaden inny prosty system sprawdzania ścisłej zgodności typów nie dostarczył tego rodzaju wsparcia. Przykładem może być system Pascala. Sprawiał on więcej kłopotów niż pozwalał ich uniknąć. Zmuszał do modyfikacji projektu, aby dostosować go do warunków narzuconych przez implementację (co nie zmienia faktu, że jest to bardzo dobry język dla początkowego kursu nauki informatyki – uwaga autora kursu). Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Pojęcie klasy było zasadniczym elementem różniącym „sztywny” Pascal od „elastycznej” Simuli. Wyczerpujące sprawdzanie zgodności typów w Simuli sprawiało, że liczba problemów i błędów nie wzrastała szybciej niż liniowo wraz ze wzrostem programu. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Niektóre spostrzeżenia Pojęcie klasy było zasadniczym elementem różniącym „sztywny” Pascal od „elastycznej” Simuli. Wyczerpujące sprawdzanie zgodności typów w Simuli sprawiało, że liczba problemów i błędów nie wzrastała szybciej niż liniowo wraz ze wzrostem programu. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Plan prezentacji 1 Przestrzenie nazw Idea przestrzeni nazw Podstawowe cechy przestrzeni nazw 2 Wyjątki Podstawowe idee Jak to działa Wyjątki standardowe 3 Geneza języka C++ Historia narodzin Motywacja Chronologia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1979 – (Maj) Początek prac na C z Klasami. (Październik) Oddanie do użytku pierwszej implementacji tego języka. 1983 – (Sierpień) Oddanie do użytku pierwszej implementacji języka C++. (Grudzień) Powstanie nazwy C++. 1985 – (Luty) Powstanie pierwszej wersji języka C++ (wersja E) do użytku zewnętrznego. (Październik) Ukazanie się pierwszego wydania książki “Język C++”. 1987 – (Grudzień) Ukazanie się kompilatora GNU C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1979 – (Maj) Początek prac na C z Klasami. (Październik) Oddanie do użytku pierwszej implementacji tego języka. 1983 – (Sierpień) Oddanie do użytku pierwszej implementacji języka C++. (Grudzień) Powstanie nazwy C++. 1985 – (Luty) Powstanie pierwszej wersji języka C++ (wersja E) do użytku zewnętrznego. (Październik) Ukazanie się pierwszego wydania książki “Język C++”. 1987 – (Grudzień) Ukazanie się kompilatora GNU C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1979 – (Maj) Początek prac na C z Klasami. (Październik) Oddanie do użytku pierwszej implementacji tego języka. 1983 – (Sierpień) Oddanie do użytku pierwszej implementacji języka C++. (Grudzień) Powstanie nazwy C++. 1985 – (Luty) Powstanie pierwszej wersji języka C++ (wersja E) do użytku zewnętrznego. (Październik) Ukazanie się pierwszego wydania książki “Język C++”. 1987 – (Grudzień) Ukazanie się kompilatora GNU C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1979 – (Maj) Początek prac na C z Klasami. (Październik) Oddanie do użytku pierwszej implementacji tego języka. 1983 – (Sierpień) Oddanie do użytku pierwszej implementacji języka C++. (Grudzień) Powstanie nazwy C++. 1985 – (Luty) Powstanie pierwszej wersji języka C++ (wersja E) do użytku zewnętrznego. (Październik) Ukazanie się pierwszego wydania książki “Język C++”. 1987 – (Grudzień) Ukazanie się kompilatora GNU C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1989 – (Grudzień) Powstanie zespołu ANSI X3J16 do spraw normalizacji języka C++. 1990 – (Maj) Powstawnie w firmie Borland pierwszej implementacji języka C++. Lipiec: Przyjęcie koncepcji szablonów. Listopad: Przyjęcie koncepcji wyjątków. 1990 – Wydanie książki: Ellis Margaret A., Stroustrup B. „The Annotated C++ Reference Manual ”, Reading, MA, Addison-Wesley 1990. Stał się on nieformalnym standardem języka, określanego jako C++ ARM. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1989 – (Grudzień) Powstanie zespołu ANSI X3J16 do spraw normalizacji języka C++. 1990 – (Maj) Powstawnie w firmie Borland pierwszej implementacji języka C++. Lipiec: Przyjęcie koncepcji szablonów. Listopad: Przyjęcie koncepcji wyjątków. 1990 – Wydanie książki: Ellis Margaret A., Stroustrup B. „The Annotated C++ Reference Manual ”, Reading, MA, Addison-Wesley 1990. Stał się on nieformalnym standardem języka, określanego jako C++ ARM. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1989 – (Grudzień) Powstanie zespołu ANSI X3J16 do spraw normalizacji języka C++. 1990 – (Maj) Powstawnie w firmie Borland pierwszej implementacji języka C++. Lipiec: Przyjęcie koncepcji szablonów. Listopad: Przyjęcie koncepcji wyjątków. 1990 – Wydanie książki: Ellis Margaret A., Stroustrup B. „The Annotated C++ Reference Manual ”, Reading, MA, Addison-Wesley 1990. Stał się on nieformalnym standardem języka, określanego jako C++ ARM. Ellis Margaret została zatrudniona przez AT&T specjalnie do opisu języka C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1992 – (Luty) Powstanie pierwszej implementacji języka C++ (zawierającej szablony i wyjątki) w firmie DEC. (Marzec) Powstanie pierwszej implementacji języka C++ w firmie Microsoft. (Maj) Powstanie pierwszej implementacji języka C++ w firmie IBM. 1993 – Marzec: Przyjęcie koncepcji identyfikowania typu podczas wykonywania programu. Lipiec: Przyjęcie koncepcji przestrzeni nazw. 1998 – Przyjęcie standardu ANSI/ISO języka C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1992 – (Luty) Powstanie pierwszej implementacji języka C++ (zawierającej szablony i wyjątki) w firmie DEC. (Marzec) Powstanie pierwszej implementacji języka C++ w firmie Microsoft. (Maj) Powstanie pierwszej implementacji języka C++ w firmie IBM. 1993 – Marzec: Przyjęcie koncepcji identyfikowania typu podczas wykonywania programu. Lipiec: Przyjęcie koncepcji przestrzeni nazw. 1998 – Przyjęcie standardu ANSI/ISO języka C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Ważniejsze daty 1992 – (Luty) Powstanie pierwszej implementacji języka C++ (zawierającej szablony i wyjątki) w firmie DEC. (Marzec) Powstanie pierwszej implementacji języka C++ w firmie Microsoft. (Maj) Powstanie pierwszej implementacji języka C++ w firmie IBM. 1993 – Marzec: Przyjęcie koncepcji identyfikowania typu podczas wykonywania programu. Lipiec: Przyjęcie koncepcji przestrzeni nazw. 1998 – Przyjęcie standardu ANSI/ISO języka C++. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Genealogia Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Chronologia wprowadzanych standardów C++98 1998 – (ISO/IEC 14882:2011) Przyjęcie standardu ANSI/ISO języka C++. 2003 – (ISO/IEC 14882:2003) Korekcja wcześniejszego standardu. 2007 – (ISO/IEC TR 19768:2007) Oparty na technicznym raporcie „Library Technical Report 1 ”, który wprowadzał rozszerzenia do biblioteki standardowej. 2011 – (ISO/IEC 14882:2011) 11 sierpnia 2011: Nowy standard języka C++ wcześniej roboczo określany jako C++0x. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Chronologia wprowadzanych standardów C++98 1998 – (ISO/IEC 14882:2011) Przyjęcie standardu ANSI/ISO języka C++. C++03 2003 – (ISO/IEC 14882:2003) Korekcja wcześniejszego standardu. 2007 – (ISO/IEC TR 19768:2007) Oparty na technicznym raporcie „Library Technical Report 1 ”, który wprowadzał rozszerzenia do biblioteki standardowej. 2011 – (ISO/IEC 14882:2011) 11 sierpnia 2011: Nowy standard języka C++ wcześniej roboczo określany jako C++0x. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Chronologia wprowadzanych standardów C++98 1998 – (ISO/IEC 14882:2011) Przyjęcie standardu ANSI/ISO języka C++. C++03 2003 – (ISO/IEC 14882:2003) Korekcja wcześniejszego standardu. C++TR1 2007 – (ISO/IEC TR 19768:2007) Oparty na technicznym raporcie „Library Technical Report 1 ”, który wprowadzał rozszerzenia do biblioteki standardowej. 2011 – (ISO/IEC 14882:2011) 11 sierpnia 2011: Nowy standard języka C++ wcześniej roboczo określany jako C++0x. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Chronologia wprowadzanych standardów C++98 1998 – (ISO/IEC 14882:2011) Przyjęcie standardu ANSI/ISO języka C++. C++03 2003 – (ISO/IEC 14882:2003) Korekcja wcześniejszego standardu. C++TR1 2007 – (ISO/IEC TR 19768:2007) Oparty na technicznym raporcie „Library Technical Report 1 ”, który wprowadzał rozszerzenia do biblioteki standardowej. C++11 2011 – (ISO/IEC 14882:2011) 11 sierpnia 2011: Nowy standard języka C++ wcześniej roboczo określany jako C++0x. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dalszy rozwój C++14 2014 – usunięcie błędów i uzupełnienie wcześniejszego standardu. C++14 pełni rolę korekty do C++11. W niewielkim tylko stopniu rozszerzy koncepcje standardu C++11. C++17 2017 – Będzie miał charakter zasadniczego rozszerzenia w stosunku do standardu C++11. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dalszy rozwój C++14 2014 – usunięcie błędów i uzupełnienie wcześniejszego standardu. C++14 pełni rolę korekty do C++11. W niewielkim tylko stopniu rozszerzy koncepcje standardu C++11. C++17 2017 – Będzie miał charakter zasadniczego rozszerzenia w stosunku do standardu C++11. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dalszy rozwój C++14 2014 – usunięcie błędów i uzupełnienie wcześniejszego standardu. C++14 pełni rolę korekty do C++11. W niewielkim tylko stopniu rozszerzy koncepcje standardu C++11. C++17 2017 – Będzie miał charakter zasadniczego rozszerzenia w stosunku do standardu C++11. http://isocpp.org/std/status Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Wzajemne powiązania Kilka faktów: Słowo kluczowe class pochodzi z Simuli (podobnie jak notacja wskaźnika this). Zapis funkcja(void) w ANSI C pochodzi z języka C z Klasami. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Wzajemne powiązania Kilka faktów: Słowo kluczowe class pochodzi z Simuli (podobnie jak notacja wskaźnika this). Zapis funkcja(void) w ANSI C pochodzi z języka C z Klasami. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Wzajemne powiązania Kilka faktów: Słowo kluczowe class pochodzi z Simuli (podobnie jak notacja wskaźnika this). Zapis funkcja(void) w ANSI C pochodzi z języka C z Klasami. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dlaczego C C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dlaczego C C jest językiem elastycznym – nie ma wewnętrznych ograniczeń wykluczających możliwość napisania jakiegoś rodzaju programu, tzn. można korzystać w nim z większości technik programowania. C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dlaczego C C jest językiem elastycznym C jest językiem wydajnym – semantyka języka znajduje się na “niskim poziomie”, tzn. podstawowe pojęcia języka odzwierciedlają podstawowe pojęcia tradycyjnego komputera. C jest językiem szeroko dostępnym C jest językiem przenośnym Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dlaczego C C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym – implementacje tego języka istnieją zarówno dla mikrokomputerów jak też dla dużych superkomputerów. C jest językiem przenośnym Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Historia narodzin Motywacja Chronologia Dlaczego C C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym – programy napisane w C zazwyczaj nie można automatycznie przenosić z jednego systemu operacyjnego do drugiego. Jednak przenośność z uwzględnieniem odpowiednich uwarunkowań jest możliwa. Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++ Przestrzenie nazw Wyjątki Geneza języka C++ Koniec prezentacji Dziękuję za uwagę Programowanie obiektowe Przestrzenie nazw, wyjątki, geneza języka C++