C++

Z Wikipedii, wolnej encyklopedii
C++
Logo języka C++
Logo języka
Pojawienie się

1983

Paradygmat

wieloparadygmatowy (proceduralny, funkcyjny, obiektowy, uogólniony, modularny)

Typowanie

statyczne

Implementacje

Borland C++, Clang, GCC, VC++

Aktualna wersja stabilna

C++20
(grudzień 2020) [±]

Aktualna wersja testowa

C++23

Twórca

Bjarne Stroustrup

Platforma sprzętowa

wieloplatformowy

Platforma systemowa

wieloplatformowy

Strona internetowa

C++język programowania ogólnego przeznaczenia. Język 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.

Umożliwia abstrakcję danych oraz stosowanie kilku paradygmatów programowania: proceduralnego, obiektowego i generycznego, a także funkcyjnego i modularnego. 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.

W latach 90. XX wieku język C++ zdobył pozycję jednego z najpopularniejszych języków programowania ogólnego przeznaczenia. Według ankiety z 2015 roku, liczba programistów C++ wynosi około 4,4 miliona[1][2].

Cechy standardów[edytuj | edytuj kod]

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[3]. 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++ jest standaryzowany przez ISO. Pierwszą wersję, C++98, opublikowano w 1998 jako ISO/IEC 14882:1998[4]. Następnie kilkukrotnie standard aktualizowano: C++03[5], C++11[6][7][8] (opracowany już w 2009 jako C++0x, jednak opublikowany dopiero w 2011)[9], C++14[10] oraz C++17. Ostatnia, najnowsza z wersji standardu, nazywana C++20, opublikowana została w grudniu 2020 jako ISO/IEC 14882:2020[11].

Standardy języka C++
Rok Standard C++ Nazwa nieoficjalna
1998 ISO/IEC 14882:1998[12] C++98
2003 ISO/IEC 14882:2003[13] C++03
2011 ISO/IEC 14882:2011[14] C++11, C++0x
2014 ISO/IEC 14882:2014[15] C++14, C++1y
2017 ISO/IEC 14882:2017[16] C++17, C++1z
2020 ISO/IEC 14882:2020[17] C++20, C++2a

Język C++ nie jest własnością żadnej osoby, instytucji czy korporacji.

Właściwości języka[edytuj | edytuj kod]

  • Język C++ jest językiem wieloparadygmatowym[18]. 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)[19].
  • 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[19].
  • Do dziś (2024)[doprecyzuj!] ż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)[20][21].

Historia[edytuj | edytuj kod]

Bjarne Stroustrup, twórca języka C++, w swoim biurze AT&T New Jersey (ok. 2000 r.)

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 kształt 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:

i = i + 1; // Zmiennej "i" przypisuje jej aktualną wartość, powiększoną o 1.

... jest równoważny[a]

++i; // Również powiększa wartość zmiennej "i" o 1.
// Uwaga! instrukcja i++ także zwiększa wartość zmiennej, po jej użyciu.

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[edytuj | edytuj kod]

Poniżej zamieszczono program wyprowadzający na standardowy strumień wyjścia napis „Hello world” (w wersji przedstawianej na stronie internetowej Bjarne Stroustrupa)[22]:

#include <iostream>

int main()
{
	std::cout << "Hello, world!" << std::endl;
}

// zauważmy, że "return 0;" nie jest wymagane w ISO C++

Nowe cechy języka C++ względem języka ANSI C z 1989 roku[edytuj | edytuj kod]

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 hermetyzacji:
      • 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 (wskaźnik na obiekt, w kontekście którego wywoływana 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)

Zobacz też[edytuj | edytuj kod]

Uwagi[edytuj | edytuj kod]

  1. Jest równoważny znaczeniowo, ale wygenerowany przez kompilator kod może być różny. Czas wykonania instrukcji może zależeć od kompilatora jak i od procesora oraz instrukcji występujących przed i po tej instrukcji, dla kompilatorów dobrze optymalizujących kod oba zapisy wygenerują identyczny kod, a nawet w przypadku różnic kodu może wykonać się on w identycznym czasie.

Przypisy[edytuj | edytuj kod]

  1. Bjarne Stroustrup: Bjarne Stroustrup's FAQ. [dostęp 2015-04-16]. (ang.).
  2. Infographic: C/C++ Facts We Learned Before Going Ahead with CLion | The CLion Blog [online], The JetBrains Blog, 27 lipca 2015 [dostęp 2023-09-23] (ang.).
  3. Różnice między C a C++
  4. ISO/IEC 14882:1998. International Organization for Standardization. [dostęp 2017-12-18]. (ang.).
  5. ISO/IEC 14882:2003. International Organization for Standardization. [dostęp 2017-12-18]. (ang.).
  6. ISO/IEC 14882:2011. International Organization for Standardization. [dostęp 2017-12-18]. (ang.).
  7. Bjarne Stroustrup: C++11 FAQ. 2012-02-23. [dostęp 2015-12-08]. [zarchiwizowane z tego adresu (2012-06-24)]. (ang.).
  8. GCC 4.4 Release Series Changes, New Features, and Fixes. Free Software Foundation. [dostęp 2015-04-16]. (ang.).
  9. Herb Sutter: We have an international standard: C++0x is unanimously approved. Sutter's Mill. [dostęp 2017-12-18]. (ang.).
  10. ISO/IEC 14882:2014. International Organization for Standardization. [dostęp 2017-12-18]. (ang.).
  11. ISO/IEC 14882:2020. International Organization for Standardization. [dostęp 2020-12-18]. (ang.).
  12. ISO/IEC 14882:1998. International Organization for Standardization.
  13. ISO/IEC 14882:2003. International Organization for Standardization.
  14. ISO/IEC 14882:2011. International Organization for Standardization.
  15. ISO/IEC 14882:2014. International Organization for Standardization.
  16. ISO/IEC 14882:2017. International Organization for Standardization.
  17. ISO/IEC 14882:2020. International Organization for Standardization.
  18. Bjarne Stroustrup, "Why C++ is not just an Object-Oriented Programming Language" (ang.)
  19. a b Grzegorz M. Wójcik: Programowanie w C++. 2009. [dostęp 2015-04-16]. [zarchiwizowane z tego adresu (2009-06-17)].
  20. Herb Sutter, Tom Plum: Why We Can’t Afford Export. 2003-03-03. [dostęp 2015-04-16]. [zarchiwizowane z tego adresu (2011-06-07)]. (ang.).
  21. Language Standards Supported by GCC. [w:] Using the GNU Compiler Collection (GCC) [on-line]. Free Software Foundation. [dostęp 2015-04-16]. (ang.).
  22. Bjarne Stroustrup: The Hello world program.. [dostęp 2021-01-17].

Linki zewnętrzne[edytuj | edytuj kod]