Obiekty i typy danych

Witaj w pierwszej lekcji kursu programowania w języku C++ :-) Tak właściwie to powinna być lekcja zerowa, bo Twój pierwszy w życiu program napiszemy wspólnie dopiero w następnej lekcji [a poza tym programiści liczą od zera ;-D]. Natomiast z lekcji, którą teraz czytasz, dowiesz się czym są obiekty i o co tyle szumu ;-J Dowiesz się także jakie typy danych są dostępne w języku C++ i poznasz pierwsze słowa kluczowe języka, będące nazwami tych typów. Tak więc dość gadania, bierzemy się za konkrety...

Co to jest obiekt?

Jak już pewnie wiesz z artykułu Dlaczego wybrać C++, język C++ wspomaga programowanie obiektowe, czyli pozwala Ci posługiwać się w Twoich programach tak zwanymi obiektami. Obiekt reprezentuje w Twoim programie pewien element ze świata rzeczywistego [modeluje go].

Pewnie coniektórzy old-schoolowcy mnie teraz zlinczują, że wprowadzam pojęcie obiektu już na tym etapie ;-P Jednak zrobiłem to celowo, żeby już od początku uczyć właściwego sposobu myślenia i programowania w języku C++. Z początku może się to wydawać dziwne, jednak szybko się okaże, że w tym szaleństwie jest logika i takie podejście bardzo ułatwia pisanie i rozumienie programów ;-)

W języku C++ obiekt to jest takie coś, co znajduje się gdzieś w pamięci komputera i zajmuje w niej pewien ciągły, jednolity obszar. Wiadomo dokładnie gdzie on się zaczyna i gdzie się kończy. Potrafimy go więc odróżnić od pozostałych połaci pamięci ;-J oraz ocenić, jak dużo tej pamięci zajmuje.

W tej pamięci obiekt może przechowywać jakieś dane. Bieżącą wartość przechowywaną w obiekcie nazywamy jego stanem. Obiekty mogą być zmienne lub stałe. Obiekty zmienne [zwane potocznie zmiennymi] mogą zmieniać swój stan w czasie działania programu, natomiast obiekty stałe [zwane potocznie stałymi] przez cały czas działania programu mają ten sam stan [przechowują tę samą wartość] i nie mogą go zmieniać.

Ale to oczywiście nie koniec. Na obiektach można też wykonywać pewne operacje. Jeśli jako przykład weźmiemy obiekty przechowujące liczby, to operacjami, jakie możemy na nich wykonywać, mogłyby być dodawanie, odejmowanie, mnożenie, dzielenie itp.

Typy danych

Oczywiście trzeba wiedzieć, co oznacza wartość przechowywana w obiekcie. Inaczej nie byłoby wiadomo, czy dany obiekt pamięta ładowność statku, ilość wody w zbiorniku czy temperaturę rdzenia reaktora atomowego :-P Nie muszę chyba mówić co by się stało, gdyby taki program naprawdę sterował reaktorem atomowym i przez przypadek pomyliłbyś sobie obiekty ;-P Dlatego każdy obiekt ma też swój typ, który określa rodzaj danych przechowywanych w obiekcie, zakres ich wartości, oraz jakie operacje można na tym obiekcie wykonywać.

Niektóre języki nie rozróżniają typów i całą odpowiedzialność za ich przestrzeganie zrzucają na programistę. W takich językach łatwiej jest popełnić błąd. Na szczęście kompilator języka C++ rozróżnia typy i pamięta je za Ciebie, dzięki czemu może kontrolować, czy używasz obiektów we właściwy sposób i zgodnie z ich przeznaczeniem ;-)

Typy wbudowane

Język C++ posiada kilka podstawowych typów, których możesz używać dla swoich obiektów. Są one nazywane typami wbudowanymi, w odróżnieniu od typów stworzonych przez programistę [Tak, w języku C++ możesz tworzyć własne, całkiem nowe typy danych :-) Cała druga część kursu będzie poświęcona temu zagadnieniu]. Istnieją nawet specjalne słowa kluczowe, służące jako nazwy typów wbudowanych.

Typy wbudowane odpowiadają podstawowym sposobom przechowywania danych w pamięci komputera. Dlatego ich rozmiary w pamięci są zależne od budowy komputera, dla którego kompilujesz swój program, oraz od używanego kompilatora. Postaram się omówić je w kolejności od najmniejszego do największego. Zaczniemy od typów do przechowywania liczb całkowitych.

Typy znakowe: char i wchar_t

Nie, to nie jest żadna pomyłka ;-) W komputerach znaki tekstu [litery, cyfry itp.] także są przechowywane jako liczby. Każdemu znakowi odpowiada jakiś liczbowy kod. Typ char został stworzony właśnie do przechowywania kodów znaków [char to skrót od ang. character, czyli znak tekstu]. Obiekt typu char musi mieć taki rozmiar, aby mógł przechować kod dowolnego znaku z podstawowego zestawu znaków danego komputera.

Standard C++ mówi, że obiekt typu char ma rozmiar równy 1 bajtowi. Jest tak z prostej przyczyny: bajt to najmniejsza "cegiełka", jaką da się zaadresować - rozmiar pojedynczej komórki pamięci. Standard nie precyzuje, z ilu bitów ma się składać taki bajt, ale wymaga, by miał ich conajmniej 8 [choć na niektórych maszynach może mieć więcej ;-)], więc spokojnie możesz zakładać, że obiekty typu char mogą przyjąć jedną z conajmniej 256 różnych wartości ;-) Rozmiary obiektów wszystkich pozostałych typów są wielokrotnością rozmiaru obiektu typu char, czyli bajtu.

