Funkcje w praktyce: od deklaracji do wywołania
Funkcje bywają często nazywane podprogramami – i w istocie, są one „programami w programie”. Za pomocą funkcji wykonuje się zazwyczaj jedno konkretne zadanie wewnątrz większej aplikacji.
O przydatności funkcji najłatwiej jest przekonać się wtedy, gdy w różnych częściach programu wykonujemy tę samą operację (np. dodajemy do siebie kilka liczb). W takiej sytuacji możemy oczywiście powielać w odpowiednich miejscach kodu identyczne sekwencje poleceń. Rozsądniej jednak będzie napisać funkcję realizującą operację dodawania, a później wywoływać ją za każdym razem, gdy okaże się potrzebna.
Samo wywołanie gotowej funkcji jest bardzo proste. Wynika z tego, że raz napisana funkcja pozwala skrócić kod programu. Czyni go zarówno bardziej czytelnym, jak i optymalnym.
Co istotne, funkcję możemy wywoływać, podając różne argumenty (przykładowo: zestaw liczb, na których chcemy wykonać jakieś działanie). Lista argumentów jest ustalana podczas pisania programu. Jeżeli wydaje ci się to trochę zagmatwane, nie martw się. Wszystko zrozumiesz po przeanalizowaniu przykładów z dalszej części lekcji.
Składnia funkcji w języku C++
Zacznijmy od wyjaśnienia, gdzie należy umieścić deklarację funkcji. Dotychczas cały kod (pomijając dodawanie bibliotek i deklarowanie zmiennych globalnych) pisaliśmy wewnątrz funkcji głównej main(). W przypadku funkcji jest inaczej.
W języku C++ deklarację własnej funkcji umieszczamy przed blokiem funkcji głównej main(), tak jak w poniższym fragmencie kodu:
Przeanalizujmy ten wycinek programu. Podczas deklarowania funkcji obowiązują następujące zasady:
Nazwa funkcji musi być ciągła (nie może zawierać spacji).
Nazwa funkcji może zawierać litery, cyfry i znaki podkreślenia.
Nazwa funkcji nie może rozpoczynać się od cyfry.
Mamy swobodę w wyborze nazwy funkcji, ale dobrze jest, gdy opisuje ona wykonywane zadania. Przykładowo, funkcja obliczająca silnię mogłaby się nazywać
silnia()alboobliczSilnie().Przed nazwą funkcji trzeba określić typ zwracanej przez nią wartości (co konkretnie funkcja powinna zwracać) - w przypadku, gdy funkcja nic nie zwraca jako typ wskazujemy
void.Funkcja musi zwracać wartość tego typu, który wskazano przed jej nazwą.
W nawiasach (tuż po nazwie funkcji) możemy – ale nie musimy – umieścić listę argumentów. Poszczególne argumenty rozdzielamy przecinkiem, wskazujemy też osobno typ każdego z nich. W naszym przykładzie funkcja ma dwa argumenty typu
double:liczba1iliczba2.
Na razie nasza funkcja nie potrafi zrobić nic: między lewym a prawym nawiasem klamrowym nie znalazło się żadne polecenie. Z nazwy funkcji wynika, że ma ona obliczać sumę dwóch liczb.
Napiszmy zatem ciało funkcji, czyli sprawmy, by dodawała ona do siebie dwie liczby, które podamy jako argumenty:
Program jest gotowy. Wywołajmy naszą funkcję, używając konkretnych argumentów:
Program wyświetli wynik dodawania liczb: 8.8.
Wywołaliśmy funkcję sumaDwochLiczb(double liczba1, double liczba2) z poziomu funkcji głównejmain(). W nawiasach wpisaliśmy wprost wartości liczb, które chcieliśmy zsumować. Jako argumenty możemy także podawać zmienne:
Warto zaznaczyć, że zmienne nie muszą nosić takich samych nazw jak argumenty w deklaracji funkcji. Po wywołaniu funkcji sumaDwochLiczb() zmienne o nazwach zmienna1 i zmienna2 zastąpiły odpowiednio zadeklarowane argumenty liczba1 i liczba2.
Istnieją także funkcje wywoływane bez argumentów oraz takie, które nie zwracają żadnej wartości. Oto przykład:
W tym przypadku zamiast konkretnego typu zwracanej wartości (bool, int, double...) przed nazwą funkcji umieściliśmy słowo kluczowe void.
Wywołanie funkcji z ostatniego przykładu spowoduje wypisanie cytatu.
Jest to funkcja niezwracająca wartości i zarazem tzw. funkcja bezargumentowafunkcja bezargumentowa. Możemy jednak dodać do niej argumenty. Niech użytkownik programu sam wprowadzi tekst, jaki chce wyświetlić:
Musimy posłużyć się złożoną ze stu elementów tablicą typu char, ponieważ do odebrania więcej niż jednego słowa z klawiatury używamy funkcji wbudowanejfunkcji wbudowanej getline(). Jako argumenty przyjmuje ona tablicę typu char oraz rozmiar obiektu (długość cytatu).
Słownik
funkcja, która nie przyjmuje żadnych argumentów
gotowa funkcja, wchodząca w skład jednej z bibliotek języka C++ (zgodnych ze standardem ISO/IEC 14882:2017); przykładowymi funkcjami wbudowanymi są: length(), begin(), end(), sizeof()