Funkcje w C++ możemy tworzyć na kilka sposobów:
W artykule dodatkowo zostanie opisany sposób wywoływania funkcji wraz z przykładami.
Między bibliotekami a funkcją main().
Przeanalizujmy przykład:
#include <iostream>
using namespace std;
//definicja funkcji wraz z jej ciałem
typ_funkcji nazwa_funkcji(lista argumentów)
{
//ciało funkcji
return wartość;
}
int main()
{
//instrukcje funkcji main
return 0;
}
Całą funkcję wraz z jej instrukcjami tworzymy przed główną funkcją main()
Deklaracja samych prototypów funkcji przed funkcją main()
Drugi sposób polega na wstawieniu przed funkcją main() samych prototypów nazw funkcji, natomiast ich ciała są zaimplementowane pod funkcją main():
#include <iostream>
using namespace std;
//definicja funkcji wraz z jej ciałem
//przy tworzeniu prototypów wstawiamy
//średnik na końcu funkcji
typ_funkcji1 nazwa_funkcji(lista argumentów);
typ_funkcji2 nazwa_funkcji_drugiej(lista argumentów);
...
int main()
{
//instrukcje funkcji main
return 0;
}
//implementacje funkcji zadeklarowanych powyżej
typ_funkcji1 nazwa_funkcji(lista argumentów)
{
//instrukcje funkcji
return wartość;
}
//implementacja funkcji zadeklarowanej powyżej
typ_funkcji2 nazwa_funkcji_drugiej(lista argumentów)
{
//instrukcje funkcji
return wartość;
}
Taki sposób tworzenia funkcji jest wygodny, w przypadku dużej ich ilości. Aby sterować aplikacją, nie musimy błądzić przez gąszcz zaimplenyowanych funkcji.
W oddzielnej bibliotece.
Ostatni sposób polega na implementacji funkcji w oddzielnym pliku nazywanym biblioteką. Plik ten posiada rozszerzenie *.h Aby korzystać z napisanych funkcji, trzeba dodać tę bibliotekę w nagłówku programu. Prześledźmy przykład:
Załóżmy, że nasza biblioteka ma nazwę biblioteka.h
#ifndef biblioteka_h
#define biblioteka_h
//w tej części definiujemy i implementujemy nasze funkcje
typ_funkcji nazwa(lista argumentów)
{
return wartość;
}
typ_funkcji druga_funkcja(lista argumentów)
{
//instrukcje funkcji
return wartość;
}
...
#endif
Aby korzystać z własnej biblioteki, musisz ją dodać do projektu programu. Wystarczy teraz, że dodasz jej względną ścieżkę w nagłówku aplikacji w następujący sposób:
#include "biblioteka.h"
Zauważ, że pojawiły się dodatkowe dyrektywy:
#ifndef biblioteka_h
#define biblioteka_h
...
#endif
Podczas konsolidacji kodu obiektowego, do naszego programu dołączane są pliki zwane bibliotekami. Aby zapobiec wielokrotnemu dodaniu naszej biblioteki do programu, zabezpieczamy się dyrektywą, która sprawdza, czy dana biblioteka nie została już wcześniej dołączona. #ifndef biblioteka_h- można przetłumaczyć: "jeśli nie zdefiniowano ciągu znaków biblioteka_h", #define biblioteka_h - "zdefiniuj ciąg znaków biblioteka_h" i dołącz nagłówek pliku biblioteka.h do programu, #endif - koniec bloku #ifndef.
Stworzymy dwie funkcje:
sposobami omówionymi powyżej.
#include <iostream>
using namespace std;
double max(double a,double b)
{
if(a>b)
return a;
return b;
}
void hello()
{
cout<<"Witaj programisto!!!";
}
int main()
{
//wywołanie funkcji max
cout<<"Wartość maksymalna z liczb 5.2 i 7.3 wynosi: "<<max(5.2, 7.3)<<endl;
//wywołanie funkcji hello
hello();
cout<<endl;
return 0;
}
#include <iostream>
using namespace std;
//definicja prototypów funkcji max i hello
//zauważmy, że wystarczy podać typy argumentów bez ich nazw
double max(double, double);
void hello();
int main()
{
//wywołanie funkcji max
cout<<"Wartość maksymalna z liczb 5.2 i 7.3 wynosi: "<<max(5.2, 7.3)<<endl;
//wywołanie funkcji hello
hello();
cout<<endl;
return 0;
}
//pełne definicje funkcji
double max(double a, double b)
{
if(a>b)
return a;
else
return b;
}
void hello()
{
cout<<"Witaj programisto!!!";
}
biblioteka.h
#ifndef biblioteka_h
#define biblioteka_h
double max(double a, double b)
{
if(a>b)
return a;
else
return b;
}
void hello()
{
cout<<"Witaj programisto!!!";
}
#endif
biblioteka.cpp
#include <iostream>
using namespace std;
#include "biblioteka.h"
int main()
{
double a, b;
cout<<"Podaj dwie liczby: ";
cin>>a>>b;
//wywołanie funkcji max, która jest zdefiniowana w bibliotece biblioteka.h
cout<<"Wartość maksymalna liczb "<<a<<" i "<<b<<" wynosi: "<<max(a,b)<<endl;
return 0;
}
Aby wywołać funkcję w C++, należy podać jej nazwę oraz argumenty (jeśli takie posiada), zwracając uwagę, na zgodność typów argumentów:
jeśli funkcja o nazwie "f" pobiera następujące typy f(int a, char b), oznacza to, że przy uruchomieniu tej funkcji pierwszym argumentem musi być liczba typu int, a drugim argumentem musi być znak np.:
//wywołanie funkcji f
f(123,'a');
lub
int a = 3;
char znak = 'p';
//wywołanie funkcji f
f(a,znak);
Funkcje niezwracające wartości wywołujemy podając tylko ich nazwę, natomiast funkcje z wartością zwrotną przypisujemy do odpowiednich zmiennych lub kierujemy na wyjście do pliku lub na ekran (wypisujemy wynik na ekranie).
Podprogramy (funkcje) możemy wywoływać w głównej funkcji main() lub z wnętrza innych funkcji, metod, itd..
Przeanalizujmy przykłady:
Stworzymy dwie funkcje:
#include <iostream>
using namespace std;
void sumaA(int a, int b)
{
cout<<"Suma liczb "<<a<<" i "<<b<<" wynosi: "<<a+b<<endl;
}
int sumaB(int a,int b)
{
return a+b;
}
int main(int argc, char *argv[])
{
//wywołanie funkcji typu void - bez zwróconej wartosci
sumaA(2,3);
//wywołanie funkcji z informacją zwrotna zapisaną w zmiennej suma
int suma = sumaB(3,6);
cout<<"Suma liczb 3 i 6 wynosi: "<<suma<<endl;
return 0;
}