Typ wchar_t służy do przechowywania kodów znaków z rozszerzonego zestawu znaków [zazwyczaj jest nim Unicode]. Obiekty tego typu zajmują zwykle więcej pamięci, niż obiekty typu char. Ta dziwna nazwa jest spadkiem po języku C i oznacza z angielskiego wide-character type, czyli typ dla znaków rozszerzonych.

Typ int i jego odmiany

Obiekty typu int służą do przechowywania liczb całkowitych [int to skrót od ang. integer, czyli liczba całkowita]. Mają taki rozmiar, jaki jest najwygodniejszy do obliczeń na liczbach całkowitych na danej maszynie. Zazwyczaj odpowiada on rozmiarowi słowa maszynowego, czyli zależy od wielkości wewnętrznych rejestrów mikroprocesora, dla którego kompilujesz.

Typ int ma dodatkowo dwie odmiany, różniące się rozmiarem i zakresem wartości. Pozwala to programiście [czyli Tobie ;-)] lepiej dostosować zajętość pamięci do swoich potrzeb ;-)

Pierwsza z nich to short int, lub w skrócie short [w ang. short znaczy krótki]. Standard C++ mówi, że obiekty tego typu mogą zajmować mniej pamięci, niż zwykły typ int, jednak nie mniej niż 16 bitów. Możesz więc mieć pewność, że pomieści jedną z conajmniej 65536 różnych wartości. Tego typu możesz użyć, jeśli chcesz zyskać trochę miejsca kosztem mniejszego zakresu wartości.

Druga odmiana to typ long int, lub w skrócie long [w ang. long znaczy długi]. Obiekt tego typu może zajmować w pamięci więcej miejsca, niż zwykły typ int. Dodatkowo Standard gwarantuje, że zajmie on conajmniej 32 bity, więc tego typu możesz użyć, gdy chcesz przechować jedną z conajmniej 4294967296 różnych wartości. [Oczywiście nie musisz tego wkuwać na pamięć! ;-D Wystarczy jeśli wiesz, że to około 4 miliardów ;-) A jeśli będziesz potrzebować dokładnej informacji, zawsze możesz zajrzeć na tą stronę :->]

Ze znakiem czy bez?

Do typów char i int można dodać przedrostek signed lub unsigned, który określa, czy chcesz używać liczb ujemnych. Przedrostek signed sprawia, że jeden z bitów jest poświęcany na znak liczby [ujemna/dodatnia]. Połowa zakresu liczb dodatnich zmieni się więc na liczby ujemne. Jeśli nie potrzebujesz liczb ujemnych, a chcesz za to zyskać dwa razy większy zakres na plusie, użyj przedrostka unsigned.

Jeśli nie podasz żadnego z tych przedrostków dla typu int, kompilator domyślnie zrozumie to jako typ signed int. Natomiast jeśli nie podasz żadnego przedrostka dla typu char, kompilator sam wybierze sposób przechowywania kodów znaków, który jest dla niego najwygodniejszy. Najlepiej więc zrobisz jeśli zostawisz tą decyzję właśnie jemu ;-) Pamiętaj tylko, że typy char, signed char i unsigned char to trzy różne typy, więc do przechowywania kodów znaków powinno się używać czystego typu char.

Typy dla liczb rzeczywistych

Liczby rzeczywiste są przechowywane w komputerach w specjalny sposób. Również obliczenia na nich są wykonywane inaczej, niż na liczbach całkowitych. Dlatego wymagają osobnych typów.

Najmniejszym z nich jest typ float [skrót od ang. floating point czyli płynny/zmienny przecinek. Nazwa wzięła się stąd, że podczas obliczeń rzecinek dziesiętny zmienia swoje położenie]. Obiekty tego typu zajmują 32 bity w pamięci i mają zakres od 3.4•10-38 do 3.4•1038. Dokładność tego typu powinna Ci wystarczyć w większości programów.

Jeśli jednak jesteś jakimś naukowcem i piszesz program do obliczeń matematycznych, precyzja typu float może Ci nie wystarczyć. Dlatego jest jeszcze typ double [od ang. double precision = podwójna dokładność]. Zajmuje 64 bity i służy do przechowywania liczb zmiennoprzecinkowych podwójnej precyzji, czyli od 1.7•10-308 do 1.7•10308. A dla megamózgów jest jeszcze typ long double. Zajmuje aż 80 bitów i ma zakres 3.4•10-4932 do 1.1•104932. Wątpię jednak, żeby kiedykolwiek były Ci potrzebne aż tak precyzyjne liczby, chyba że jesteś jakimś astrofizykiem :-P

Typ logiczny

W języku C++ istnieje też typ do przechowywania wartości logicznej. Nazywa się bool [jest to skrót od ang. boolean i nazwa ta pochodzi od George'a Boole'a - wynalazcy logiki matematycznej ;-)]. Obiekty typu bool mogą przyjmować tylko jedną z dwóch wartości: prawdę lub fałsz, oznaczanych odpowiednio słowami: true i false.

No, po tym krótkim wstępie wiesz już co to są obiekty i znasz nazwy podstawowych typów danych. Możemy więc przejść do lekcji drugiej, w której napiszemy wspólnie Twój pierwszy w życiu program w języku C++ :-)


Subskrybcja

Buttony
Button1 Button2 Button3 Button4 Button5 Button6 Button7 Dodaj swój button