C++

język programowania ogólnego przeznaczenia

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.

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

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

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

  • 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

 
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

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

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

Uwagi edytuj

  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

  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, 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