Geneza C++, hermetyzacja struktur danych

Podobne dokumenty
Style programowania - krótki przeglad

Geneza powstania języka C++

Style programowania, geneza języka C++

Geneza C++, manipulatory

Geneza powstania języka C++

Style programowania - krótki przeglad

Szablony funkcji i szablony klas

Hermetyzacja oraz pola i metody statyczne

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Przestrzenie nazw. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Wprowadzenie do szablonów klas

Podstawy Programowania Obiektowego

Bogdan Kreczmer. Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

Referencje do zmiennych i obiektów

Schemat konstrukcja pliku Makefile

Szablony funkcji i klas (templates)

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Programowanie obiektowe - 1.

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Wyjątki (exceptions)

Pola i metody statyczne

Qt sygnały i designer

Język programowania. Andrzej Bobyk

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Organizacja kursu, paradygmaty, ogólnie o C i C++

Modelowanie i Programowanie Obiektowe

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Praca z aplikacją designer

Wykład 9: Polimorfizm i klasy wirtualne

PARADYGMATY PROGRAMOWANIA Wykład 4

Wartości domyślne, przeciażenia funkcji

Wprowadzenie do UML, przykład użycia kolizja

Wartości domyślne, przeciażenia funkcji

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Wyliczanie wyrażenia obiekty tymczasowe

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

TEMAT : KLASY DZIEDZICZENIE

Historia modeli programowania

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Technologie obiektowe

Wykład 5: Klasy cz. 3

Wykład 8: klasy cz. 4

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska

Przesłanianie nazw, przestrzenie nazw

Operacje wejścia/wyjścia odsłona pierwsza

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Język C++ Różnice między C a C++

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Powłoki systemu operacyjnego i intepretery

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Materiały do zajęć VII

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Zasoby, pliki graficzne

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Rzutowanie i konwersje

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie 2. Język C++. Wykład 3.

Wartości domyślne, szablony funkcji i klas

Diagramy UML, przykład problemu kolizji

Dalmierze optyczne. Bogdan Kreczmer.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Wstęp do Programowania 2

Konstruktor kopiujacy

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Podstawy programowania. Wprowadzenie

Wykład 4: Klasy i Metody

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Szablony klas, zastosowanie szablonów w programach

Dziedziczenie jednobazowe, poliformizm

Czym są właściwości. Poprawne projektowanie klas

Wstęp do programowania obiektowego. Wykład 2

Zad. 5: Układ równań liniowych liczb zespolonych

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Szablon klasy std::vector

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe

Klasa, metody, rozwijanie w linii

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Zaawansowane programowanie w języku C++ Klasy w C++

Transkrypt:

Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2012 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ą.

Niniejsza prezentacja została wykonana przy użyciu systemu składu L A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net

1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Plan prezentacji 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Nacisk kładzie się na przetwarzanie, tzn. zbudowania algorytmu potrzebnego do wykonania wymaganych obliczeń. Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Uwypukla powiązanie danych z procedurami oraz ukrywa dane, które wykorzystywane są tylko w pewnych blokach obliczeniowych reprezentowanych przez moduły. Programowanie z abstrakcją danych Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Zakłada możliwość definiowania typów, które mają te same własności jak typy wbudowane. Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Tworzenie struktur pochodnych poprzez dziedziczenie z możliwością modyfikacji dzięki polimorfizmowi. Hermetyzacja wybranych struktur. Programowanie uogólnione

Ważniejsze style Programowanie proceduralne Programowanie modularne Programowanie z abstrakcją danych Programowanie uogólnione Umożliwia tworzenie parametryzowanych struktur i funkcji/procedur, dla których parametrami jest typ danych.

Plan prezentacji 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Programowanie z wykorzystaniem podprogramów

Programowanie z wykorzystaniem podprogramów Styl charakterystyczny dla przypadku wykorzystywania asemblera oraz wczesnej wersji Basic a.

Programowanie z wykorzystaniem podprogramów

Programowanie z wykorzystaniem podprogramów Wielość wzajemnych powiązań prowadzi do tworzenia się nieczytelnych konstrukcji programów.

Programowanie proceduralne

