Funkcje w C++

Funkcje to opisy czynności do wykonania. Z definiowaniem prostych funkcji mieliśmy już do czynienia we wcześniejszych przykładach. Funkcję możemy zdefiniować i/lub zdeklarować. Definicja funkcji - cały kod funkcji:
void funkcja (int parametr)
	{
	// kod
	}
Gdy w kodzie odwołujemy się do danej funkcji to musi ona być już znana (zadeklarowana przynajmniej) - nie możemy dać kodu funkcji po kodzie, który tą funkcje wywołuje chyba że funkcja ta zostanie zadeklarowana:
void funkcja (int parametr);
Powyższa deklaracja nazywana jest prototypem funkcji. Co więcej w prototypach nie trzeba podawać nazw parametrów a jedynie ich typy, to też jest poprawne:
void funkcja (int);

W powyższych przykładach deklaracja zaczyna się od wyrazu "void" - fraza ta (i inne) umieszczona przed nazwą funkcji określa typ wartości zwracanej i może to być np. int, char, double, int*, void - który da funkcję bezrezultatową. Po wpisaniu nazwy podajemy parametry, np.:
(int parametr, char zmienna, int* costam, int buc = 3)
Ostatni parametr - buc ma ustawioną domyślną wartość - jeżeli w wywołaniu funkcji nie zostanie podana inna wartość to zostanie użyta wartość domyślna. Funkcja może też nie mieć parametrów - () - drobne zalecenie, warto wpisać wtedy do nawiasów void.
Funkcja musi/może zwrócić rezultat za pomocą wyrażenia return. Dla funkcji typu void wyrażenie return nie może zwracać niczego (poza wywołaniem funkcji typu void).

Niewłaściwy typ funkcji
#include<iostream>
using namespace std;

double foo()
	{
	double bar = 4.5;
	return bar;
	}
int foo2()
	{
	double bar = 4.5;
	return bar;
	}

int main()
	{
	double z;
	z = foo();
	cout << z << endl;
	z = foo2();
	cout << z << endl;
	}
Mamy dwie funkcje, które powinny zwrócić wartość 4,5 lecz funkcja foo2 jest typu int i może zwracać tylko liczby całkowite... G++ powie tak:
piotr@localhost ~/fl $ g++ a.cpp -o a
a.cpp: In function `int foo2()':
a.cpp:12: warning: converting to `int' from `double'
piotr@localhost ~/fl $ ./a
4.5
4
foo2 zwraca 4 a nie 4,5

Wartość domyślna
#include<iostream>
using namespace std;

double foo(int k = 3)
	{
	k = k*2;
	return k;
	}

int main()
	{
	double z;
	z = foo();
	cout << z << endl;
	z = foo(1);
	cout << z << endl;
	}
Pierwsze wywołanie zwróci 3*2 - 6, a drugie 1*2 - 2.

Funkcje rozwijane to takie, których po kompilacji... nie ma :) Każde wywołanie funkcji rozwijanej jest zastępowane jej kodem.
#include<iostream>
using namespace std;

inline double foo(int k = 3)
	{
	k = k*2;
	return k;
	}

int main()
	{
	double z;
	z = foo();
	cout << z << endl;
	z = foo(1);
	cout << z << endl;
	}
Funkcja rozwijana zawiera wyrażenie inline przed typem. Zaletą funkcji rozwijanych jest a) czytelność kodu - jeżeli w wielu miejscach wywołujemy taką funkcję to kod występuje tylko raz - jako funkcja (normalnie n-razy ten sam kod musiałby być wrzucany w miejsce wywoływań), b) szybsze wykonanie kodu (brak funkcji). NOTKA: kompilatory nie rozwiną trudnych funkcji :) Szczególnie takich z zawiłymi pętlami czy IFami.
RkBlog

C/C++ i Java, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact