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ę (przykładowo, 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:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. double sumaDwochLiczb otwórz nawias okrągły double liczba1 przecinek double liczba2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. zamknij nawias klamrowy. Linia 9. int main otwórz nawias klamrowy. Linia 11. return 0 średnik. Linia 12. zamknij nawias klamrowy.

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() albo obliczSilnie().

  • 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: liczba1liczba2.

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:

Linia 1. double sumaDwochLiczb otwórz nawias okrągły double liczba1 przecinek double liczba2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return liczba1 plus liczba2 średnik. Linia 4. zamknij nawias klamrowy.

Program jest gotowy. Wywołajmy naszą funkcję, używając konkretnych argumentów:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. double sumaDwochLiczb otwórz nawias okrągły double liczba1 przecinek double liczba2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. return liczba1 plus liczba2 średnik. Linia 8. zamknij nawias klamrowy. Linia 10. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. cout otwórz nawias ostrokątny otwórz nawias ostrokątny sumaDwochLiczb otwórz nawias okrągły 5 kropka 45 przecinek 3 kropka 35 zamknij nawias okrągły średnik. Linia 14. return 0 średnik. Linia 15. zamknij nawias klamrowy.

Program wyświetli wynik dodawania liczb: 8.8.

Wywołaliśmy funkcję sumaDwochLiczb(double liczba1, double liczba2) z poziomu funkcji głównej main(). W nawiasach wpisaliśmy wprost wartości liczb, które chcieliśmy zsumować. Jako argumenty możemy także podawać zmienne:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. double sumaDwochLiczb otwórz nawias okrągły double liczba1 przecinek double liczba2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. return liczba1 plus liczba2 średnik. Linia 8. zamknij nawias klamrowy. Linia 10. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. double zmienna1 znak równości 5 kropka 45 średnik. Linia 13. double zmienna2 znak równości 3 kropka 35 średnik. Linia 15. cout otwórz nawias ostrokątny otwórz nawias ostrokątny sumaDwochLiczb otwórz nawias okrągły zmienna1 przecinek zmienna2 zamknij nawias okrągły średnik. Linia 17. return 0 średnik. Linia 18. zamknij nawias klamrowy.

Warto zaznaczyć, że zmienne nie muszą nosić takich samych nazw jak argumenty w deklaracji funkcji. Po wywołaniu funkcji sumaDwochLiczb() zmienne o nazwach zmienna1zmienna2 zastąpiły odpowiednio zadeklarowane argumenty liczba1liczba2.

Istnieją także funkcje wywoływane bez argumentów oraz takie, które nie zwracają żadnej wartości. Oto przykład:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. void wypiszCytat otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów To przecinek że milczę przecinek nie znaczy przecinek że nie mam nic do powiedzenia kropka cudzysłów średnik. Linia 8. zamknij nawias klamrowy. Linia 10. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. wypiszCytat otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 14. return 0 średnik. Linia 15. zamknij nawias klamrowy.

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 bezargumentowafunkcja bezargumentowa. Możemy jednak dodać do niej argumenty. Niech użytkownik programu sam wprowadzi tekst, jaki chce wyświetlić:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. void wypiszCytat otwórz nawias okrągły char cytat otwórz nawias kwadratowy 100 zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cytat średnik. Linia 8. zamknij nawias klamrowy. Linia 10. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. char cytat otwórz nawias kwadratowy 100 zamknij nawias kwadratowy średnik. Linia 14. cin kropka getline otwórz nawias okrągły cytat przecinek sizeof otwórz nawias okrągły cytat zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 16. wypiszCytat otwórz nawias okrągły cytat zamknij nawias okrągły średnik. Linia 18. return 0 średnik. Linia 19. zamknij nawias klamrowy.

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 wbudowanejfunkcja wbudowanafunkcji wbudowanej getline(). Jako argumenty przyjmuje ona tablicę typu char oraz rozmiar obiektu (długość cytatu).

Słownik

funkcja bezargumentowa
funkcja bezargumentowa

funkcja, która nie przyjmuje żadnych argumentów

funkcja wbudowana
funkcja wbudowana

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()