Programowanie proceduralne Zmienne lokalne poprawiają wykorzystanie pamięci oraz czytelność programu.

Programowanie proceduralne Paradygmat programowania proceduralnego:

Programowanie proceduralne Paradygmat programowania proceduralnego: Zdecyduj jakie chcesz mieć procedury; stosuj najlepsze algorytmy jakie możesz znaleźć.

Programowanie proceduralne Paradygmat programowania proceduralnego: Zdecyduj jakie chcesz mieć procedury; stosuj najlepsze algorytmy jakie możesz znaleźć. Przykład języków programowania wspierających ten paradygmat: Pascal, C, Java, C++, Python, Perl itp.

Programowanie proceduralne Podstawowe wady czystego programowania proceduralnego. Brak możliwości wyróżnienia powiązań między strukturami danych, a procedurami operującymi na nich. Konieczność stosowania różnych nazw procedur nawet w przypadku, gdy wykonują te same operacje, a jedyną różnicą jest typ danych, na których wykonywana jest ta operacja. Umieszczanie wszystkich elementów w jednakowym obszarze zasięgu ważności definicji uniemożliwia hermetyzację wybranych partii programy. Nie pozwala to na łatwe rozdzielenia całego zadania na poszczególne podzadania.

Programowanie proceduralne Podstawowe wady czystego programowania proceduralnego. Brak możliwości wyróżnienia powiązań między strukturami danych, a procedurami operującymi na nich. Konieczność stosowania różnych nazw procedur nawet w przypadku, gdy wykonują te same operacje, a jedyną różnicą jest typ danych, na których wykonywana jest ta operacja. Umieszczanie wszystkich elementów w jednakowym obszarze zasięgu ważności definicji uniemożliwia hermetyzację wybranych partii programy. Nie pozwala to na łatwe rozdzielenia całego zadania na poszczególne podzadania.

Programowanie proceduralne Podstawowe wady czystego programowania proceduralnego. Brak możliwości wyróżnienia powiązań między strukturami danych, a procedurami operującymi na nich. Konieczność stosowania różnych nazw procedur nawet w przypadku, gdy wykonują te same operacje, a jedyną różnicą jest typ danych, na których wykonywana jest ta operacja. Umieszczanie wszystkich elementów w jednakowym obszarze zasięgu ważności definicji uniemożliwia hermetyzację wybranych partii programy. Nie pozwala to na łatwe rozdzielenia całego zadania na poszczególne podzadania.

Programowanie proceduralne Podstawowe wady czystego programowania proceduralnego. Brak możliwości wyróżnienia powiązań między strukturami danych, a procedurami operującymi na nich. Konieczność stosowania różnych nazw procedur nawet w przypadku, gdy wykonują te same operacje, a jedyną różnicą jest typ danych, na których wykonywana jest ta operacja. Umieszczanie wszystkich elementów w jednakowym obszarze zasięgu ważności definicji uniemożliwia hermetyzację wybranych partii programy. Nie pozwala to na łatwe rozdzielenia całego zadania na poszczególne podzadania.

Programowanie modularne

Programowanie modularne Modułem nazywamy zbiór powiązanych ze sobą procedur, struktur danych oraz zmiennych i wyodrębnionych w postaci osobnej konstrukcji językowej lub translacyjnej.

Programowanie modularne Modułem nazywamy zbiór powiązanych ze sobą procedur, struktur danych oraz zmiennych i wyodrębnionych w postaci osobnej konstrukcji językowej lub translacyjnej. To powiązanie pozwala skupić w jednym miejscu struktury danych oraz procedury i funkcje obsługujące te struktury.

Programowanie modularne

Programowanie modularne Ten typ programowania pozwala ukryć pomocnicze funkcje i struktury danych.

Programowanie modularne Ten typ programowania pozwala ukryć pomocnicze funkcje i struktury danych. Możliwe jest dość precyzyjne określenie co jest udostępniane na zewnątrz i z czego dany moduł korzysta. Pozwala to ukryć ewentualne późniejsze modyfikacje struktur wewnętrznych.

Programowanie modularne Paradygmat programowania modularnego:

