C++ – język programowania ogólnego przeznaczenia.
Umożliwia abstrakcję danych oraz stosowanie kilku paradygmatów programowania: proceduralnego, obiektowego i generycznego.
Charakteryzuje się wysoką wydajnością kodu wynikowego, bezpośrednim
dostępem do zasobów sprzętowych i funkcji systemowych, łatwością
tworzenia i korzystania z bibliotek (napisanych w C++, C
lub innych językach), niezależnością od konkretnej platformy sprzętowej
lub systemowej (co gwarantuje wysoką przenośność kodów źródłowych) oraz
niewielkim środowiskiem uruchomieniowym. Podstawowym obszarem jego
zastosowań są aplikacje i systemy operacyjne.
C++ został zaprojektowany przez Bjarne Stroustrupa
jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i
silną statyczną kontrolę typów. Zachowanie zgodności z językiem C na
poziomie kodu źródłowego pozostaje jednym z podstawowych celów
projektowych kolejnych standardów języka.
W latach 90. XX wieku język C++ zdobył pozycję jednego z
najpopularniejszych języków programowania ogólnego przeznaczenia. Na
początku XXI wieku liczbę programistów języka C++ szacowano na około 3
miliony.
Od 1998 obowiązuje standard ISO/IEC 14882:1998 (Standard for the C++ Programming Language) z drobnymi poprawkami zatwierdzonymi w 2003 r. (ISO/IEC 14882:2003). W 2009 roku ogłoszono nowy standard (tzw. C++0x), który zaczął obowiązywać od 12 sierpnia 2011 roku, lecz wciąż oczekuje na opublikowanie (ISO/IEC 14882:2011).
Cechy standardów
Projekt języka C++ usiłuje zachować możliwie jak największą zgodność (na poziomie kodu źródłowego) z językiem C. Zgodność pomiędzy obydwoma językami nie zawsze była całkowita, ale jak dotąd ewentualne różnice były w praktyce nieistotne.
Większym problemem związanym ze zgodnością była niekompatybilność
kompilatorów języka C++ w zakresie obsługiwanej składni – przez wiele
lat programy napisane pod jednym nie działały pod innym. Biblioteki C++
związane z interfejsami systemów nie są przenośne poza ich obręb, co
wynika z faktu, że takie interfejsy są specyficzne dla danego systemu i
nie dotyczy to wyłącznie C++.
Większość użytecznych programów w C++ wymaga stosowania bibliotek
niestandardowych. Są one łatwo dostępne w Sieci zarówno jako produkty
własnościowe, jak i jako FLOSS. Programy napisane w C++ mogą korzystać również z zasobów bibliotek języka C.
Język C++ posiada swój oficjalny standard (aktualnie jest to C++0x z 2011).
Język C++ nie jest własnością żadnej osoby, instytucji czy korporacji.
Właściwości języka
- Język C++ jest językiem wieloparadygmatowym.
Oznacza to, że można w nim stosować jednocześnie różne style
programowania, w tym programowanie proceduralne, obiektowe, generyczne,
jak również programować na poziomie asemblera.
- Język C++ zakłada statyczną kontrolę typów; posiada też elementy dynamicznej kontroli typów.
- Język C++ umożliwia bezpośrednie zarządzanie wolną pamięcią.
- Projekt języka zakłada, że żadna nowa (względem języka C) cecha
języka C++ nie może mieć negatywnego wpływu na szybkość działania
programu lub zapotrzebowanie na pamięć operacyjną. Dzięki temu dobrze
napisany program w C++ jest z reguły co najmniej równie szybki, jak jego
odpowiednik napisany w C; co więcej, dzięki możliwości zastosowania
algorytmów generycznych w wielu przypadkach C++ jest wyraźnie szybszy od
C (np. podczas sortowania).
- Język C++ ze względu na bardzo rozbudowaną składnię oraz surowe
wymogi w zakresie wydajności kodu stanowi duże wyzwanie dla twórców
kompilatorów.
- Do dziś (2012) żaden popularny kompilator nie jest w pełni zgodny z
obowiązującym standardem języka, aczkolwiek ewentualne niezgodności
dotyczą już tylko drugorzędnych cech języka (np. implementacji słowa
kluczowego
export
).
Historia
Język C++ został stworzony w latach osiemdziesiątych XX wieku (pierwsza wersja pojawiła się w 1979 r.) przez Bjarne Stroustrupa jako obiektowe rozszerzenie języka C. Poza językiem C, na definicję języka C++ miały wpływ takie języki, jak Simula (z której zaczerpnął właściwości obiektowe) oraz Algol, Ada, ML i Clu.
Początkowo język C++ był dostępny w takim standardzie, w jakim opracowano ostatnią wersję kompilatora Cfront (tłumaczący C++ na C), później opublikowano pierwszy nieformalny standard zwany ARM (Annotated Reference Manual), który sporządzili Bjarne Stroustrup i Margaret Ellis.
Standard języka C++ powstał w 1998 roku (ISO/IEC 14882-1998
"Information Technology – Programming Languages – C++"). Standard ten
zerwał częściowo wsteczną zgodność z ARM w swojej bibliotece standardowej; jedyne, co pozostało w stanie w miarę nienaruszonym to biblioteka iostream.
Początkowo najważniejszą zmianą wprowadzoną w C++ w stosunku do C
było programowanie obiektowe, później jednak zaimplementowano wiele
innych ulepszeń, mających uczynić ten język wygodniejszym i bardziej
elastycznym od swojego pierwowzoru. Niektóre zmiany w standardzie języka
C były zainspirowane językiem C++ (np. słowo inline w C99).
Nazwa języka została zaproponowana przez Ricka Mascitti
w 1983 roku, kiedy to po raz pierwszy użyto tego języka poza
laboratorium naukowym. Odzwierciedla ona fakt, że język ten jest
rozszerzeniem języka C. Wcześniej używano nazwy "C z klasami". Nazwa
języka C++ nawiązuje do faktu bycia "następcą języka C", przez użycie w
niej operatora inkrementacji "++". Inkrementacja to zwiększenie liczby o 1, w języku C++ do jej wykonania wykorzystywany jest ww. operator; dla przykładu:
zapis:
Nazwa C++ jest więc symbolicznym stwierdzeniem, iż jest to język C, unowocześniony, o większych możliwościach.
Pierwsze kompilatory języka C++, podobnie jak Cfront, były
wyłącznie translatorami na język C. Kompilatory takie dostępne są i
dziś. Jednym z nich jest Comeau C++ – jeden z niewielu kompilatorów
oferujących pełne wsparcie dla standardu języka. Pierwszym kompilatorem
natywnym (produkującym od razu kod asemblerowy) dla języka C++ był g++ z pakietu GCC, którego pierwszym autorem był Michael Tiemann, założyciel Cygnus Solutions
Przykładowy program
Poniższy program wyprowadza na standardowe urządzenie wyjścia napis "Hello world"
Nowe cechy języka C++ względem języka ANSI C z 1989 roku
Uwaga: niektóre z poniższych elementów trafiły do standardu języka C z 1999 roku (tzw. C99).
- Możliwość programowania obiektowego:
- Mechanizmy enkapsulacji:
- funkcje składowe
- sekcje prywatne, chronione i publiczne
- zaprzyjaźnianie funkcji i klas
- Klasy, jako rozszerzenie struktury o funkcje składowe, enkapsulację, dziedziczenie i polimorfizm
- Obiekty, będące instancjami klas
- Dziedziczenie (w tym dziedziczenie wielobazowe)
- Metody wirtualne dostarczające polimorfizm
- Konstruktory
(służące również do niejawnej konwersji; później dodano również
możliwość zakazania niejawnej konwersji przez konstruktor za pomocą explicit)
- Destruktory, czyli funkcja wywoływana niejawnie przed (ściśle ustalonym) usunięciem obiektu
- Operatory new i delete
- Dynamiczna kontrola typów (RTTI),
czyli dynamiczne (sprawdzane w czasie wykonywania) rzutowanie pomiędzy
typami spokrewnionych klas, oraz określanie typu w czasie wykonywania
(operatory dynamic_cast i typeid)
- Słowo kluczowe this (dostęp do obiektu, na rzecz którego wołana jest metoda)
- Wskaźniki do składowych (pól i metod)
- Metody i pola statyczne
- Udogodnienia związane z programowaniem generycznym:
- Szablony (wzorce) klas i funkcji
- Włączenie do biblioteki standardowej generycznej biblioteki STL
- Obsługa wyjątków:
- Deklaracja wychwytywania wyjątków: try ... catch
- Deklaracja wywoływania wyjątku: throw
- Deklaracja ograniczania wyjątków: throw(...) (określanie, jakie wyjątki mogą być propagowane z danej funkcji/metody)
- Zmiany natury ogólnej:
- Przestrzenie nazw i operator zasięgu ::
- Traktowanie definicji zmiennych i obiektów jak zwykłych instrukcji
- Dynamiczna inicjalizacja zmiennych globalnych i lokalnych zmiennych statycznych (tzn. mogą być inicjalizowane wartością funkcji)
- Możliwość uzyskania dostępu do przesłoniętej zmiennej globalnej za pomocą operatora ::
- Referencje
- Słowa kluczowe const, volatile (również C99) i mutable (usuwanie modyfikatora const z podanego pola, jeśli taki został nadany całemu obiektowi)
- Przeciążanie funkcji
- Przeciążanie operatorów
- Funkcje rozwijalne (inline) (również C99)
- Nowy typ logiczny bool i stałe true i false (również C99, z tym że w C++ są to słowa kluczowe)
- "Szeroki" typ znakowy, wchar_t (również C99) wraz ze wszystkimi zależnościami (np. klasy strumieniowe, w tym
wiostream
, oraz dodatkowe pliki nagłówkowe, np. wstring)
- Operatory precyzyjnego rzutowania: dynamic_cast (rzutowanie tylko pomiędzy typami, z uwzględnieniem hierarchii klas), reinterpret_cast (rzutowanie wymuszone tylko pomiędzy typami) i const_cast (rzutowanie zmieniające modyfikatory typu const i volatile)