c++.pdf

(5822 KB) Pobierz
Microsoft Word - !gotowy.DOC
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 .
ywali najbardziej prymitywnych instrukcjami komputera: j zyka
1
Na pocz tku programi ci u
7729845.001.png
maszynowego. Te instrukcje były zapisywane jako długie ci gi zer i jedynek. Dlatego wymy lono
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.
ł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
przypadkach taka maszyna wirtualna jest dostarczana przez przegl dark WWW (tak jak Internet
Explorer lub Netscape).
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
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
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
tzw. asemblery, zamieniaj ce instrukcje maszynowe na czytelne dla człowieka i łatwiejsze do
Poniewa interpretery odczytuj kod programu bezpo rednio i wykonuj go na bie co, s
nazywa swój interpreter maszyn wirtualn (VM, Virtual Machine), jednak w pewnych
Kompilatory wymagaj wprowadzenia dodatkowego kroku zwi zanego z kompilowaniem kodu
szybkie, gdy droga była równie moc obliczeniowa. Gdy komputery stały si mniejsze, ta sze i
poszczególnych instrukcji (kodu ródłowego), tworzonego przez programist oraz w odniesieniu
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
7729845.002.png
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
przyciski czy pola list, jak i obiekty wiata rzeczywistego, np. motocykle, samoloty, koty czy
woda.
Obiekty posiadaj charakterystyki (szybki, obszerny, czarny, mokry) oraz mo liwo ci
(przyspieszanie, latanie, mruczenie, bulgotanie). Zadaniem programowania zorientowanego
obiektowo jest reprezentacja tych obiektów w j zyku programowania.
C++ i programowanie zorientowane obiektowo
J zyk C++ wspiera programowanie zorientowane obiektowo, obejmuje swym działaniem trzy
podstawy takiego stylu programowania: kapsułkowanie, dziedziczenie oraz polimorfizm.
Kapsułkowanie
Gdy in ynier chce doda do tworzonego urz dzenia rezystor, zwykle nie buduje go samodzielnie
od pocz tku — podchodzi do pojemnika z rezystorami, sprawdza kolorowe paski, oznaczaj ce
wła ciwo ci, i wybiera potrzebny element. Z punktu widzenia in yniera rezystor jest „czarn
skrzynk ” — niewa ny jest sposób w jaki działa (o ile tylko zachowuje si zgodnie ze swoj
specyfikacj ). In ynier nie musi zastanawia si nad wn trzem rezystora, aby u y go w swoim
projekcie.
Wła ciwo samozawierania si jest nazywana kapsułkowaniem. W kapsułkowaniu mo emy
zakłada opcj ukrywania danych. Ukrywanie danych jest mo liwo ci , dzi ki której obiekt mo e
by u ywany przez osob nie posiadaj c wiedzy o tym, w jaki sposób działa. Skoro mo emy
korzysta z lodówki bez znajomo ci zasad działania kompresora, mo emy te u y dobrze
zaprojektowanego obiektu nie znaj c jego wewn trznych danych składowych.
Sytuacja wygl da podobnie, gdy z rezystora korzysta in ynier: nie musi wiedzie niczego o jego
wewn trznym stanie. Wszystkie wła ciwo ci rezystora s zakapsułkowane w obiekcie rezystora
(nie s rozrzucone po całym układzie elektronicznym). Do efektywnego korzystania z rezystora
nie jest potrzebna wiedza o sposobie jego działania. Mo na powiedzie , e jego dane s ukryte
wewn trz obudowy.
C++ wspiera kapsułkowanie poprzez tworzenie typów zdefiniowanych przez u ytkownika,
zwanych klasami. O tym, jak tworzy klasy, dowiesz si z rozdziału szóstego, „Programowanie
zorientowane obiektowo.” Po stworzeniu, dobrze zdefiniowana klasa działa jako spójna cało
jest u ywana jako jednostka. Wewn trzne działanie klasy powinno by ukryte. U ytkownicy
dobrze zdefiniowanych klas nie musz wiedzie , w jaki sposób one działaj ; musz jedynie
wiedzie , jak z nich korzysta .
Dziedziczenie i ponowne wykorzystanie
Gdy in ynierowie z Acme Motors chc zbudowa nowy samochód, maj do wyboru dwie
mo liwo ci: mog zacz od pocz tku lub zmodyfikowa istniej cy ju model. By mo e ich
model, Gwiazda, jest prawie doskonały, ale chc do niego doda turbodoładowanie i
sze ciobiegow skrzyni biegów. Główny in ynier nie chciałby zaczyna od pocz tku, zamiast
tego wolałby zbudowa nowy, podobny model, z tym dodatkowym wyposa eniem. Nowy model
5
Zgłoś jeśli naruszono regulamin