Programowanie modularne Paradygmat programowania modularnego: Zdecyduj jakie chcesz mieć moduły; podziel program w taki sposób, aby ukryć dane w modułach.

Programowanie modularne Paradygmat programowania modularnego: Zdecyduj jakie chcesz mieć moduły; podziel program w taki sposób, aby ukryć dane w modułach. Przykład języków programowania wspierających ten paradygmat: Modula 2, Ada, C, Java, C++ itp.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Ukrywanie funkcji, struktur danych oraz zmiennych mających znacznie lokalne w danym module. Możliwość całkowitego ukrycia udostępnianych struktur danych. Na zewnątrz modułu widoczne są jedynie ich cechy i własności. Odwoływanie się do konkretnego egzemplarza tworzonej struktury danych realizowane jest poprzez deskryptory. Wadą tej techniki jest brak możliwości kontroli zgodności typów na etapie kompilacji.

Programowanie modularne najważniejsze cechy Możliwość odizolowania się od nazw funkcji i zmiennych modułu używanych w innych modułach. Możliwość precyzyjnego określenia co z danego modułu jest widoczne i udostępniane na zewnątrz, a co nie. Mechanizm ten pozwala również określić co dany moduł importuje z innych modułów. Łatwiejsza organizacja pracy zespołowej.

Programowanie modularne najważniejsze cechy Możliwość odizolowania się od nazw funkcji i zmiennych modułu używanych w innych modułach. Możliwość precyzyjnego określenia co z danego modułu jest widoczne i udostępniane na zewnątrz, a co nie. Mechanizm ten pozwala również określić co dany moduł importuje z innych modułów. Łatwiejsza organizacja pracy zespołowej.

Programowanie modularne najważniejsze cechy Możliwość odizolowania się od nazw funkcji i zmiennych modułu używanych w innych modułach. Możliwość precyzyjnego określenia co z danego modułu jest widoczne i udostępniane na zewnątrz, a co nie. Mechanizm ten pozwala również określić co dany moduł importuje z innych modułów. Łatwiejsza organizacja pracy zespołowej.

Programowanie modularne podsumowanie Programowanie modularne umożliwia centralizację wszystkich danych jednego typu pod kontrolą jednego modułu będącego zarządcą danego typu. Daje to jednak wciąż znacząco gorsze wsparcie niż dla typów wbudowanych.

Programowanie modularne podsumowanie Programowanie modularne umożliwia centralizację wszystkich danych jednego typu pod kontrolą jednego modułu będącego zarządcą danego typu. Daje to jednak wciąż znacząco gorsze wsparcie niż dla typów wbudowanych. Wady czystego programowania modularnego: brak możliwości stosowania operatorów, w przypadku stosowania deskryptorów brak możliwości ścisłej kontroli typów na poziomie kompilacji, brak możliwości określenia dopuszczalności domyślnych konwersji oraz ich zdefiniowania.

Programowanie modularne podsumowanie Programowanie modularne umożliwia centralizację wszystkich danych jednego typu pod kontrolą jednego modułu będącego zarządcą danego typu. Daje to jednak wciąż znacząco gorsze wsparcie niż dla typów wbudowanych. Wady czystego programowania modularnego: brak możliwości stosowania operatorów, w przypadku stosowania deskryptorów brak możliwości ścisłej kontroli typów na poziomie kompilacji, brak możliwości określenia dopuszczalności domyślnych konwersji oraz ich zdefiniowania.

Programowanie modularne podsumowanie Programowanie modularne umożliwia centralizację wszystkich danych jednego typu pod kontrolą jednego modułu będącego zarządcą danego typu. Daje to jednak wciąż znacząco gorsze wsparcie niż dla typów wbudowanych. Wady czystego programowania modularnego: brak możliwości stosowania operatorów, w przypadku stosowania deskryptorów brak możliwości ścisłej kontroli typów na poziomie kompilacji, brak możliwości określenia dopuszczalności domyślnych konwersji oraz ich zdefiniowania.

