2. Wbudowane typy danych

W języku C++ zmienne są deklarowane poprzez podanie typu zmiennej oraz nazwy zmiennej.

Pamięć operacyjna komputera, znana również jako RAM (ang. Random Access Memory), jest podzielona na komórki pamięci.  Każda jest identyfikowana unikalnym adresem. Każda komórka pamięci przechowuje określoną ilość danych. Zazwyczaj jest to jeden bajt (8 bitów). Każdy bajt może przechowywać liczbę od 0 do 255.

Bajt to podstawowa jednostka pamięci w komputerze, składająca się z 8 bitów.



Każda komórka pamięci przechowuje jeden bajt danych. Komórki pamięci są numerowane kolejnymi adresami, które identyfikują ich położenie w pamięci. Oczywiście korzystając z komórek pamięci możliwe jest zapisywanie większych liczb. W tym celu należy zająć więcej komórek pamięci. Posiadając wiedzę w jakich komórkach pamięci umieszczone są poszczególne elementy większej liczby możliwa jest realizacja w zasadzie każdej aplikacji. Taki sposób realizacji aplikacji wiązałby się z bardzo dużym obciążeniem po stronie programisty. W zasadzie trudno sobie wyobrazić realizację bardziej rozbudowanej aplikacji. Między innymi z tego powodu w językach wysokiego poziomu zdefiniowano typy danych, które są najczęściej stosowane. Są to tzw. typy wbudowane

Typy wbudowane danych zostały wprowadzone w językach programowania z kilku powodów, które związane są z różnymi aspektami programowania. O jednym aspekcie już wspominaliśmy na początku rozdziału tzn. zarządzanie pamięcią. Dzięki zastosowaniu typów danych możemy określić ile pamięci powinno zostać zarezerwowane dla zmiennej. Oczywiście różne typy danych zajmują różną ilość miejsca pamięci o czym powiemy nieco później. Dzięki temu kompilator posiada wiedzę, jaką ilość pamięci przydzielić każdej zmiennej oraz w jaki sposób przydzielić adresy dla różnych zmiennych. Ponadto zastosowanie typów pozwala zwiększyć wydajność. Kompilator znając typy zmiennych może dokonać optymalizacji kodu maszynowego, który powstaje w trakcie kompilacji. Różne typy danych mogą w trakcie realizacji programu wymagać różnych operacji na poziomie sprzętowym z tego powodu optymalizacja kodu maszynowego może być bardziej skuteczna, gdy posiadamy wiedze o typach poszczególnych zmiennych. Innym aspektem związanym z wykorzystaniem typów wbudowanych jest zabezpieczenie przed błędami związanymi z niezgodnością typów. Kompilator dzięki typom zmiennych może sprawdzić poprawność przypisania danych do zmiennych. Bezpieczeństwo typów zwiększa stabilność i niezawodność kodu. Zastosowanie typów danych wpływa także na czytelność kodu. Programista widząc deklarację zmiennej z określonym typem może łatwiej zrozumieć, jakie dane są przechowywane w zmiennej oraz jakie operacje mogą być na niej wykonywane. 

Język C++ jest statycznie typowanym językiem programowania. Oznacza to, że typy zmiennych są określane i sprawdzane w czasie kompilacji. Jest to cecha języków mocno typowanych. Jednocześnie należy podkreślić, że język C++ oferuje również mechanizmy rzutowania i wskaźników, które mogą obejść system typów. Możemy więc stwierdzić że język C++ łączy elementy zarówno mocnego, jak i słabego typowania, dając programistom dużą elastyczność. Jednocześnie wiąże się to z wymaganiem od programisty świadomego zarządzania typami i pamięcią. Należy także podkreślić, że nie wszystkie języki programowania są statycznie typowane. Przykładem języka, który jest dynamicznie typowanym jest język Python. Typy zmiennych są określane w nim w czasie wykonania programu, a nie w czasie kompilacji. Oczywiście z tego powodu język nie posiada wymienionych wyżej zalet. Posiada z kolei inne zalety. Jednak wróćmy do języka C++, który jest głównym bohaterem tego podręcznika.

