r02.pdf

(245 KB) Pobierz
Szablon dla tlumaczy
Rozdział 2.
Anatomia programu C++
Programy C++ składają się z obiektów, funkcji, zmiennych i innych elementów. Większość tej
książki stanowi obszerny opis tych elementów, jednakże w celu zrozumienia zasad ich
współdziałania, musisz najpierw poznać cały działający program.
W tym rozdziale:
poznasz elementy programu C++,
dowiesz się, jak te elementy ze sobą współpracują,
dowiesz się, czym jest funkcja i do czego służy.
Prosty program
Nawet prosty program HELLO.cpp z rozdziału pierwszego, „Zaczynamy”, miał wiele
interesujących elementów. W tym podrozdziale omówimy go bardziej szczegółowo. Listing 2.1
przypomina treść programu HELLO.cpp z poprzedniego rozdziału.
Listing 2.1. HELLO.cpp demonstruje elementy programu C++
0: #include <iostream>
1:
2: int main()
3: {
4: std::cout << "Witaj Swiecie!\n";
5: return 0;
6: }
Wynik działania
Witaj Swiecie! 1
1 W środowisku programowania takim, jak np. Visual, pod napisem Witaj Swiecie! pojawi się
dodatkowo napis: Press any key to continue . Naciśnięcie jakiegokolwiek klawisza zamknie
działanie programu HELLO.exe i usunie z ekranu jego okno (ramkę). — przyp.redakcji.
Analiza:
W linii 0. do bieżącego pliku jest dołączany plik iostream .
Oto sposób jego działania: pierwszy znak jest symbolem # , który stanowi sygnał dla preprocesora.
Za każdym razem gdy uruchamiasz kompilację, uruchamiany jest preprocesor. Preprocesor
odczytuje kod źródłowy, wyszukując linii zaczynających się od znaku # (hasz) i operuje na nich
jeszcze przed uruchomieniem właściwego kompilatora. Preprocesor zostanie szczegółowo opisany
w rozdziale 21., „Co dalej.”
Polecenie #include jest instrukcją preprocesora, mówiącą mu: „Po mnie następuje nazwa pliku.
Znajdź ten plik i wstaw go w to miejsce.” Nawiasy kątowe dookoła nazwy pliku informują
preprocesor, by szukał pliku w standardowych miejscach dla tego typu plików. Jeśli twój
kompilator jest odpowiednio skonfigurowany, nawiasy kątowe powodują, że preprocesor szuka
pliku iostream w kartotece zawierającej wszystkie pliki nagłówkowe dostarczane wraz z
kompilatorem. Plik iostream (Input Output Stream — strumień wejścia-wyjścia) jest używany
przez obiekt cout , asystujący przy wypisywaniu tekstu na ekranie. Efektem działania linii 0. jest
wstawienie zawartości pliku iostream do kodu programu, tak jakby został on wpisany przez ciebie.
Preprocesor działa przed każdym rozpoczęciem kompilacji, poprzedzając jej właściwą fazę.
Ponadto zamienia wszystkie linie rozpoczynające się od znaku hasz ( # ) na specjalne polecenia,
przygotowując ostateczny kod źródłowy dla kompilatora.
Linia 2. rozpoczyna rzeczywisty program od funkcji o nazwie main() . Funkcję tę posiada każdy
program C++. Funkcja jest blokiem kodu wykonującym jedną lub więcej operacji. Zwykle funkcje
są wywoływane przez inne funkcje, lecz funkcja main() pod tym względem odbiega od standardu.
Gdy program rozpoczyna działanie, jest ona wywoływana automatycznie.
Funkcja main () , podobnie jak inne funkcje, musi określić rodzaj zwracanej przez siebie
wartości. Typem zwracanej przez nią w programie HELLO.cpp wartości jest typ int , to oznacza
że po zakończeniu działania funkcja ta zwraca systemowi operacyjnemu wartość całkowitą (ang.
integer ). W tym przypadku zwracaną wartością jest 0 , tak jak to widzimy w linii 5. Zwrócenie
wartości systemowi operacyjnemu jest stosunkowo mało ważną i rzadko wykorzystywaną
możliwością, ale standard C++ wymaga, by funkcja main() została zadeklarowana tak jak
pokazano.
UWAGA Niektóre kompilatory pozwalają na deklarację main() , jeśli funkcja main ma zwracać
typ void . Nie jest to zgodne ze standardem C++ i nie powinieneś się do tego przyzwyczajać.
Niech funkcja main() zwraca wartość typu int , zaś w ostatniej linii tej funkcji po prostu
zwracaj wartość 0 .
UWAGA Niektóre systemy operacyjne umożliwiają sprawdzanie (testowanie), jaka wartość
została zwrócona przez program. Zgodnie z konwencją, zwrócenie wartości 0 oznacza, że
program zakończył działanie normalnie.
Wszystkie funkcje rozpoczynają się od nawiasu otwierającego ( { ) i kończą nawiasem
zamykającym (}). Nawiasy dla funkcji main() znajdują się w liniach 3. i 6. Wszystko, co
znajduje się pomiędzy nawiasem otwierającym a zamykającym, jest uważane za treść funkcji.
Prawdziwa treść programu znajduje się w linii 4. Obiekt cout jest używany do wypisywania
komunikatów na ekranie. Obiektami zajmiemy się w rozdziale 6., „Programowanie zorientowane
obiektowo”, zaś obiekt cout i powiązany z nim obiekt cin omówimy szczegółowo w rozdziale
17., „Strumienie.” Te dwa obiekty, cin i cout , są w C++ używane, odpowiednio: do obsługi
wejścia (na przykład z klawiatury) oraz wyjścia (na przykład na ekran).
Obiekt cout jest dostarczany przez bibliotekę standardową. Biblioteka jest kolekcją klas.
Standardowa biblioteka jest standardową kolekcją dostarczaną wraz z każdym kompilatorem
zgodnym z ANSI.
Używając specyfikatora przestrzeni nazw, std , informujemy kompilator, że obiekt cout jest
częścią biblioteki standardowej. Ponieważ możesz mieć kilka, pochodzących od różnych
dostawców, obiektów o tych samych nazwach, C++ dzieli „świat” na „przestrzenie nazw”.
Przestrzeń nazw jest sposobem na powiedzenie, że: „gdy mówię cout , mam na myśli to, że cout
jest częścią standardowej przestrzeni nazw, a nie jakiejś innej przestrzeni nazw.” Mówimy to
kompilatorowi poprzez umieszczenie przed nazwą cout znaków sdt i podwójnego dwukropka.
Więcej na temat różnych przestrzeni nazw powiemy w następnych rozdziałach.
Oto sposób użycia obiektu cout : wpisz słowo cout , a po nim operator przekierowania wyjścia
( << ). To, co następuje po operatorze przekierowania wyjścia, zostanie wypisane na ekranie. Jeśli
chcesz, by został wypisany łańcuch znaków, pamiętaj o ujęciu go w cudzysłowy (tak jak widzimy
w linii 4.)
Łańcuch tekstowy jest serią znaków drukowalnych.
Dwa ostatnie znaki, \n , informują obiekt cout , by po słowach „Witaj Świecie!” umieścił nową
linię. Ten specjalny kod zostanie opisany szczegółowo podczas omawiania obiektu cout w
rozdziale 18., „Przestrzenie nazw.”
Funkcja main() kończy się w linii 6. nawiasem zamykającym.
Rzut oka na klasę cout
W rozdziale 17. zobaczysz, w jaki sposób używa się obiektu cout do wypisywania danych na
ekranie. Na razie możesz z niego korzystać, nie wiedząc, jak działa. Aby wypisać wartość na
ekranie, napisz słowo cout , po nim operator wstawiania ( << ), uzyskiwany w wyniku
dwukrotnego wpisania znaku mniejszości ( < ). Choć w rzeczywistości są to dwa znaki, C++
traktuje je jako pojedynczy symbol.
Po znaku wstawiania wpisz przeznaczone do wypisania dane. Listing 2.2 ilustruje sposób użycia
tego obiektu. Wpisz w tym przykładzie dokładnie to, co pokazano na listingu, z tym, że zamiast
nazwiska Jesse Liberty wpisz swoje własne (chyba, że rzeczywiście nazywasz się Jesse Liberty ).
Listing 2.2. Użycie cout
0: // Listing 2.2 użycie std::cout
1: #include <iostream>
2: int main()
3: {
4: std::cout << "Hej tam.\n";
5: std::cout << "To jest 5: " << 5 << "\n";
6: std::cout << "Manipulator std::endl ";
7: std::cout << "wypisuje nowa linie na ekranie.";
8: std::cout << std::endl;
9: std::cout << "To jest bardzo duza liczba:\t" << 70000;
10: std::cout << std::endl;
11: std::cout << "To jest suma 8 i 5:\t";
12: std::cout << 8+5 << std::endl;
13: std::cout << "To jest ulamek:\t\t";
14: std::cout << (float) 5/8 << std::endl;
15: std::cout << "I bardzo, bardzo duza liczba:\t";
16: std::cout << (double) 7000 * 7000 << std::endl;
17: std::cout << "Nie zapomnij zamienic Jesse Liberty ";
18: std::cout << "na swoje nazwisko...\n";
19: std::cout << "Jesse Liberty jest programista C++!\n";
20: return 0;
21: }
Wynik działania
Hej tam.
To jest 5: 5
Manipulator std::endl wypisuje nowa linie na ekranie.
To jest bardzo duza liczba: 70000
To jest suma 8 i 5: 13
To jest ulamek: 0.625
I bardzo, bardzo duza liczba: 4.9e+007
Nie zapomnij zamienic Jesse Liberty na swoje nazwisko...
Jesse Liberty jest programista C++!
UWAGA Niektóre kompilatory zawierają błąd; przed przekazaniem sumy do obiektu cout
należy umieścić ją w nawiasach. Tak więc linia 12. powinna być zmieniona na:
12 std::cout << (8+5) << std::endl;
Analiza:
W linii 1., instrukcja #include <iostream> powoduje włączenie zawartości pliku iostream do
kodu źródłowego. Jest ona wymagana, jeśli używasz obiektu cout i powiązanych z nim funkcji.
W linii 4. znajduje się najprostsze zastosowanie obiektu cout , do wypisania ciągu znaków.
Symbol \n jest specjalnym znakiem formatującym. Informuje on cout by wypisał na ekranie znak
nowej linii (tzn. aby dalsze wypisywanie rozpoczął od następnej linii ekranu).
W linii 5. przekazujemy do cout trzy wartości, oddzielone operatorem wstawiania. Pierwszą z
tych wartości jest łańcuch "To jest 5: " . Zwróć uwagę na odstęp po dwukropku. Ten odstęp
(spacja) jest częścią łańcucha. Następnie do operatora wstawiania jest przekazywana wartość 5
oraz znak nowej linii (zawsze w cudzysłowach lub apostrofach), co powoduje wypisanie na
ekranie linii
To jest 5: 5
Ponieważ po pierwszym łańcuchu nie występuje znak nowej linii, następna wartość jest
wypisywana tuż za nim. Nazywa się to konkatenacją (łączeniem) dwóch wartości.
W linii 6. wypisywany jest komunikat informacyjny, po czym (w linii 8.) użyty zostaje
manipulator endl . Przeznaczeniem endl jest wypisanie nowej linii na ekranie. (Inne
zastosowania dla endl zostaną omówione w rozdziale 16.). Zwróć uwagę, że endl także
pochodzi z biblioteki standardowej.
UWAGA endl pochodzi od słów „end line” (zakończ linię) i w rzeczywistości jest to „end-L”, a
nie „end-jeden”.
W linii 9. został wprowadzony nowy znak formatujący, \t . Powoduje on wstawienie znaku
tabulacji i jest używany w celu wyrównywania wydruków wyników w liniach od 9. do 15. Linia 9.
pokazuje, że wypisywane mogą być nie tylko liczby całkowite, ale także długie liczby całkowite.
Linia 12. demonstruje, że cout potrafi wykonać proste dodawanie. Do obiektu jest przekazywana
wartość 8+5 , lecz wypisywana jest suma 13.
W linii 14. do cout jest wstawiana wartość 5/8 . Symbol (float) informuje cout , że chcemy
aby ta wartość została obliczona jako rozwinięcie dziesiętne, więc wypisywany jest ułamek. W
linii 16. cout otrzymuje wartość 7000 * 7000 , zaś symbol (double) służy do poinformowania
cout , że jest to wartość zmiennoprzecinkowa. Wszystko to zostanie wyjaśnione w rozdziale 3.,
„Zmienne i stałe,” przy okazji omawiania typów danych.
W linii 16. podstawiłeś swoje nazwisko, zaś wynik potwierdza, że naprawdę jesteś programistą
C++. Musi być to prawda, skoro tak uważa komputer!
Używanie przestrzeni nazw standardowych
Z pewnością zauważyłeś, że przed każdym cout i endl występuje std:: , co po jakimś czasie
może być irytujące. Choć korzystanie z odnośnika do przestrzeni nazw jest poprawne, jednak
okazuje się dosyć żmudne przy wpisywaniu. Standard ANSI oferuje dwa rozwiązania tego
niewielkiego problemu.
Pierwszym z nich jest poinformowanie kompilatora (na początku listingu kodu) że będziemy
używać cout i endl z biblioteki standardowej, tak jak pokazano na listingu 2.3.
Listing 2.3. Użycie słowa kluczowego using
0: // Listing 2.3 - użycie słowa kluczowego "using"
1: #include <iostream>
2: int main()
3: {
Zgłoś jeśli naruszono regulamin