Programowanie modularne podsumowanie Programowanie modularne umożliwia centralizację wszystkich danych jednego typu pod kontrolą jednego modułu będącego zarządcą danego typu. Daje to jednak wciąż znacząco gorsze wsparcie niż dla typów wbudowanych. Wady czystego programowania modularnego: brak możliwości stosowania operatorów, w przypadku stosowania deskryptorów brak możliwości ścisłej kontroli typów na poziomie kompilacji, brak możliwości określenia dopuszczalności domyślnych konwersji oraz ich zdefiniowania.

Abstrakcja typów danych

Abstrakcja typów danych Podejście oparte na abstrakcji danych pozwala traktować na równi typy wbudowane i typy definiowane przez programistę. Pozwala również na bezpośrednie odwoływanie się do struktur danych i dokonywanych na nich operacji (w odróżnieniu od programowania modułowego).

Abstrakcja typów danych Podejście oparte na abstrakcji danych pozwala traktować na równi typy wbudowane i typy definiowane przez programistę. Pozwala również na bezpośrednie odwoływanie się do struktur danych i dokonywanych na nich operacji (w odróżnieniu od programowania modułowego).

Abstrakcja typów danych Paradygmat programowania z zastosowaniem abstrakcji danych:

Abstrakcja typów danych Paradygmat programowania z zastosowaniem abstrakcji danych: Zdecyduj jakie chcesz mieć typy; dla każdego typu dostarcz pełny zbiór operacji.

Abstrakcja typów danych Paradygmat programowania z zastosowaniem abstrakcji danych: Zdecyduj jakie chcesz mieć typy; dla każdego typu dostarcz pełny zbiór operacji. Przykład języków programowania wspierających ten paradygmat: Ada, Clu, C++ itp.

Abstrakcja typów danych zalety i wady Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które mogą być dobrze izolowane od reszty programu. Zawierają one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich.

Abstrakcja typów danych zalety i wady Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które mogą być dobrze izolowane od reszty programu. Zawierają one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich.

Abstrakcja typów danych zalety i wady Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które mogą być dobrze izolowane od reszty programu. Zawierają one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Podstawową wadą jest brak elastyczności.

Abstrakcja typów danych zalety i wady Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które mogą być dobrze izolowane od reszty programu. Zawierają one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Podstawową wadą jest brak elastyczności. Przykład: Konstruując typy MacierzWJ (transformacje wektorów wyrażonych we współrzędnych jednorodnych) oraz Macierz4x4 należy zdefiniować oddzielne struktury danych wraz z metodami i operacjami, choć MacierzWJ jest jedynie uszczegółowieniem typu Macierz4x4.

Abstrakcja typów danych zalety i wady Programowanie z wykorzystaniem abstrakcji danych pozwala na tworzenie struktur, które mogą być dobrze izolowane od reszty programu. Zawierają one zarówno odpowiednie pola danych, jak też zdefiniowane metody i operacje dokonywane na nich. Podstawową wadą jest brak elastyczności. Przykład: Konstruując typy MacierzWJ (transformacje wektorów wyrażonych we współrzędnych jednorodnych) oraz Macierz4x4 należy zdefiniować oddzielne struktury danych wraz z metodami i operacjami, choć MacierzWJ jest jedynie uszczegółowieniem typu Macierz4x4.

Podejście oparte na podejściu obiektowym umożliwia budowanie nowych typów danych na bazie wcześniej zdefiniowanych struktur (dziedziczenie).

Paradygmat programowania programowania obiektowego:

Paradygmat programowania programowania obiektowego: Zdecyduj jakie chcesz mieć klasy; dla każdej klasy dostarcz pełny zbiór operacji; korzystając z mechanizmu dziedziczenia, jawnie wskaż to, co jest wspólne.

Paradygmat programowania programowania obiektowego: Zdecyduj jakie chcesz mieć klasy; dla każdej klasy dostarcz pełny zbiór operacji; korzystając z mechanizmu dziedziczenia, jawnie wskaż to, co jest wspólne. Przykład języków programowania wspierających ten paradygmat: C++, Java, Python itp.

podstawowe cechy dziedziczenie możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. hermetyzacja możliwość ograniczanie dostępu do wybranych struktur danych. Pozwala to definiować ściśle określony interfejs dostępu do tych struktur. polimorfizm możliwość modyfikacji metod (określanych mianem metod wirtualnych) w strukturach bazowych poprzez ich redefiniowanie w strukturach pochodnych.

