FUNKCJE
Funkcja zdefiniowana przed funkcją main() nie wymaga odrębnej deklaracji.
Przekazywanie danych do funkcji
Przez wartość
Przez referencję (&x oznacza: adres zmennej x)
Parametry domyślne (domniemane)
Funkcja może mieć wiele parametrów różnych typów. Ostatnie występujące na liście parametrów w deklaracji mogą być ustawione jako domyślne.
Wywołanie
tylko z wszystkimi parametrami: z wszystkimi parametrami:
x = suma(j, k, l, m, n); x = suma(p, q, r, s, t);
lub tylko z początkowymi dwoma, trzema, czterema:
x = suma(p, q);
x = suma(p, q, r);
x = suma(p, q, r, s);
Wartości domniemane wykorzystać można tylko jako ostatnie z listy parametrów.
Niedopuszczalne jest pominięcie w wywołaniu elementu "środkowego", np.:
x = suma(p, q, , s, t); // niepoprawne podanie argumentów
Funkcje przeciążone (przeładowane, ang. overloaded)
Przeciążenie funkcji to definiowanie funkcji o identycznych nazwach, ale innych argumentach.
Przykłady deklaracji funkcji przeciążonych:
int fun_1( int, float );
int fun_1( int, int );
int fun_1( float, int );
int fun_1( float, float );
int fun_2( int );
float fun_2( int, int );
char fun_2( int, int, int );
Różnorodność typów funkcji nie wystarcza do budowania funkcji przeciążonych.
Przykład błędnej deklaracji funkcji:
int fun_x( int, float );
float fun_x( int, float );
p - parametr formalny. Na przykładzie p opisuje się sposób wykorzystania parametru przy wykonaniu funkcji.
W chwili wywołania funkcji w miejsce p trafia kopia wartości parametru aktualnego.
Kopię można bezkarnie zmienić.
Parametr aktualny nie ulegnie zmianie w realizacji funkcji. Może być stałą, zmienną lub wyrażeniem.
Przykłady parametrów aktualnych:
5.3
a
a/sqrt(2)
int fun (float &q)
{
q = q+1;
wyn = sqrt ( q / 2 ) ;
return wyn;
}
main ()
{
a=3;
y = fun (a);
cout << a ;
}
int fun (float p)
{ ...
p = p+1;
return wyn;
}
main ()
{ ...
x = fun (5.3);
y = fun (a);
z = fun (a/sqrt(2));
}
Tworząc funkcje przeciążone należy szczególnie uważnie wykorzystywać parametry domyślne.
Przykład błędnych deklaracji funkcji:
int fun_y( int a, int b = 0);
int fun_y( int a);
Wywołanie:
z = fun_y(p);
pozostawia wątpliwość co do tego, która wersja funkcji ma być wywołana.
dwie deklaracje funkcji o różnych argumentach
i różnych treściach
void zamiana( int &a, int &b )
{
int c = a ;
a = b ;
b = c ;
}
void zamiana( double &a, double &b )
{
double c = a ;
a = b ;
b = c ;
}
void main( )
{
int m = 3, n = 6 ;
zamiana (m, n);
double x = 3.5, y = 6.7 ;
zamiana(x, y);
. . .
}
int suma(int a, int b, int c=0, int d=0, int e=0 )
{
wyn = a+b+c+d+e;
return wyn;
}
int suma(int a, int b, int c, int d, int e )
{
wyn = a+b+c+d+e;
return wyn;
}
q - parametr formalny. Na przykładzie q opisuje się sposób wykorzystania parametru przy wykonaniu funkcji.
W chwili wywołania funkcji w miejsce q trafia adres zmiennej, która może ulec zmianie w przebiegu funkcji.
Działanie na zmiennej q oznacza naprawdę działanie na parametrze aktualnym.
Parametrem aktualnym może być tylko zmienna.
W podanym przykładzie wartość zmiennej a po wywołaniu funkcji wynosi 4 i taka będzie dla programu.
dyrektywy włączenia plików nagłówkowych
deklaracja zmiennej globalnej
deklaracja funkcji funk_a z parametrami
definicja funkcji funk_b(x, y) // konieczna deklaracja
// typu argumentów
zwrócenie wyniku przez funkcję funk_b
funkcja główna main()
wywołanie funkcji funk_a z parametrami
wywołanie funkcji funk_b z parametrami
definicja funkcji funk_a(k, s)
zwrócenie wyniku przez funkcję funk_a
#include <plik.h>
float q = 7.65;
int funk_a (int, float);
float funk_b (float x,float y)
{
...
return wynik_b;
}
void main()
{ ...
int y = funk_a (p, 1.23);
float c =funk_b (1.3, 2.5);
...
}
int funk_a(int k, float s)
{
...
return wynik_a;
}