Poznaliśmy już z jakiego powodu do języka C++ zostały wprowadzone wbudowane typy danych. Teraz przedstawimy jakie mamy typy wbudowane dostępne w języku C++.  Wszystkie typy podstawowe w C++ zamieszczono poniżej:

    • typ logiczny służy do przechowywania wartości logicznych (prawda, fałsz),
    • typy znakowe służą do przechowywania pojedynczych znaków,
    • typy całkowite służą do przechowywania liczb całkowitych,
    • typy zmiennopozycyjne służą do przechowywania liczb rzeczywistych,
    • typ void jest wykorzystywany do zaznaczenia braku informacji.

Każdy z wbudowanych (podstawowych) typów ma przypisaną określającą go nazwę predefiniowaną. 

Każda zmienna w języku C++ zanim zostanie użyta w aplikacji musi zostać zadeklarowana oraz zdefiniowana.

W języku C++ zmienne są deklarowane poprzez podanie typu zmiennej oraz nazwy zmiennej.

TYP_ZMIENNEJ NAZWA_ZMIENNEJ;
W podanej definicji deklaracja jest równocześnie definicją.
W języku C++ definicja oznacza przydzielenie miejsca na zadeklarowany obiekt. Powołuje do życia obiekt. 
Definicja zmiennej jest zawsze jednocześnie deklaracją zmiennej. Jeżeli jakaś zmienna jest już zdefiniowana, a my checmy tylko przypomnieć kompilatorowi o tym fakcie to możemy to zrobić przy wykorzystaniu słowa kluczowego extern. Informuje ono kompilator, że dana zmienna już gdzieś istnieje. Wywołanie mogłoby wyglądać w następujący sposób: 

extern TYP_ZMIENNEJ NAZWA_ZMIENNEJ;

W języku C++ nazwy zmiennych mogą być wybierane zgodnie z określonymi regułami dotyczącymi nazewnictwa. Możemy wymienić następujące ogólne zasady oraz cechy nazewnictwa zmiennych w  języku C++:

  • nazwa zmiennej może składać się z liter, cyfr i podkreślenia _,
  • nazwa zmiennej nie może zaczynać się od cyfry oraz zawierać spacji,
  • nie można używać znaków specjalnych, które mają znaczenie dla kompilatora i są używane do różnych celów, takich jak operatory arytmetyczne (+,-,*,/,% ), logiczne (==, !=, <,>,<=,>=,&,|,&&,||,!), przypisania (=, +=, -=,-=,*=,%=), znaki specjalne (;, :, ., , , (), {}, []) czy też określenie struktur oraz składni,
  • nazwy zmiennych nie mogą zawierać znaków spoza standardowego zestawu znaków ASCI, a więc nie mogą też zawierać polskich znaków,
  • rozróżniane są wielkości liter więc mojaZmienna, MojaZmienna i MOJAZMIENNA są traktowane jako różne nazwy,\
  • w teorii nie ma ograniczeń co do długości nazwy zmiennej, ale zaleca się używanie sensownych i zrozumiałych nazw, które ułatwiają czytanie i zrozumienie kodu.
Znamy już podstawowe zasady nazewnictwa zmiennych. Możemy także zaobserwować, że na końcu definicji, czy deklaracji zmiennej występuje znak średnika. 
W języku C++ każda instrukcja kończy się znakiem średnika ;
W języku C++ możemy także posługiwać się stałymi (ang. constants).  Są to wyrażeniami, których wartość nie może zostać zmieniona po zainicjalizowaniu. Stałe są używane do reprezentowania danych, których wartość nie powinna być zmieniana, na przykład wartości matematyczne, stałe fizyczne, identyfikatory, itp. 

Stałe w programie występują w dwu postaciach:

1. Jako wartości wpisane explicite wszędzie tam, gdzie są wykorzystywane (przykładowo w zapisie y = 2*x stałą jest liczba 2).
2. Jako wartości oznaczone nazwami i wcześniej zdefiniowane (przykładowo w zapisie y = A*x nazwa A może być stałą, o ile tylko wcześniej poinformowaliśmy o tym kompilator).

Stałe drugiego typu muszą zostać zdefiniowane w aplikacji przy pomocy słowa kluczowego const.
const double G = 9.807; // definicja stałej będącej liczbą rzeczywistą
const string AUTOR = "Mikołaj Srebrempisany"; // definicja stałej będącej napisem