podstawowe cechy dziedziczenie możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. hermetyzacja możliwość ograniczanie dostępu do wybranych struktur danych. Pozwala to definiować ściśle określony interfejs dostępu do tych struktur. polimorfizm możliwość modyfikacji metod (określanych mianem metod wirtualnych) w strukturach bazowych poprzez ich redefiniowanie w strukturach pochodnych.

podstawowe cechy dziedziczenie możliwość tworzenia nowych struktur danych z wykorzystaniem struktur wcześniej zdefiniowanych wraz ze wszystkimi ich atrybutami i metodami. hermetyzacja możliwość ograniczanie dostępu do wybranych struktur danych. Pozwala to definiować ściśle określony interfejs dostępu do tych struktur. polimorfizm możliwość modyfikacji metod (określanych mianem metod wirtualnych) w strukturach bazowych poprzez ich redefiniowanie w strukturach pochodnych.

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady?

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-(

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-(

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-( Czy nie można było by stworzyć ogólnych mechanizmów nie tylko definiowania struktur, ale również pisania funkcji? Czy mechanizmy te mogłyby być na tyle ogólne, aby np. napisać funkcję umożliwiającą sortowanie dowolnych struktur danych?

podstawowe cechy Czy programowanie obiektowe może mieć jakieś wady? Ależ tak! Jest wciąż mało elastyczne!!!! :-0 We wcześniejszym przykładzie typy Macierz4x4 i MacierzWJ zostały zdefiniowane dla typu float. Aby zdefiniować je dla typu double należy wszystko na nowo przepisać. :-( Czy nie można było by stworzyć ogólnych mechanizmów nie tylko definiowania struktur, ale również pisania funkcji? Czy mechanizmy te mogłyby być na tyle ogólne, aby np. napisać funkcję umożliwiającą sortowanie dowolnych struktur danych?

Programowanie uogólnione Przykład z biblioteki C realizacji uogólnionych algorytmów dla tworzenia, manipulowania i przeszukiwania struktury drzewa binarnego. #include <search.h> void *tsearch(const void *key, void **rootp, int(*compar)(const void *, const void *)); void *tfind(const void *key, const void **rootp, int(*compar)(const void *, const void *)); void *tdelete(const void *key, void **rootp, int(*compar)(const void *, const void *)); void twalk(const void *root, void(*action)(const void *nodep, const VISIT which, const int depth));

Programowanie uogólnione Przykład z biblioteki C realizacji uogólnionych algorytmów dla tworzenia, manipulowania i przeszukiwania struktury drzewa binarnego. #include <search.h> void *tsearch(const void *key, void **rootp, int(*compar)(const void *, const void *)); void *tfind(const void *key, const void **rootp, int(*compar)(const void *, const void *)); void *tdelete(const void *key, void **rootp, int(*compar)(const void *, const void *)); void twalk(const void *root, void(*action)(const void *nodep, const VISIT which, const int depth));

Programowanie uogólnione Na poziomie języka C ideę programowania uogólnionego realizuje się poprzez rzutowanie z typów void*, void** itp.

Programowanie uogólnione Na poziomie języka C ideę programowania uogólnionego realizuje się poprzez rzutowanie z typów void*, void** itp. Najistotniejszą wadą tego rozwiązania jest brak kontroli typów na etapie kompilacji.

Programowanie uogólnione

Programowanie uogólnione Programowanie uogólnione pozwala tworzyć uniwersalne struktury, w których nie ma (lub są one zminimalizowane) ograniczeń na typ pól. Daje możliwość skoncentrowania się na ogólnych mechanizmach manipulowania strukturami danych. Można stworzyć np. szablon listy.

Programowanie uogólnione Programowanie uogólnione pozwala tworzyć uniwersalne struktury, w których nie ma (lub są one zminimalizowane) ograniczeń na typ pól. Daje możliwość skoncentrowania się na ogólnych mechanizmach manipulowania strukturami danych. Można stworzyć np. szablon listy.

Programowanie uogólnione

Programowanie uogólnione Konkretyzacja typu następuje w momencie odwołania się do szablonu wraz ze wszystkimi parametrami. Są one nazwami typów składowych. Odwołanie następuje wraz z deklaracją obiektu danej klasy.

Programowanie uogólnione Konkretyzacja typu następuje w momencie odwołania się do szablonu wraz ze wszystkimi parametrami. Są one nazwami typów składowych. Odwołanie następuje wraz z deklaracją obiektu danej klasy.

Programowanie uogólnione Konkretyzacja typu następuje w momencie odwołania się do szablonu wraz ze wszystkimi parametrami. Są one nazwami typów składowych. Odwołanie następuje wraz z deklaracją obiektu danej klasy.

Programowanie uogólnione Paradygmat programowania programowania uogólnionego:

Programowanie uogólnione Paradygmat programowania programowania uogólnionego: Zdecyduj jakie chcesz mieć algorytmy; parametryzuj je w taki sposób, by działały dla różnych typów i struktur.

Programowanie uogólnione Paradygmat programowania programowania uogólnionego: Zdecyduj jakie chcesz mieć algorytmy; parametryzuj je w taki sposób, by działały dla różnych typów i struktur. Przykład języków programowania wspierających ten paradygmat: C++ Programowanie uogólnione jest podstawową techniką programowania użytą przy tworzeniu standardowej biblioteki szablonów (STL), która jest jednym z podstawowych składników ANSI/ISO C++.

Programowanie uogólnione Paradygmat programowania programowania uogólnionego: Zdecyduj jakie chcesz mieć algorytmy; parametryzuj je w taki sposób, by działały dla różnych typów i struktur. Przykład języków programowania wspierających ten paradygmat: C++ Programowanie uogólnione jest podstawową techniką programowania użytą przy tworzeniu standardowej biblioteki szablonów (STL), która jest jednym z podstawowych składników ANSI/ISO C++.

Bjarne Stroustrup Historia narodzin Motywacja Chronologia 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.

Plan prezentacji Historia narodzin Motywacja Chronologia 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Tło akcji Historia narodzin Motywacja Chronologia 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.

Zdarzenia Historia narodzin Motywacja Chronologia 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.

Zdarzenia Historia narodzin Motywacja Chronologia 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.

Zdarzenia Historia narodzin Motywacja Chronologia 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.

Zdarzenia Historia narodzin Motywacja Chronologia 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.

Epilog Style programowania Historia narodzin Motywacja Chronologia 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.

Plan prezentacji Historia narodzin Motywacja Chronologia 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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).

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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).

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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).

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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).

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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).

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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.

