funkcje wykonujące te same operacje...
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- Operator /;Operatory arytmetyczne;Priorytet operatorów w języku Visual Basic;Podział operatorów ze względu na funkcjonalność...
- Rozwj fizyczny, jako proces irnian somatycznycH (anatomicznych) i funkcjonalnych (fizjologicznych) w organizmie, stwarza podstawy dla rozwoju motoryki...
- zobowi za wobec pracowników (gdy wynagrodzenia s płacone „z dołu”), zobowi za wobec dostawców, wynikaj cych z operacyjnego (manipulacyjnego) odroczenia...
- funkcjonowanie wychowawcze rodziny, wskazując na dezorganizację rycia rodzinnego,dezintegrację rociziny, "zastępowanie" przez telewizję rodziców w...
- abW dolnej cze˛sći rysunku 1 została nakresĺona funkcja produkcji f(L), gdzieL oznacza liczbe˛ zatrudnionych i gdzie zaso´b kapitału jest dany, z...
- mentarzami do konkretnych faktów manipulacji doświadczanych przez pewne instytucje alboteż opierają się na fachowej analizie funkcjonujących w Polsce mass...
- Kiedy Canan przejął zarządzanie codziennymi operacjami magazynu, Lovejoy jeszcze bardziej skupił swą uwagą na rekrutacji, sprowadzając ostatecznie jeszcze...
- Jak funkcjonuje zapora ogniowa przy udostêpnionym po³¹czeniu internetowym? Je¿eli program Norton Internet Security jest zainstalowany na komputerze...
- - Czy ta sytuacja nie skłaniała Pana do przyspieszenia swego odejścia?- W Pieszczanach byłem o krok od napisania rezygnacji z mych funkcji...
- Dariusz Zającswoistą filozofią życia i edukacji, odrzuca koncepcję człowieka, w której funkcjonują takie pojęcia jak m...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
Ćwiczenie 2.13.
Postaraj się zmodyfikować Projekt_08.bpr w taki sposób, aby bazował na pewnej klasie wykorzystującej omawiane funkcje.
Niejednoznaczność
Polimorfizm, którego przykładem jest możliwość przeładowywania funkcji, stanowi jedną z wielkich zalet obiektowego języka C++, jednak również niesie ze sobą (szczególnie dla mniej doświadczonych programistów) pewne pułapki. Jedną z nich jest niejednoznaczność. Głównym źródłem niejednoznaczności w C++ są automatyczne konwersje typów. Uważny Czytelnik na pewno spostrzegł, w jaki sposób w programie przedstawionym na wydruku 2.8 wywoływane są funkcje należące do swoich prototypów:
34
C++Builder 6. Ćwiczenia
5 E6 99
( <& <&! ==
'W < 5'6
99 55R 5
oraz:
5 E6 99
( <& <&! ==
'+W < 5'+6 =!!
99 55R 5
Funkcja - została przeładowana w taki sposób, że może pobierać argumenty w postaci par liczb typu , oraz , . Pierwsza instruk-
cja wywołania funkcji - będzie jednoznaczna, gdyż nie musi występować żadna
konwersja danych pomiędzy jej parametrami formalnymi i aktualnymi. Rozpatrzmy przy-
padek, gdy funkcja - wywoływana jest z parametrem typu całkowitego
, będącego typem zmiennej sterującej w pętli +, zaś jednym z jej parametrów
formalnych (zdeklarowanym w jej prototypie) jest zmienna typu . W takiej sytuacji kompilator „nie wie”, czy zmienną taką przekształcić na typ , czy
. Jeżeli wywołalibyśmy funkcję w programie w sposób następujący:
( <& <&! ==
'+W < 5'+6
99 RF 55R 5
możemy spodziewać się wystąpienia przykrego komunikatu kompilatora:
.X== B/ 4 !0&+$ B'!&+ T 5 M5 6 M
M56 M
Aby uniknąć tego typu dwuznaczności, często uciekamy się do pewnego fortelu. Mianowicie wystarczy do liczby deklarowanej jako całkowita dodać wartość , aby kompilator do-
konał jej automatycznej konwersji na typ zmiennopozycyjny.
Funkcje ogólne
Funkcjami ogólnymi posługujemy się w sytuacjach, w których wymagamy, aby definicja
danej funkcji zawierała całość operacji wykonywanych na danych różnych typów. Funkcję ogólną tworzymy przy pomocy słowa kluczowego (szablon). Jego intuicyjne
znaczenie jest bardzo trafne — szablon służy do ogólnego opisu działań wykonywanych
przez daną funkcję, zaś dalszymi szczegółami powinien zająć się już sam kompilator C++. Szkielet definicji funkcji ogólnej rozpoczyna się właśnie od słowa :
G GO5 A52%J S5
99 %J
"
Rozdział 2. C++ w pigułce
35
Ćwiczenie 2.14.
Jak zapewne wiesz, jedną z właściwości języków C i C++ jest to, iż wszystkie argumenty funkcji przekazywane są przez wartość. Wynika z tego, że wywoływana funkcja otrzymuje wartości swoich argumentów, a nie ich adresy. Można oczywiście spowodować, aby funkcja zmieniała wartości zmiennych w funkcji wywołującej. W tym celu funkcja wywołująca musi przekazać adresy swoich zmiennych. Zbudujemy prostą funkcję ogólną, która zmieniać
będzie wartości dwóch zmiennych przekazywanych jej w instrukcji wywołania. Funkcja
będzie porównywać dwie zmienne i jako wartość powrotną zwracać większą z liczb.
1. Zadeklarujemy prostą funkcję ogólną o nazwie 2.
G G EG YE6 G Y
E Z E $
"
Litera = oznacza tutaj nazwę zastępczą typu danych wykorzystywanych przez
dwuparametrową funkcją 2. Zaletą podawania nazwy zastępczej jest to,
że kompilator zawsze automatycznie zastąpi ją rzeczywistym typem danych
w trakcie tworzenia konkretnej wersji funkcji. W funkcji tej wykorzystaliśmy
operator warunkowy >( (pytajnik i dwukropek). Znaczenie jego jest następujące:
B& Z B' $ B)
Jeżeli wartość logiczna wyrażenia (lub warunku) 5 występującego po lewej stronie
znaku > jest prawdą (wartość różna od zera), wówczas funkcja zwróci wartość wyrażenia 5? (w naszym przypadku 2), w przeciwnym razie wartością powrotną funkcji będzie
wartość wyrażenia 5@ występującego po znaku ( (w naszym przypadku 6).
2. Wywołanie funkcji ogólnej 2 w programie głównym nie powinno sprawić nam
najmniejszych trudności. Na wydruku 2.9 pokazano kompletny kod źródłowy modułu
Unit09.cpp projektu Projekt_09.bpr.
Wydruk 2.9. Moduł Unit09.cpp
G G EG YE6 G Y
E Z E $
"
99:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
E<&'''')))),+6 <&******,-,--
($$(E
EE6
!
"99:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
36