C++ - Kurs.pdf

(4442 KB) Pobierz
R00-05
Dedykacja
Książka ta jest dedykowana pamięci Davida Levine.
CzĘŚĆ 1.
Rozdział 1.
Zaczynamy
Wprowadzenie
Witamy w „C++ dla każdego.” Ten rozdział pomoże ci efektywnie programować w C++.
Dowiesz się z niego:
·
dlaczego C++ jest standardowym językiem tworzenia oprogramowania
·
Jakie kroki należy wykonać przy opracowaniu programu w C++
·
w jaki sposób wpisać, skompilować i zbudować swój pierwszy, działający
program w C++.
Krótka historia jĘzyka C++
Od czasu pierwszych komputerów elektronicznych, zbudowanych do wspomagania artyleryjskich
obliczeń trajektorii podczas drugiej wojny światowej, języki programowania przebyły długą drogę.
Na początku programiści używali najbardziej prymitywnych instrukcjami komputera: języka
1
maszynowego. Te instrukcje były zapisywane jako długie ciągi zer i jedynek. Dlatego wymyślono
tzw. asemblery, zamieniające instrukcje maszynowe na czytelne dla człowieka i łatwiejsze do
zapamiętania mnemoniki, takie jak ADD czy MOV.
Z czasem pojawiły się języki wyższego poziomu, takie jak BASIC czy COBOL. Te języki
umożliwiały stosowanie zapisu przypominającego słowa i zdania, np. LET I = 100. Te instrukcje
były tłumaczone przez interpretery i kompilatory na język maszynowy.
Interpreter tłumaczy odczytywany program, bezpośrednio zamieniając jego instrukcje (czyli kod)
na działania. Kompilator natomiast tłumaczy kod na pewną formę pośrednią. Ten proces jest
nazywany kompilacją; w jej wyniku otrzymujemy plik obiektowy. Następnie kompilator
wywołuje program łączący (tzw. linker), który zamienia plik obiektowy na program
wykonywalny.
Ponieważ interpretery odczytują kod programu bezpośrednio i wykonują go na bieżąco, są
łatwiejsze w użyciu dla programistów. Obecnie większość programów interpretowanych jest
nazywanych skryptami, zaś sam interpreter nosi nazwę Script Engine (w wolnym tłumaczeniu:
motor skryptu).
Niektóre języki, takie jak Visual Basic, nazywają interpreter biblioteką czasu działania. Java
nazywa swój interpreter maszynĄ wirtualnĄ (VM, Virtual Machine), jednak w pewnych
przypadkach taka maszyna wirtualna jest dostarczana przez przeglądarkę WWW (taką jak Internet
Explorer lub Netscape).
Kompilatory wymagają wprowadzenia dodatkowego kroku związanego z kompilowaniem kodu
źródłowego (czytelnego dla człowieka) na kod obiektowy (czytelny dla maszyny). Ten dodatkowy
krok jest dość niewygodny, ale dzięki niemu kompilowane programy działają bardzo szybko, gdyż
czasochłonne zadanie przetłumaczenia kodu źródłowego na język maszynowy jest wykonywane
tylko raz (podczas kompilacji) i nie jest już konieczne podczas działania programu.
Kolejną zaletą wielu języków kompilowanych (takich jak C++) jest posiadanie tylko programu
wykonywalnego (bez konieczności posiadania interpretera). W przypadku języka
interpretowanego, do uruchomienia programu konieczne jest posiadanie interpretera.
Przez wiele lat głównym celem programistów było uzyskanie niewielkich fragmentów szybko
działającego kodu. Programy musiały być niewielkie, gdyż pamięć była droga; musiały być także
szybkie, gdyż droga była również moc obliczeniowa. Gdy komputery stały się mniejsze, tańsze i
szybsze, a także gdy spadła cena pamięci, te priorytety uległy zmianie. Obecnie czas pracy
programisty jest dużo droższy niż koszty eksploatacji większości komputerów wykorzystywanych
w codziennej pracy. Teraz najważniejszy jest dobrze napisany, łatwy w konserwacji kod. Łatwość
konserwacji oznacza, że gdy zmienią się wymagania wobec działania programu, program można
zmienić i rozbudować, bez ponoszenia większych wydatków.
UWAGA Słowo „program” jest uŻywane w dwóch kontekstach: w odniesieniu do zestawu
poszczególnych instrukcji (kodu Źródłowego), tworzonego przez programistĘ oraz w odniesieniu
siĘ do całego programu przyjmujacego postaĆ pliku wykonywalnego. MoŻe to powodowaĆ
znaczne nieporozumienia, w zwiĄzku z czym bĘdziemy staraĆ siĘ dokonaĆ rozróŻnienia
pomiĘdzy kodem Źródłowym a plikiem wykonywalnym.
2
RozwiĄzywanie problemów
Problemy, które obecnie rozwiązują programiści, są zupełnie inne niż problemy rozwiązywane
dwadzieścia lat temu. W latach osiemdziesiątych programy były tworzone w celu zarządzania
dużymi ilościami nie poddanych obróbce danych danych. Zarówno osoby piszące kod, jak i osoby
korzystające z programów, zajmowały się komputerami profesjonalnie. Obecnie z komputerów
korzysta dużo osób, większość z nich ma niewielkie pojęcie o tym, jak działa program i komputer.
Komputery są narzędziem używanym przez ludzi do konkretnej pracy, a nie w celu dodatkowego
zmagania się z samym komputerem.
Można uważać za ironię, że wraz z pojawieniem się coraz łatwiejszych do opanowania przez ogół
użytkowników programów, tworzymy programy, które same w sobie stają się coraz bardziej
wymyślne i skomplikowane. Minęły już czasy wpisywania przez użytkownika tajemniczych
poleceń po znaku zachęty, które powodowały wyświetlenie strumienia nie przetworzonych
danych. Obecne programy korzystają z wymyślnych „przyjaznych interfejsów użytkownika”,
posiadających wiele okien, menu, okien dialogowych oraz innych elementów, które wszyscy
dobrze znamy.
Wraz z rozwojem sieci WWW, komputery wkroczyły w nową erę penetracji rynku; korzysta z nicj
więcej osób niż kiedykolwiek, a ich oczekiwania są bardzo duże. Przez kilka lat, jakie upłynęły od
czasu pierwszego wydania tej książki, programy stały się bardziej złożone, w związku z czym
powstało zapotrzebowanie na pomocne w ich opanowaniu techniki programistyczne.
Wraz ze zmianą wymagań dotyczących oprogramowania, zmieniły się także same języki i
technika pisania programów. Choć historia tych przemian jest fascynująca, w tej książce skupimy
się na transformacjach jakie nastąpiły w trakcie przejścia od programowania proceduralnego do
programowania obiektowego.
Programowanie proceduralne, strukturalne i
obiektowe
Do niedawna program był traktowany jako seria procedur, działających na danych. Procedura
(funkcja) jest zestawem specyficznych, wykonywanych jedna po drugiej instrukcji. Dane były
całkowicie odseparowane od procedur, zaś zadaniem programisty było zapamiętanie, która funkcja
wywołuje inne funkcje, oraz jakie dane były w wyniku tego zmieniane. W celu uniknięcia wielu
potencjalnych błędów opracowane zostało programowanie strukturalne.
Główną ideą programowania strukturalnego jest: „dziel i rządź.” Program komputerowy może być
uważany za zestaw zadań. Każde zadanie, które jest zbyt skomplikowane aby można było je łatwo
opisać, jest rozbijane na zestaw mniejszych zadań składowych, aż do momentu gdy, wszystkie
zadania są wystarczająco łatwe do zrozumienia.
Na przykład, obliczenie przeciętnej pensji przeciętnego pracownika przedsiębiorstwa jest dość
złożonym zadaniem. Można je jednak podzielić na następujące podzadania:
1. Obliczenie, ile zarabiają poszczególne osoby.
2. Policzenie ilości pracowników.
3
3. Zsumowanie wszystkich pensji.
4. Podzielenie tej sumy przez ilość pracowników.
Sumowanie pensji można podzielić na następujące kroki:
1. Odczytanie danych dotyczących każdego pracownika.
2. Odwołanie się do danych dotyczących pensji.
3. Dodanie pensji do naliczanej sumy.
4. Przejście do danych dotyczących następnego pracownika.
Z kolei, uzyskanie danych na temat pracownika można rozbić na:
1. Otwarcie pliku pracowników.
2. Przejście do właściwych danych.
3. Odczyt danych z dysku.
Programowanie strukturalne stanowi niezwykle efektywny sposób rozwiązywania złożonych
problemów. Jednak pod koniec lat osiemdziesiątych ograniczenia takiej metody programowania
objawiły się aż nazbyt jasno.
Po pierwsze, w trakcie tworzenia oprogramowania naturalnym dążeniem jest traktowanie danych
(na przykład danych pracownika) oraz tego, co można z nimi zrobić (sortować, modyfikować,
itd.), jako pojedynczej całości. Niestety, w programowaniu strukturalnym struktury danych są
oddzielone od manipulujących nimi funkcji, a w programie strukturalnym nie istnieje naturalny
sposób ich połączenia. Programowanie strukturalne jest często nazywane programowaniem
proceduralnym, gdyż skupia się na procedurach (a nie na „obiektach”).
Po drugie, programiści zmuszeni są wciąż wymyślać nowe rozwiązania starych problemów.
Czasem nazywa się to „wymyślaniem koła”; stanowi to przeciwieństwo „ponownego
wykorzystania.” Idea ponownego wykorzystania oznacza tworzenie komponentów, posiadających
znane wcześniej właściwości, które mogą być w miarę potrzeb dołączane do programu. Pomysł
został zapożyczony z rozwiązań sprzętowych — gdy inżynier potrzebuje nowego tranzystora,
zwykle nie musi go wymyślać — przegląda duże pudło z tranzystorami i wybiera ten, który
spełnia dane wymagania, ewentualnie tylko nieco go modyfikując. Inżynier oprogramowania nie
miał podobnej możliwości.
Na to zapotrzebowanie próbuje odpowiedzieć programowanie zorientowane obiektowo, dostarcza
ono technik zarządzania złożonymi elementami, umożliwia ponowne wykorzystanie
komponentów i łączy w logiczną całość dane oraz manipulujące nimi funkcje.
Zadaniem programowania zorientowanego obiektowo jest modelowanie „obiektów” (tzn. rzeczy),
a nie „danych.” Modelowanymi obiektami mogą być zarówno elementy na ekranie, takie jak
4
Zgłoś jeśli naruszono regulamin