rozdział I - wstęp

rozdział II - charakterystyka języków programowania

rozdział I - podsumowanie

C++

C++ należy do grupy obiektowych języków programowania. Korzenie tych języków sięgają końca lat sześćdziesiątych, a rok 1967 uważa się za datę powstania pierwszego języka obiektowego. Był nim Simula-67. Język Simula-67 bazował na wcześniejszej pracy nad specjalizowanym językiem Simula-1, przeznaczonym do symulacji zdarzeń dyskretnych, zachodzących w reaktorach jądrowych. Twórcami Simuli byli dwaj badacze norwescy, Kristen Nygaard i Ole-Johan Dahl, pracujący w Norweskim Centrum Obliczeniowym. W języku tym wprowadzono szereg pojęć i koncepcji, które z niewielkimi zmianami przejęły współczesne języki obiektowe. Okresem szczególnej aktywności w badaniach nad językami programowania były lata siedemdziesiąte. Powstało wtedy prawdopodobnie kilka tysięcy różnych języków i ich dialektów, ale przetrwało w szerszym obiegu zaledwie kilka. Tak więc na rynku utrzymały się języki: Smalltalk, Ada (sukcesor języków ALGOL 68 i Pascal, z pewnym wkładem od języków Simula, Alphard i CLU), Eiffel (oryginalne dzieło Bertranda Meyera, bazujący po części na Simuli), obiektowe wersje języków Pascal (Object Pascal, Turbo Pascal) i Modula-2 (Modula-3) oraz właśnie C++ (pochodzący z mariażu języków C i Simula). Język C++ można uznać za obiektowy, gdyż spełnia on następujące wymagania :

  • Pozwala definiować klasy i ich wystąpienia, nazywane obiektami. Definicja klasy w języku obiektowym jest podobna do definicji abstrakcyjnego typu danych w językach proceduralnych (typu, który nie jest wbudowany, lecz może być zdefiniowany przez programistę). W językach Eiffel, Smalltalk i Simula klasa jest niepodzielną jednostką syntaktyczną, zawierającą definicje struktur danych i definicje operacji wykonywanych na tych strukturach. Natomiast w językach hybrydowych, jak np. Object Pascal, Turbo Pascal, CLOS i C++ klasa jest traktowana jako "deklaracja typu" umieszczana w jednym pliku, a definicje operacji (nazywane metodami, funkcjami składowymi, lub funkcjami pierwotnymi) umieszcza się zwykle w innym pliku. Konkretna operacja może być implementowana za pomocą jednej tylko metody lub wielu metod. W pierwszym przypadku nazywamy ją monomorficzną, zaś w drugim polimorficzną albo wirtualną
  • Zapewnia ukrywanie informacji (hermetyzację, ang. encapsulation), co można rozumieć jako zamknięcie obiektu w swego rodzaju "czarnej skrzynce" lub "kapsułce". W większości języków obiektowych hermetyzacja nie zawsze jest pełna, ponieważ zawierają one mechanizmy kontroli dostępu do elementów klasy. Jako zasadę przyjmuje się ukrywanie przed użytkownikiem definicji struktur danych i definicji operacji, przy czym same operacje (lub tylko część z nich) są publicznie dostępne. Zbiór publicznie dostępnych operacji dla obiektu danej klasy nazywa się często publicznym interfejsem obiektu. Taka konstrukcja klas jest logiczna, ponieważ dla użytkownika klasy istotne jest tylko to, jak się nazywa dana operacja, do czego służy i jak się ją uaktywnia (wywołuje). Hermetyzację realizuje się zwykle w ten sposób, że użytkownik nie ma dostępu do kodu źródłowego z definicjami klas i operacji, a jedynie do publicznych interfejsów. Dzięki temu zapewnia się ochronę klas (przede wszystkim predefiniowanych klas bibliotecznych) przed nieuprawnionym dostępem.
  • Posiada wbudowany mechanizm dziedziczenia, dzięki któremu można tworzyć klasy potomne (podklasy, klasy pochodne) od jednej lub kilku klas rodzicielskich, nazywanych superklasami lub klasami bazowymi. Klasy potomne mogą z kolei być klasami rodzicielskimi dla swoich klas pochodnych, co pozwala tworzyć "drzewa" (hierarchie) klas. W praktyce klasa bazowa jest na ogół prostą konstrukcją językową, zaś klasa pochodna jest jej specjalizacją, co zwykle prowadzi do rozszerzenia definicji klasy bazowej o nowe elementy. Elementami tymi mogą być nowe struktury danych i nowe metody, bądź też operacje o tych samych nazwach co w klasie bazowej, ale o innych definicjach. Mechanizm dziedziczenia jest niezwykle efektywny: nie wymaga kopiowania kodu źródłowego klasy bazowej, ponieważ klasa pochodna automatycznie dziedziczy wszystkie lub wybrane cechy klasy bazowej. W rezultacie mamy lepszą, bardziej przejrzystą organizację programu.
  • Dysponuje cechami polimorfizmu. Polimorfizm jest terminem zapożyczonym z biologii i oznacza dosłownie wielopostaciowość. W odniesieniu do programów obiektowych polimorfizm można określić krótko: jeden interfejs (operacja), wiele metod. Najprostszą postacią polimorfizmu jest wykorzystanie tego samego symbolu dla semantycznie nie związanych operacji. Polimorfizm tego rodzaju jest charakterystyczny dla większości współczesnych języków programowania wysokiego poziomu, nie tylko obiektowych. Przykładem może być używanie tych samych symboli operacji arytmetycznych, np. symbolu mnożenia "*", przy mnożeniu liczb całkowitych i rzeczywistych, chociaż w każdym konkretnym przypadku będzie wywoływana inna metoda mnożenia.


Język C++ zawiera wszystkie wymienione cechy, a ponadto takie, które czynią go bardzo efektywnym, dzięki temu stał się on de facto "standardem przemysłowym".

Opisy języków programowania

Logo |  Basic |  Pascal |  C |  Visual Basic |  C++ |  Java