C++
Z Wikipedii
Język C++ jest jednym z najpopularniejszych języków programowania ogólnego przeznaczenia, zarówno w zastosowaniach komercyjnych, jak i hobbystycznych.
Spis treści |
[edytuj] Główne cechy języka
[edytuj] Kompilacja
Programy napisane w języku C++ są kompilowane do kodu maszynowego. W tym wypadku mogą one bezpośrednio zarządzać alokacją pamięci, dzięki czemu są bardzo szybkie i efektywnie gospodarują zasobami systemowymi. Efektywność kodu napisanego C++ wynika także z wieloletnich doświadczeń w optymalizacji kompilatorów dla tego języka.
Język C++ może być również kompilowany do kodu pośredniego .NET. Wymaga to jednak zastosowania specjalnych rozszerzeń języka, np. Managed C++ lub C++/CLI (ten ostatni uznawany jest za osobny język programowania i zawiera rozwiązania chronione patentami). W tym wypadku program może skorzystać z mechanizmów automatycznego zarządzanie alokacją pamięci. Powoduje to, że co prawda programy są nieco wolniejsze, jednak zawierają mniejszą ilość błędów związanych z nieprawidłową alokacją pamięci lub błędy te są neutralizowane przez automatyczne mechanizmy zarządzania pamięcią (Garbage collection).
[edytuj] 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. Projektanci C++ za idealną uznaliby sytuację, w której język C byłby podzbiorem języka C++ (tj. każdy program w C byłby takim samym programem w C++, ale nie odwrotnie). Zgodność pomiędzy obu językami nie zawsze była całkowita, ale jak dotąd ewentualne różnice były w praktyce nieistotne [1]. 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ą przenaszalne poza ich obręb, co wynika z faktu, że takie interfejsy są specyficzne dla dane systemu i nie jest to specyficzne tylko dla C++.
Większość użytecznych programów w C++ wymaga stosowania bibliotek niestandardowych. Są one łatwo dostępne w Sieci zarówno jako produkty komercyjne, jak i typu Open Source. W szczególności programy napisane w C++ mogą korzystać z ogromnych zasobów bibliotek języka C.
Język C++ posiada swój oficjalny standard (aktualnie jest to IEC14882:2003) z 2003 r.
Język C++ nie jest własnością żadnej osoby, instytucji czy korporacji.
[edytuj] Właściwości języka
- Język C++ jest językiem wieloparadygmatowym [2]. Oznacza to, ze można w nim stosować (jednocześnie!) różne style programowania, w tym programowanie proceduralne, obiektowe, generyczne, a nawet 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ś (2006 r.) żaden wiodący kompilator nie jest w pełni zgodny z obowiązującym standardem języka, aczkolwiek ewentualne niezgodności dotyczą już tylko raczej mało pożądanych cech języka (np. implementacji słowa kluczowego
export
).
- Język C++ nie zmusza programistów do wyboru określonego stylu programowania czy stosowania określonych rozwiązań. Otwiera to ogromne pole do popisu dla doświadczonych programistów, jednak powoduje też, że początkujący adepci C++ z reguły tworzą kod bardzo marnej jakości, często nie mając świadomości rzeczywistego sposobu działania swojego kodu.
[edytuj] Historia
Język C++ został stworzony w latach osiemdziesiątych XX wieku przez Bjarnea 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ą rzeczą wprowadzoną w C++ w stosunku do C było programowanie obiektowe, później jednak wprowadzono do niego mnóstwo ulepszeń, czyniąc ten język wygodniejszym i bardziej elastycznym od swojego pierwowzoru. Nie od rzeczy jest też wspomnieć, że niektóre zmiany w standardzie języka C były w większości 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 o 1 — "++".
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.
Obecnie (2006) trwają prace nad rewizją i rozszerzeniem standardu C++ zwane roboczo C++0x. Wprawdzie przewidziane są nieznaczne zmiany w samym języku C++, ale rozszerzana jest przede wszystkim biblioteka standardowa języka. Rozszerzenia te znane są pod nazwą TR1 (od Technical Report No. 1) i zawierają przede wszystkim komponenty przejęte z biblioteki Boost.
[edytuj] Przykładowe programy
Najmniejszy możliwy program wygląda tak:
int main(){}
Jest to już w pełni poprawny program w języku C++, który nie wykonuje żadnego działania. Poniższy natomiast wyświetla napis "Hello world!":
#include <iostream> // deklaracje obiektów std::cout i std::endl int main() // funkcja main { std::cout << "Hello world!" << std::endl; /* wprowadzenie tekstu na ekran (wraz z przejściem do następnej linii) */ return 0; }
std::cout i std::endl oznacza, że elementy cout i endl znajdują się w przestrzeni nazw std. Deklarację używania przestrzeni std można umieścić na początku programu: using namespace std;
#include <iostream> // deklaracje std::endl i std::ostream using namespace std; int main() // funkcja main { cout << "Hello world!" << endl; // wprowadzenie tekstu na ekran return 0; }
Prosty kalkulator:
#include <iostream> using namespace std; int main(int argc, char *argv[]) // argc - liczba argumentów podanych przy uruchomieniu, { // argv[] - tablica argumentów — łańcuchów typu (char *) double a, b, wynik; int dzialanie; cout << "Wybierz dzialanie :" << endl << "1. Dodawanie" << endl << "2. Odejmowanie" << endl << "3. Mnozenie" << endl << "4. Dzielenie" << endl << endl << "Wybierz inna liczbe aby wyjsc" << endl << endl; cin >> dzialanie; switch (dzialanie) { // instrukcja warunkowa sprawdzająca wartość zmiennej w nawiasach case 1: cout << endl << "Podaj składniki :" << endl; cin >> a >> b; wynik = a + b; break; case 2: cout << endl << "Podaj odjemna i odjemnik :" << endl; cin >> a >> b; wynik = a - b; break; case 3: cout << endl << "Podaj czynniki :" << endl; cin >> a >> b; wynik = a * b; break; case 4: cout << endl << "Podaj dzielna i dzielnik :" << endl; cin >> a >> b; wynik = a / b; break; default: // dowolny, niewyszczególniony przedtem przypadek cout << endl << "Koniec programu." << endl; wynik = 0; } cout << endl << "Wynik wynosi " << wynik << endl << endl; // Poniższe dwie linie potrzebne są tylko w systemach z rodziny Windows, // aby zapobiec zamknięciu okna konsoli zaraz po zakończeniu programu: cin.ignore(); cin.get(); return 0; // Wysłanie do systemu informacji o pomyślnym zakończeniu programu. }
[edytuj] Nowe cechy języka C++ (względem języka ANSI C)
Niektóre z nich trafiły do języka C, najpierw nieoficjalnie, później zaś zostały ustandaryzowane w C99, IEC14882:1998, IEC14882:2003. Aktualne wypracowywany jest nowy standard, który opisano w roboczym dokumencie [3]
- Klasy wraz z innymi elementami języków zorientowanych obiektowo takimi jak: dziedziczenie, metody wirtualne
- Dodatkowe ulepszenia klas, konstruktory, destruktory (język C++ był pierwszym językiem w którym użyto nazwy "konstruktor" w tym właśnie znaczeniu i pierwszym językiem, który posiadał destruktory)
- Szablony (wzorce) klas i funkcji
- Obsługa wyjątków
- Deklaracje zmiennych jako instrukcje (w ANSI C wszystkie zmienne lokalne funkcji musiały być zadeklarowane przed pierwszą jej instrukcją)
- Dynamiczna inicjalizacja zmiennych globalnych i lokalnych zmiennych statycznych (tzn. mogły być inicjalizowane wynikiem wywołanej funkcji)
- Przestrzenie nazw
- Referencje
- Operatory new i delete
- Operator zasięgu (::) (w ANSI C nie istnieje możliwość odwołania się do zmiennej globalnej o tej samej nazwie, co zmienna lokalna)
- Dynamiczna kontrola typów RTTI
- Przeładowanie funkcji
- Przeciążanie operatorów
- Wskaźniki do składowych (pól i metod)
- Funkcje rozwijalne (inline) (również C99)
- Nowy typ 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ż C89) wraz ze wszystkimi zależnościami (wiostream i reszta, nagłówek <wctype>, wstring)
- Operatory rzutowania: static_cast, dynamic_cast, reinterpret_cast i const_cast
- Pojemniki (w postaci szablonów klas, np.: vector, map, list) oraz zestaw podstawowych algorytmów (w postaci szablonów funkcji, np.: sort, find, for_each)
- Słowo kluczowe const służące do definiowania stałych symbolicznych, a także stałych wskaźników, wskaźników na stałe, stałych referencji i stałych funkcji składowych.
- Koncepty
[edytuj] Zobacz też
[edytuj] Linki zewnętrzne
- http://www.open-std.org/jtc1/sc22/wg21/ - Komitet standaryzacyjny ISO C++
- http://www.research.att.com/~bs/bs_faq.html - FAQ prowadzony przez Bjarne Stroustrupa
- http://www.cplusplus.com
- http://www.gamedev.pl/tutorials.php - "Megatutorial - Od Zera Do Gier Kodera"; zawiera pokaźnych rozmiarów kompletny kurs-podręcznik C++.
- http://www.unit1.pl/ - zbiór artykułów poświęconych C++
- http://it.hk.pl - kurs C++ (również wersja jednoplikowa w pdf - 215 stron)
- http://pl.cpp.wikicities.com/ - wiki o C++
- http://www.uw-team.org/get.php?id=4 - Film instruktażowy "C++ - Jakie to proste". Czyli jak napisać pierwszy program.
- http://www.intercon.pl/~sektor/cbx - C++ bez cholesterolu
- http://www.cppreference.com/ - Opis standardowych bibliotek C/C++
ABAP • Ada • AWK • Asembler • C • C++ • C# • COBOL • D • Forth • Fortran • Icon • Java • JavaScript • Lisp • Modula 2 • Oberon • Object Pascal • Objective-C • Pascal • Perl • PHP • PL/SQL • Python • REXX • Ruby • sh • Smalltalk • Snobol • SQL • Visual Basic • VB.NET
Akademickie
Comal • Eiffel • Haskell • Logo • MCPL • ML • Nemerle • Prolog • Scheme
Historyczne
ALGOL • APL • BASIC • Clipper • MUMPS • PLAN • PL/I • PL/M • SAS • Simula