Niektóre spostrzeżenia Historia narodzin Motywacja Chronologia 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.

Plan prezentacji Historia narodzin Motywacja Chronologia 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Ważniejsze daty Historia narodzin Motywacja Chronologia 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++.

Genealogia Historia narodzin Motywacja Chronologia

Historia narodzin Motywacja Chronologia Dalszy rozwój i wprowadzane standardy 1998 (ISO/IEC 14882:2011) Przyjęcie standardu AN- SI/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.

Historia narodzin Motywacja Chronologia Dalszy rozwój i wprowadzane standardy 1998 (ISO/IEC 14882:2011) Przyjęcie standardu AN- SI/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.

Historia narodzin Motywacja Chronologia Dalszy rozwój i wprowadzane standardy 1998 (ISO/IEC 14882:2011) Przyjęcie standardu AN- SI/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.

Historia narodzin Motywacja Chronologia Dalszy rozwój i wprowadzane standardy 1998 (ISO/IEC 14882:2011) Przyjęcie standardu AN- SI/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.

Historia narodzin Motywacja Chronologia Dalszy rozwój i wprowadzane standardy C++98 1998 (ISO/IEC 14882:2011) Przyjęcie standardu AN- SI/ISO języka C++. C++03 C++TR1 C++11 2003 2007 2011 (ISO/IEC 14882:2003) Korekcja wcześniejszego standardu. (ISO/IEC TR 19768:2007) Oparty na technicznym raporcie Library Technical Report 1, który wprowadzał rozszerzenia do biblioteki standardowej. (ISO/IEC 14882:2011) 11 sierpnia 2011: Nowy standard języka C++ wcześniej roboczo określany jako C++0x.

