Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected]PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE C++Builder. Kompendium programisty Autor: Andrzej Daniluk ISBN: 83-7361-028-6 Format: B5, stron: 496 Jêzyk C++ od czasu jego zdefiniowania przez Bjarne Stroustrupa by³ kilkakrotnie uaktualniany w latach 80. i 90. XX wieku. Chocia¿ C++Builder nie jest dok³adnym odzwierciedleniem standardu ANSI jêzyka C++, to obecna jego wersja przygotowana przez firmê Borland jest stabilna i zgodna z oczekiwaniami programistów. Borland C++Builder stanowi po³¹czenie nowoczesnego jêzyka programowania, jakim jest C++, biblioteki komponentów wizualnych VCL/CLX oraz zintegrowanego rodowiska programisty IDE. „C++Builder. Kompendium programisty” omawia podstawy programowania w C++ ze szczególnym uwzglêdnieniem mo¿liwoci oferowanych przez kompilator Borland C++Builder. Poznasz wiêc nie tylko sam jêzyk, ale nauczysz siê pisaæ w nim wydajne i przenone aplikacje, dzia³aj¹ce zarówno w rodowisku linuksowym, jak i w Windows. Omówione zagadnienia obejmuj¹: • Opis zintegrowanego rodowiska programisty C++Buildera • Podstawy jêzyka C++ • Wczesne oraz póne wi¹zanie — wstêp do programowania zorientowanego obiektowo • Mo¿liwoci C++Buildera w zakresie pos³ugiwania siê tablicami ró¿nego typu • Zaawansowane operatory rzutowania typów • Informacje czasu wykonania • Obs³ugê wyj¹tków • Obs³ugê plików • £añcuchy ANSI • Zmienne o typie modyfikowalnym w czasie wykonywania programu • Funkcje FPU i systemowe • Elementy wielow¹tkowoci — wykorzystanie C++ oraz C++Buildera w nowoczesnych, wielow¹tkowych systemach operacyjnych • Liczby pseudolosowe i konwersje wielkoci liczbowych • Wprowadzenie do grafiki • Komponentowy model C++Buildera i biblioteki DLL • Biblioteka CLX -- projektowanie aplikacji przenonych pomiêdzy systemami operacyjnymi Windows i Linux
16
Embed
PRZYK ADOWY ROZDZIA SPIS TRE CI C++Builder … · C++Builder. Kompendium programisty Autor: Andrzej Daniluk ... Oprócz tradycyjnych operatorów rzutowania typów zaczerpniętych
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
O Autorze ........................................................................................................................................................ 12
Rozdział 1. Środowisko programisty IDE Borland C++Builder ...................................................................... 13Struktura głównego menu .................................................................................................15
Menu File ....................................................................................................................16
Menu Edit....................................................................................................................18
Menu Search ...............................................................................................................21
Pasek narzędzi — Speed Bar ............................................................................................34
Inspektor obiektów — Object Inspector .....................................................................35
Widok drzewa obiektów — Object Tree View...........................................................36
Ogólna postać programu pisanego w C++ ........................................................................37
Kategorie typów danych....................................................................................................56Podstawowe proste typy całkowite i rzeczywiste .............................................................56
Typ int .........................................................................................................................56Typ double ..................................................................................................................57
Modyfikatory typów..........................................................................................................58Typy danych Windows......................................................................................................59Typ Currency.....................................................................................................................60Typ void ............................................................................................................................61Typy logiczne....................................................................................................................61Typy znakowe ...................................................................................................................61Typy łańcuchowe ..............................................................................................................62Modyfikatory dostępu const i volatile...............................................................................63Specyfikatory klas pamięci ...............................................................................................63
Instrukcja warunkowa if…else ...................................................................................72Instrukcja wyboru switch…case…break ....................................................................73Instrukcja for...............................................................................................................74Nieskończona pętla for ...............................................................................................75Instrukcja iteracyjna do…while..................................................................................76Instrukcja iteracyjna while ..........................................................................................77Instrukcja przerwania wykonywania pętli break ........................................................78Funkcja przerwania programu exit()...........................................................................78Funkcja przerwania programu abort() ........................................................................79Instrukcja kontynuacji programu continue .................................................................79
Funkcje w C++..................................................................................................................80Rekurencja ..................................................................................................................81Funkcje przeładowywane............................................................................................83Niejednoznaczność .....................................................................................................85Konwencje wywoływania funkcji...............................................................................86Specyfikatory konsolidacji funkcji .............................................................................87
Wskazania i adresy............................................................................................................88Operatory wskaźnikowe..............................................................................................90Wskaźniki i tablice......................................................................................................90Wielokrotne operacje pośrednie .................................................................................92Operatory new i delete ................................................................................................94Dereferencja wskaźnika ..............................................................................................95Wskaźniki ze słowem kluczowym const ....................................................................96Wskaźniki do funkcji ..................................................................................................97
Rozdział 3. Wczesne oraz późne wiązanie ................................................................................................................161Odwołania i wskaźniki do klas pochodnych ...................................................................161
Funkcje wirtualne w C++................................................................................................163
Wirtualne klasy bazowe ..................................................................................................167
Funkcje wirtualne w C++Builderze ................................................................................170
Klasy abstrakcyjne w stylu biblioteki VCL ....................................................................173
Rozdział 10. Zmienne o typie modyfikowalnym w czasie wykonywania programu .............................303Struktura TVarData .........................................................................................................303
Klasa TCustomVariantType............................................................................................307
Rozdział 11. Funkcje FPU i systemowe..................................................................................................................... 323Funkcje FPU....................................................................................................................323
Struktura SYSTEM_INFO..............................................................................................329
Klasa THeapStatus ..........................................................................................................332
Rozdział 12. Elementy wielowątkowości .................................................................................................................. 339Wątki i procesy................................................................................................................339
Rozdział 13. Liczby pseudolosowe................................................................................................................................ 363Funkcje randomize() i random() .....................................................................................364
Losowanie z powtórzeniami............................................................................................368
Losowanie bez powtórzeń...............................................................................................371
Generatory częściowo uporządkowane...........................................................................377
Rozdział 15. Wprowadzenie do grafiki .......................................................................................................................411Barwne modele................................................................................................................412
Rozdział 16. Komponentowy model C++Buildera..................................................................................................431Tworzymy nowy komponent ..........................................................................................431
Modyfikacja istniejącego komponentu z biblioteki VCL/CLX ......................................437
Rozdział 18. Biblioteka CLX..........................................................................................................................................463Zmiany w bibliotece uruchomieniowej...........................................................................463
Pliki i katalogi .................................................................................................................465
rzutowania typówOprócz tradycyjnych operatorów rzutowania typów zaczerpniętych z języka C, w C++ zdefi-niowano dodatkowo cztery operatory rzutowania typów o nazwach: �����������, ����������, ��������� oraz � �� ��� ������. Ogólne postaci omawianych operatorów wyglądająnastępująco:
Słowo ��� oznacza docelowy typ rzutowania, zaś ��� (argument) — obiekt, któremu przypi-sujemy nowy typ danych.
Operator static_castOperator ����������� wykonuje tzw. rzutowanie niepolimorficzne, co między innymi oznaczamożliwość wykonania każdej standardowej konwersji typów bez konieczności sprawdzania jejpoprawności.
Jako prosty przykład wykonania niepolimorficznego rzutowania typów rozpatrzymy prostąfunkcję typu �� z argumentem typu �����, której jedynym celem będzie zamiana małej literyna dużą. Ponieważ dane typu ����� nie mogą wskazywać na konkretne obiekty, należy wyko-rzystać odpowiedni operator rzutowania typów, tak jak pokazano to na listingu 5.1, gdzie przed-stawiono kod głównego modułu projektu Projekt_R5_01.bpr.
200 C++Builder. Kompendium programisty
W omawianym przykładzie dzięki operatorowi ����������� uzyskamy wskaźnik � � do typu�� w funkcji ��������� ze wskaźnika � �� � do zupełnie innego typu bazowego będącego jejargumentem.
Listing 5.1. Rzutowanie wskaźnika i jego dereferencja
Powtórne wykorzystanie operatora dostępu pośredniego � wraz z parametrem aktualnym funk-cji ����� ��� oznacza w praktyce dereferencję wskaźnika � �, gdyż parametrami funkcji ������ ��� nie mogą być dane wskazujące.
Operator dynamic_castOperator ���������� wykonuje rzutowanie czasu wykonywania, co oznacza, iż poprawnośćtej operacji zawsze sprawdzania jest w trakcie działania programu. W przypadku, gdy operacjarzutowania typów nie jest możliwa do zrealizowania, całość wyrażenia, w którym występujeomawiany operator, przyjmuje wartość zerową.
Ponieważ operator ���������� wykonuje rzutowanie czasu wykonywania, należy go używaćgłównie do przekształcania typów polimorficznych. Oznacza to, iż np. w przypadku, gdy pewnaklasa polimorficzna ������� jest klasą potomną innej klasy polimorficznej ������, to, posłu-gując się operatorem ����������, zawsze można przekształcić wskaźnik �� do typu �������na wskaźnik �� do typu ������.
Jako przykład rozpatrzmy klasę abstrakcyjną � ���� oraz dziedziczące po niej dwie klasypolimorficzne ����� oraz ���. W klasie bazowej � ���� zadeklarujemy czystą funkcją wirtu-alną ������, której kolejne implementacje zostaną umieszczone w polimorficznych klasachpochodnych, tak jak pokazano to na listingu 5.2.
Listing 5.2. Kod modułu R5_02.h zawierającego definicje klas Vehicle, Lorry oraz Tir
W funkcji obsługi zdarzenia ������ ���!�� w głównym module Unit_R5_02.cpp projektuProjekt_R5_02.bpr zadeklarujemy dwa egzemplarze klasy ����� oraz jeden klasy ���. Następ-nie zainicjujemy odpowiednimi wartościami tablicę wskaźników �� do klasy � ���� ogólniereprezentującej pojazdy. Pojazdy zwane ciężarówkami odszukamy, wykonując w pętli "����operację polimorficznego rzutowania typu � ���� reprezentowanego przez kolejne elementytablicy wskaźników � na typ �����, tak jak pokazano to na listingu 5.3.
Listing 5.3. Kod źródłowy głównego modułu Unit_R5_02.cpp projektu Projekt_R5_02.bpr
Śledząc powyższe zapisy, musimy zauważyć, iż użycie operatora ���������� pozwoliło na od-szukanie wszystkich istniejących wskaźników do klasy reprezentującej ciężarówki. W przypadku,gdy wartość wyrażenia:
B����#���-�������������B���#� ?G�H�&
będzie równa zeru (przyjmie wartość fałszywą), oznaczać to będzie, iż operacja rzutowania niejest możliwa do przeprowadzenia. Fakt ten nie powinien nas zbytnio dziwić chociażby z tegowzględu, że pojazdy zwane ciężarówkami nie zawsze są popularnymi „tirami”, zaś „tiry” z regułybywają ciężarówkami, co widoczne jest w działaniu naszej aplikacji pokazanej na rysunku 5.1oraz co zostało wyraźnie określone w hierarchii klas przedstawionych w listingu 5.2.
Rysunek 5.1. Rezultat wykonania aplikacji projektu Projekt_R5_02.bpr
Operator const_castOperator ten wykorzystywany jest głównie w celu przedefiniowywania danych ze specyfika-torami ���� oraz ������� oraz w celu zmiany atrybutu ���� wybranej zmiennej. Stosującoperator ���������, należy pamiętać, iż typ docelowy modyfikowanej zmiennej musi odpo-wiadać jej typowi bazowemu. Na listingu 5.4 zaprezentowano kod źródłowy głównego modułuprojektu Projekt_R5_03.bpr, gdzie zdefiniowano klasę ������ z funkcją składową "�����określoną za pomocą atrybutu ���� oraz przeładowaną względem "����� funkcję "��#��.
Listing 5.4. Przykład praktycznego wykorzystania operatora const_cast
Wynik działania programu bez przedefiniowania specyfikatora ���� operatorem ���������w trakcie wywołania funkcji "����� oraz z przedefiniowaniem specyfikatora ���� w funkcji"����� pokazany jest odpowiednio na rysunkach 5.2 i 5.3.
Rysunek 5.2. Rezultat wykonania aplikacji projektu Projekt_R5_03.bpr bez przedefiniowania specyfikatora const
w czasie wywołania funkcji func1()
Rysunek 5.3. Rezultat wykonania aplikacji projektu Projekt_R5_03.bpr z jawnym przedefiniowaniem specyfikatora
const podczas wywołania funkcji func1()
Łatwo sprawdzić, iż poprzez prosty zabieg polegający na przedefiniowaniu operatorem ��������� atrybutu ���� funkcji "����� możliwe stało się bezpośrednie uzyskanie wartości po-wrotnych tej funkcji każdorazowo wywołanych w programie głównym z różnymi parametramiaktualnymi.
Operator reinterpret_castNazwa omawianego operatora rzutowania typów w dosłownym znaczeniu tego słowa odpowiadafunkcji, jaką może on pełnić w programie. Operator � �� ��� ������ pozwala na przypisa-nie wybranej zmiennej zupełnie innego typu w porównaniu z jej typem aktualnym włącznie
206 C++Builder. Kompendium programisty
z możliwością rzutowania niezgodnych typów wskaźników. Na listingu 5.5 zamieszczonoprzykład wykorzystania operatora � �� ��� ������ w celu zamiany wskaźnika ����$� na typzmiennej całkowitej ��.
Listing 5.5. Kod modułu Unit_R5_04.cpp projektu Projekt_R5_04.bpr jako przykład praktycznego wykorzystania
Łańcuch znaków, do którego chcemy uzyskać wskaźnik, wpisywany jest w komponencie edycyj-nym %����. Rozmiar zaznaczonych w jego obszarze znaków ustalany jest za pomocą własności:
do stworzonego uprzednio dynamicznego bufora danych ��"" �, którego zawartość zostanieumieszczona we własności � &� komponentu %����. W komponencie edycyjnym ' �� zostaniewyświetlony efekt rzutowania na typ całkowity wskaźnika do łańcucha znaków umieszczonegow buforze.
PodsumowanieObecny rozdział poświecony był omówieniu czterech zdefiniowanych w C++ operatorów rzu-towania typów. Używanie niektórych z nich w większości prostych aplikacji może wydawać sięczynnością mało przydatną, jednak w programach bardziej zaawansowanych, w których należywykonywać specyficzne operacje rzutowania typów, umiejętność posługiwania się tymi ope-ratorami jest trudna do przecenienia. Kompletne kody źródłowe aplikacji będących ilustracjąporuszanych w tym rozdziale zagadnień można znaleźć na dołączonej do książki płycie CDw katalogu R05\.