C++ kurs programowania obiektowego (#3) pierwszy program, omówienie kodu

Co w trawie piszczy, czyli objaśnienie kodu programu "Hello world!".

No tak, wszystko fajnie ale skąd w zasadzie wzięły się te wszystkie linie kodu w pliku main.cpp w naszym pierwszym projekcie i co one oznaczają?

cpp c++ hello world code

Przy tworzeniu projektu Code::Blocks wyręcza nas i tworzy główny plik projektu z domyślną (default-ową) treścią, żeby programista sam nie musiał już „klepać” tego kodu od początku. A co oznaczają te poszczególne linie? Prześledźmy kod linia po linii. Wyjaśnienia do poszczególnych linii będę umieszczał w komentarzach, czyli za znakami „//” które w C++ oznaczają komentarz jednoliniowy. Znaczy to tyle, że wszystko co znajdzie się po prawej stronie tych znaków będzie komentarzem i do końca linii będzie pomijane przez kompilator, komputer to po prostu zignoruje np.

// treść komentarza

Code::Blocks oznacza komentarze na szaro. Z reguły komentarze w innych środowiskach są oznaczane na zielono, więc jeżeli spotkasz się z takim kolorem w innych IDE to nie będziesz już zdziwiony. Skoro jesteśmy już przy komentarzach i opisałem komentarz jednoliniowy to zapewne się domyślasz, że istnieje również komentarz wieloliniowy, do zdefiniowania którego używamy znaków /* treść komentarza */. Przykład komentarza wieloliniowego poniżej.

/* treść komentarza wiersz 1

treść komentarza wiersz 2

treść komentarza wiersz 3

treść komentarza wiersz 4

treść komentarza wiersz 5 */

 

Zgodnie z tym co napisałem powyżej wszystko co znajdzie się pomiędzy znakami  /**/ zostanie pominięte (zignorowane) przez kompilator. Tylko nadmienię, że ogólnie przyjęła się niepisana zasada, że komentarze umieszczamy nad kodem który komentujemy.

 

OK, przejdźmy do analizy kodu naszego pliku main.cpp.

// dodanie biblioteki iostream która jest odpowiedzialna za operacje wejścia/wyjścia
#include <iostream>              

Ale co to jest ta biblioteka i co to są operacje wejścia/wyjścia. Biblioteka w programowaniu to taki zbiór gotowych funkcji, takich podprogramów, które w każdym momencie możemy wykorzystać do własnych celów. To tak jak w bibliotece z książkami. Jeżeli potrzebujemy przeczytać jakąś książkę to idziemy do biblioteki wypożyczamy odpowiednią książkę, korzystamy z niej (czytamy) i odnosimy do z powrotem do biblioteki. Przy bibliotece programistycznej nie ma tylko „fizycznych” elementów wypożyczenia i oddania książki do biblioteki ale cała reszta jest identyczna. Jeżeli potrzebujemy, odwołujemy się do konkretnego podprogramu (funkcji) w bibliotece, korzystamy z niej i tyle. Nie musimy nawet wiedzieć jak jest skonstruowany środek tego podprogramu. Musimy tylko wiedzieć do czego służy i jak z niego skorzystać.

Żeby dodać bibliotekę do naszego programu używamy słówka include po którym umieszczamy nazwę dodawanej biblioteki pomiędzy znakami <> co oznacza, że kompilator będzie szukał tej biblioteki w standardowych bibliotekach Code::Blocks’a.

Operacje wejścia/wyjścia to nic innego jak mechanizm porozumiewania się z naszego komputera z urządzeniami wejścia, czyli np. klawiaturą i z urządzeniami wyjścia, czyli np. z monitorem. No przecież w jakiś sposób musimy powiedzieć naszemu komputerowi, że w danym momencie oczekujemy, że użytkownik napisze coś na klawiaturze (wprowadzi jakieś dane) i czekamy na to co on wpisze a w innym przypadku chcemy coś wyświetlić naszemu komputerowi. Ot cała filozofia.

 

// zdefiniowanie przestrzeni nazw
using namespace std;

O co chodzi z tymi przestrzeniami nazw. Wyobraźmy sobie, że mamy duży projekt i dołączyłeś do niego już kilka bibliotek z różnych źródeł. W pewnym momencie dochodzisz do sytuacji dublowania się nazw jakichś obiektów np. funkcji. Rozwiązaniem takiej sytuacji jest stworzenie przestrzeni nazw i umieszczenie wszystkich potrzebnych nam obiektów w tej przestrzeni. Następnie poprzez jej nazwę, możemy odwołać się do danego obiektu (np. funkcji) umieszczonego w tej przestrzeni i dzięki temu kompilator wie, że chcemy skorzystać właśnie z tej konkretnej funkcji (jeżeli jest kilka funkcji o tej samej nazwie w programie). Linia using namespace std;  oznacza, że w naszym programie będziemy korzystali z przestrzeni nazw o nazwie std. Ta przestrzeń zawiera wiele przydatnych elementów m.in. różne funkcje do sortowania, wyszukiwania lub definicje klas takich jak string, vector itd.

// główna funkcja programu
int main()
{

// ciało funkcji

return 0;

}

W końcu doszliśmy do pierwszej funkcji w naszym programie. Składnia powyżej to główna funkcja o nazwie main, która zawsze jest uruchamiana podczas startu programu, no bo przecież program musi wiedzieć z którego miejsca w kodzie ma wystartować. Na początku określamy co ma zwracać funkcja, czyli słówko int. Nie poznaliśmy jeszcze typów danych ale na razie wystarczy żebyś wiedział, że int oznacza liczbę całkowitą, czyli nasza funkcja powinna zwrócić jakąś liczbę całkowitą. Do określenie co zwraca funkcja, używamy słówka return. W tym momencie mówimy naszemu kompilatorowi, że zwracamy określoną wartość (w naszym przypadku wartość 0 bo u nas jest zapis return 0) i program się kończy. Dzięki nawiasom {} kompilator wie gdzie zaczyna się nasza funkcja, nawias { , i gdzie się kończy }. Wszystko co się znajduje wewnątrz naszych nawiasów tworzy ciało naszej funkcji, czyli polecenia do wykonania przez komputer. To tutaj będziemy pisali „główny” kod programu który będzie wykonywany przez komputer.

// funkcja cout służy do wyświetlania ciągów znaków na ekranie
cout << ”Hello world!” << endl ;

To funkcja z obiektowej biblioteki iostream pozwalająca nam na przesłanie na ekran dowolnego ciągu znaków, w naszym przypadku Hello world!. Zobacz jakie to proste, używasz jej nie widząc nawet jej środka. Słówka cout  i endl to odwołanie się do funkcji które znajdują się w bibliotece iostream i żebyśmy mogli odwołać się do nich musieliśmy na początku dodać tą bibliotekę poleceniem #include <iostream>. Ale żeby kompilator wiedział dokładnie o którą dokładnie funkcję chodzi musimy mu także wskazać że chodzi nam o przestrzeń nazw  std i zrobiliśmy to już wcześniej poleceniem using namespace std; Teraz już nie ma możliwości żeby kompilator pomylił funkcje. Gdybyśmy na początku nie zdefiniowali, że chcemy używać właśnie tej przestrzeni nazw (std), musielibyśmy przy każdym użyciu funkcji cout i endl (i każdej innej która należy do tej przestrzeni) określać o jaką przestrzeń nazw nam chodzi w ten sposób std::cout.

No to chyba już wszystko jasne i możemy przejść do kolejnego zagadnienia jakim będzie obiekt a później klasa.


c++ kurs programowania obiektowego spis treści  c++ kurs programowania obiektowego spis treścic++ kurs programowania obiektowego spis treści