Wzajemne powiązania Historia narodzin Motywacja Chronologia 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.

Wzajemne powiązania Historia narodzin Motywacja Chronologia 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.

Wzajemne powiązania Historia narodzin Motywacja Chronologia 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.

Dlaczego C Historia narodzin Motywacja Chronologia C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym

Dlaczego C Historia narodzin Motywacja Chronologia C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym

Dlaczego C Historia narodzin Motywacja Chronologia C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym

Dlaczego C Historia narodzin Motywacja Chronologia C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym

Dlaczego C Historia narodzin Motywacja Chronologia C jest językiem elastycznym C jest językiem wydajnym C jest językiem szeroko dostępnym C jest językiem przenośnym

Dlaczego C Historia narodzin Motywacja Chronologia 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

Dlaczego C Historia narodzin Motywacja Chronologia 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

Dlaczego C Historia narodzin Motywacja Chronologia 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

Dlaczego C Historia narodzin Motywacja Chronologia 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.

Zastanówmy się... Historia narodzin Motywacja Chronologia Czy C++ jest lepszym językiem niż C?

Przestrzenie... Historia narodzin Motywacja Chronologia

Przestrzenie... Historia narodzin Motywacja Chronologia

Przestrzenie... Historia narodzin Motywacja Chronologia

Przestrzenie... Historia narodzin Motywacja Chronologia

Przestrzenie... Historia narodzin Motywacja Chronologia

Konkluzja Historia narodzin Motywacja Chronologia Ani język C ani też C++ nie jest ani generalnie gorszy ani też generalnie lepszy. Ocena języka zależy od problemu, dla którego chcemy stworzyć model implementacji rozwiązania (program komputerowy). Dopiero w tym kontekście można uzasadniać wybór języka programowania. Dotyczy to również wszystkich innych języków programowania.

Plan prezentacji Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Potencjalne możliwości błędów Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................

Potencjalne możliwości błędów Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................ int main( ) { Stos St; float Arg;... } if (St. Ilosc >= ROZ STOSU) { / Obsługa błędu / } St. TabStosu[St. Ilosc++] = 12.3;...

Potencjalne możliwości błędów Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................ int main( ) { Stos St; float Arg;... } if (St. Ilosc >= ROZ STOSU) { / Obsługa błędu / } St. TabStosu[St. Ilosc] = 12.3;...

Potencjalne możliwości błędów Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................ int main( ) { Stos St; float Arg;... } if (St. Ilosc <= 0) { / Obsługa błędu / } Arg = St. TabStosu[ St. Ilosc];...

Potencjalne możliwości błędów Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................ int main( ) { Stos St; float Arg;... } if (St. Ilosc <= 0) { / Obsługa błędu / } Arg = St. TabStosu[ St. Ilosc];...

Plan prezentacji Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu 1 Style programowania 2 Historia narodzin Motywacja Chronologia 3 Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu

Metoda jako element interfejsu klasy Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } }; //........................................................................

Metoda jako element interfejsu klasy Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } float Pobierz( ); }; //........................................................................

Metoda jako element interfejsu klasy Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } float Pobierz( ); }; //........................................................................ float Stos::Pobierz( ) { return TabStosu[ Ilosc]; }

Metoda jako element interfejsu klasy Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu struct Stos { //............................................................ float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } float Pobierz( ); }; //........................................................................ float Stos::Pobierz( ) { if ( Ilosc <= 0) return numeric limits<float>::max( ); } return TabStosu[ Ilosc];

Metoda jako element interfejsu klasy Niebezpieczeństwa struktur bez kontroli dostępu Redukcja możliwych błędów poprzez metody Redukcja możliwych błędów poprzez kontrolę dostępu Hamowanie propagacji błędu #include <limits> using namespace std; struct Stos { //........................................................... float int TabStosu[ROZ STOSU]; Ilosc; Stos( ) { Ilosc = 0; } float Pobierz( ); }; //........................................................................ float Stos::Pobierz( ) { if ( Ilosc <= 0) return numeric limits<float>::max( ); } return TabStosu[ Ilosc];