Funkcje w C++ cz. I
Funkcja w programowaniu to pewien blok kodu, który wykonuje określone zadanie i zwraca bądź też nie jakąś konkretną daną określonego wcześniej typu (np. int, double czy string). Dzięki funkcjom program możemy podzielić na kilka mniejszych bloków kodu, które następnie łatwiej jest rozwijać, a co najważniejsze dany fragment możemy używać z różnymi danymi dowolną ilość razy nie przepisując go ponownie.
Należy tutaj zwrócić uwagę iż funkcją jest main, w którym w poprzednich artykułach wpisywaliśmy cały kod naszej aplikacji. Teraz przejdziemy trochę dalej. Przyjrzyjmy się więc przykładowej funkcji w C++, która może wyglądać tak:
typDanejKtoraChcemyZwrocic nazwaFunkcji(typArgumentu1 nazwaArgumentu1)
{
jakisKod
}
Natomiast przykładowy program korzystający z funkcji obliczającej pole kwadratu tak:
#include <iostream>
using namespace std;
int poleKwadratu(int a) //funkcja poleKwadratu zwracająca wartość typu int
{
return a * a; //zwróć a * a
// return a, b; to jest błędem ponieważ możemy zwracać tylko jedną zmienną, jest kilka sztuczek, które obchodzą to ograniczenie, ale o nich będę pisał w II części tego artykułu
}
int main() //funkcja main zwracająca wartość typu int
{
int pole = poleKwadratu(5); //oblicza pole kwadratu o boku 5
cout << pole; //wypisze 25
return 0; //zwracamy 0 czyli wartość typu int
}
Oczywiście możemy napisać również funkcję, która nie zwraca żadnej danej na przykład:
#include <iostream>
using namespace std;
void pole(int a, int b) //funkcja pole która ma typ void czyli nie zwraca nic
{
b = a * a;
}
int main()
{
pole(5, 0);
// cout << b; to jest błędem, ponieważ zmienna b nie jest zadeklarowana
return 0;
}
Przy funkcjach należy zwrócić jeszcze jedną uwagę na argumenty. Mianowicie kiedy podajemy je do funkcji to tak naprawdę program robi sobie kopię wskazanych przez nas zmiennych (przekazanie przez wartość), oblicza co ma obliczyć i zwraca bądź też nie jakąś daną. Jeżeli funkcja zmodyfikuje liczbę (na przykład pomnoży 5 przez 2) w dowolnej zmiennej to ta zmodyfikowana liczba będzie dostępna tylko do momentu kiedy dana funkcja nie zakończy działania. Zróbmy mały eksperyment:
#include <iostream>
using namespace std;
int pole(int a, int b)
{
b = 2 * b; //modyfikujemy b, czyli kopię argumentu
return a * a;
}
int main()
{
int c = 4;
pole(5, c);
cout << c; //zamiast 8 mamy dalej 4
return 0;
}
Oczywiście to również można obejść stosując tak zwane wskaźniki, ale o tym będę pisał w II części tego artykułu.
Fot: marissa, Flickr | CC.