C++ to uniwersalny język programowania, stworzony jako rozszerzenie języka C o
mechanizmy programowania obiektowego. Umożliwia łączenie różnych
paradygmatów programowania (proceduralnego, obiektowego, generycznego) w
jednym kodzie. Język zaprojektował Bjarne Stroustrup na początku lat 80. XX w. (pierwsza wersja
powstała w 1979 r.) w laboratoriach Bell Labs. Początkowo nazywał się „C z
klasami”, później nazwę zmieniono na C++ Nazwa „C++” nawiązuje do operatora inkrementacji ++ (zwiększania wartości o 1) – symbolicznie oznacza „C zwiększony o jeden”, czyli ulepszony następca języka C. C++ jest językiem kompilowanym – kod źródłowy tłumaczony jest przez kompilator na kod maszynowy. Dzięki temu programy napisane w C++ działają bardzo szybko i
wydajnie. C++ znajduje zastosowanie wszędzie tam, gdzie liczy się wysoka wydajność i
kontrola nad sprzętem. Używa się go do tworzenia systemów operacyjnych (np.
Microsoft Windows, Apple macOS), gier i silników gier, aplikacji desktopowych
(pakiet Microsoft Office) czy oprogramowania wymagającego bezpośredniego
dostępu do pamięci.
Składnia języka C++
- Średnik (;) – każda instrukcja w C++ musi być zakończona średnikiem, który
oznacza koniec polecenia dla kompilatora. Brak średnika na końcu instrukcji
spowoduje błąd kompilacji. - Nawiasy klamrowe { } – wyznaczają bloki kodu, np. ciało funkcji lub pętli,
obejmując zestaw instrukcji. Nawiasy okrągłe () używane są przy definicjach i
wywołaniach funkcji oraz do otaczania warunków w instrukcjach sterujących (if,
while, for itp.). - C++ rozróżnia duże i małe litery w nazwach (tzw. case-sensitive). Przykładowo
nazwy liczba i Liczba to dwie różne zmienne. Należy konsekwentnie stosować
jednolitą pisownię identyfikatorów. - Komentarze – fragmenty kodu, które nie są wykonywane przez program. W C++
komentarz jednoliniowy rozpoczyna się od //, a komentarz blokowy otaczamy
między /* a */. Służą one do opisywania działania kodu dla programisty i są
ignorowane przez kompilator.
Struktura programu w C++ - Dyrektywy dołączenia – na początku pliku źródłowego umieszczamy poleceniainclude dodające potrzebne biblioteki nagłówkowe. Np. #include dołącza standardową bibliotekę wejścia-wyjścia, co umożliwia użycie funkcji do
obsługi konsoli. - Funkcja main() – każdy program C++ musi zawierać funkcję główną o nazwie
main. To od niej zaczyna się wykonanie programu. Najczęściej definiujemy ją jako
int main(), co oznacza funkcję zwracającą wartość całkowitą (kod wyjścia
programu). - Ciało funkcji – instrukcje składające się na działanie programu umieszczamy
wewnątrz nawiasów klamrowych { } funkcji main. Każda instrukcja kończy się ;
zgodnie ze składnią języka. Przykład minimalnej struktury:
int main() {
// … (ciało programu)
return 0;
}
- Zakończenie programu – w końcowej części main często umieszczamy return 0;,
co zwraca do systemu kod 0 oznaczający poprawne wykonanie programu. W
nowszych standardach C++ instrukcja return 0; w main nie jest obowiązkowa
(domyślnie i tak zwracane jest 0), ale jej dodanie poprawia czytelność kodu. - Wejście/wyjście – aby wypisać tekst lub wartości na ekran, możemy użyć
standardowego strumienia wyjścia. Np. wyrażenie std::cout << „Tekst”; wypisze podany tekst do konsoli (wymaga dołączenia ).
Przykład programu – Hello, World!
Poniżej przedstawiono prosty program w C++, który wypisuje napis „Hello,
World!”. Kod ten można skompilować i uruchomić w środowisku Code::Blocks lub
innym kompilatorze zgodnym z C++:
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
Pierwsza linia using namespace std; ustawia domyślne używanie przestrzeni nazw
std, dzięki czemu można pisać cout zamiast std::cout. Deklarujemy funkcję główną programu: int main() { … }. W nawiasach klamrowych umieszczone są instrukcje, które zostaną wykonane po uruchomieniu programu. Wewnątrz funkcji, linia cout << „Hello, World!” << endl; wypisuje na ekran konsoli tekst Hello, World! (instrukcja endl powoduje przejście do nowej linii po wypisaniu tekstu). Na końcu return 0; zwraca kod wyjścia 0 do systemu operacyjnego, informując o poprawnym zakończeniu działania programu. Program po wykonaniu tej instrukcji kończy swoje działanie. Po skompilowaniu program wyświetli w oknie konsoli napis Hello, World! i natychmiast się zakończy. (W Code::Blocks wynik można zobaczyć w oknie Console, a aby zobaczyć rezultat, często trzeba dodać pauzę lub uruchamiać program poprzez Debug/Run).
Podstawowe typy danych w C++
- int – typ całkowitoliczbowy (integer). Przechowuje liczby całkowite (bez części
ułamkowej), np. -10, 0, 42. Zakres możliwych wartości zależy od implementacji
(typowo 32-bitowy, około od -2 miliardów do 2 miliardów). - float – typ zmiennoprzecinkowy pojedynczej precyzji (float). Służy do
przechowywania liczb rzeczywistych z częścią ułamkową, z ograniczoną precyzją
(~7 cyfr znaczących). Przykład wartości: 3.14F, -0.5F. - double – typ zmiennoprzecinkowy podwójnej precyzji. Pozwala przechowywać
liczby rzeczywiste z większą precyzją (~15 cyfr znaczących) niż float. Np.
3.1415926535 (domyślnie literały zmiennoprzecinkowe traktowane są jako double). - char – typ znakowy (character). Przechowuje pojedynczy znak (literę, cyfrę,
symbol) w kodowaniu ASCII/Unicode – na przykład 'A’, '9′, '$’. Technicznie jest to
najmniejszy typ całkowity (1 bajt = 8 bitów) reprezentujący kod znaku. - bool – typ logiczny (boolean). Może przyjmować tylko dwie wartości: true (prawda)
albo false (fałsz)ww2.ii.uj.edu.pl. Używany jest do wyrażania wyników porównań i
warunków logicznych.
Tworzenie zmiennych – deklaracja, inicjalizacja, nazewnictwo
- Deklaracja zmiennej – aby móc użyć zmiennej, należy najpierw zadeklarować jej
typ i nazwę. Deklaracja rezerwuje miejsce w pamięci na dany typ. Przykład: int
licznik; – tworzy zmienną o nazwie licznik typu całkowitego. (Do momentu nadania
wartości zmienna ma niezdefiniowaną zawartość). - Inicjalizacja – to jednoczesne stworzenie zmiennej i ustawienie jej początkowej
wartości. Można to zrobić za pomocą operatora = podczas deklaracji. Np. int licznik
= 0; deklaruje zmienną typu int i od razu zapisuje w niej wartość 0. Inicjalizacja
zapobiega pozostawaniu w zmiennej śmieciowych danych. - Nazwy zmiennych – powinny zaczynać się od litery (ew. znaku _) i mogą zawierać
litery, cyfry oraz podkreślenia. Nie wolno zaczynać nazwy od cyfry ani używać
spacji i znaków specjalnych. Nazwa musi być unikalna i nie może być słowem
kluczowym języka (np. int, while, class są zarezerwowane).
Przykłady poprawnych nazw: waga, srednia_ocen, ilosc1. - Stosowanie zmiennych – po deklaracji można zmiennej przypisywać różne
wartości w trakcie działania programu. Ważne jest, by nadać zmiennej sensowną
nazwę, opisującą przechowywane dane (np. suma_punktow zamiast x), co ułatwia
czytanie kodu. Zmienną należy zadeklarować przed jej pierwszym użyciem w
kodzie, w przeciwnym razie kompilator zgłosi błąd.
Operacje na zmiennych - Przypisanie wartości – operator = służy do nadania zmiennej nowej wartości (po
prawej stronie). Lewa strona musi być nazwą zmiennej, której wartość chcemy
zmienić. Np. x = 10; ustawia wartość zmiennej x na 10. Jeśli zmienna x miała
wcześniej inną wartość, zostaje ona zastąpiona. - Operacje arytmetyczne – na zmiennych liczbowych można wykonywać
podstawowe działania matematyczne: dodawanie (+), odejmowanie (-), mnożenie
(*), dzielenie (/) oraz modulo (% – reszta z dzielenia całkowitego). Można używać
zarówno stałych, jak i innych zmiennych w tych operacjach. Np. mając int a=5, b=2;:- int sum = a + b; (sum = 7),
- int różnica = a – b; (różnica = 3),
- int iloczyn = a * b; (iloczyn = 10),
- int iloraz = a / b; (iloraz = 2, dzielenie całkowite zaokrągla w dół)*,
- int reszta = a % b; (reszta = 1, ponieważ 5÷2 daje resztę 1)*.
- Złożone wyrażenia – w przypisaniach można korzystać z wcześniejszych wartości
zmiennych. Np. a = a + 1; zwiększa wartość zmiennej a o 1. Podobnie a = a * 2;
pomnoży bieżącą wartość a przez 2 i zapisze wynik ponownie w a. - Kolejność działań – C++ respektuje standardowe prawa kolejności operatorów
(najpierw mnożenie/dzielenie/modulo, potem dodawanie/odejmowanie). Można
używać nawiasów () w wyrażeniach, aby zmienić kolejność obliczeń lub poprawić
czytelność. - Konwersje typów – przy operacjach na zmiennych różnych typów może zachodzić
konwersja (np. int z double). W prostych obliczeniach typy całkowite i
zmiennoprzecinkowe można mieszać – wynik będzie promowany do typu o
większej precyzji (np. wyrażenie 5 + 2.5 zostanie obliczone jako typ double). W
razie potrzeby można też stosować rzutowanie typów, ale to temat na później.
Operatory w C++ (przegląd) - Operatory arytmetyczne: służą do wykonywania działań na liczbach. Należą do
nich: + (dodawanie), – (odejmowanie), * (mnożenie), / (dzielenie), % (modulo –
reszta z dzielenia, np. 23 % 7 = 2). - Operatory porównania (relacyjne): pozwalają porównać dwie wartości. Wynikiem
takiego porównania jest wartość logiczna true albo false. Do operatorów
porównania należą: == (równość – sprawdza czy lewa i prawa strona są sobie
równe), != (czy różne), > (więcej niż), < (mniej niż), >= (większe lub równe), <=
(mniejsze lub równe). Np. wyrażenie (x != 0) zwraca true, jeśli x nie jest zerem. - Operatory logiczne: umożliwiają łączenie warunków logicznych. Główne to: &&
(koniunkcja, logiczne AND – zwraca true, gdy oba warunki są spełnione), ||
(alternatywa, logiczne OR – true, gdy przynajmniej jeden z warunków jest
spełniony), ! (negacja, NOT – zwraca przeciwny stan logiczny, true zmienia na false
i vice versa). Przykład: (a > 0 && b > 0) jest true, gdy a i b są jednocześnie większe
od zera. - Operatory przypisania: służą do modyfikacji wartości zmiennej.. Podstawowy to =
(proste przypisanie wartości z prawej strony). Istnieją też operatory przypisania z
operacją, które skracają zapis: += (dodaj i przypisz), -= (odejmij i przypisz), *=
(pomnóż i przypisz), /= (podziel i przypisz) itp. Np. x += 5; jest równoważne x = x +
5; (zwiększy x o 5). Można w ten sposób wygodnie modyfikować bieżącą wartość
zmiennej. - Inne operatory: C++ udostępnia także szereg innych operatorów, np.
inkrementacji ++ (zwiększa wartość zmiennej o 1), dekrementacji — (zmniejsza o
1), operatory bitowe (&, |, ^, ~, przesunięcia bitowe <<, >>), operator warunkowy ?: i
wiele innych. Ich poznawanie następuje stopniowo – na początku warto opanować
powyższe podstawy, które są najczęściej używane.
