Programowanie i algorytmy

Tworzenie i wywoływanie funkcji w C++

powrót

Funkcje w C++ możemy tworzyć na kilka sposobów:

W artykule dodatkowo zostanie opisany sposób wywoływania funkcji oraz przykłady wywołania.

Między bibliotekami a funkcją main()

Rozpatrzmy pierwszy sposób tworzenia funkcji:

#include <cstdlib>
#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(int argc, char *argv[])
{
//instrukcje funkcji main
system("PAUSE");
return EXIT_SUCCESS;
}
 

 

Całą funkcję wraz z jej instrukcjami tworzymy przed główną funkcją main().

 

Deklaracja samych prototypów przed funkcją main()

Drugi sposób polega na wstawieniu przed funkcją main() prototypów funkcji, natomiast ciała tych funkcji są zaimplementowane poniżej funkcji main():

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
//definicja funkcji wraz z jej ciałem
 
typ_funkcji1 nazwa_funkcji(lista argumentów);
//przy tworzeniu prototypów wstawiamy
typ_funkcji2 nazwa_funkcji_drugiej(lista argumentów); 
...
//średnik na końcu funkcji
 
 
int main(int argc, char *argv[])
{
 
//instrukcje funkcji main
system("PAUSE");
return EXIT_SUCCESS;
}
 
//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 gdy w programie mamy ich większą ilość. Aby sterować naszą aplikacją nie musimy przedostawać się przez gąszcz funkcji, tylko przez same ich prototypy.

W oddzielnej bibliotece

Ostatni sposób polega na implementacji naszych funkcji w oddzielnym pliku nazywanym biblioteką. Plik ten posiada rozszerzenie *.h Aby korzystać z napisanych funkcji, trzeba dodać napisaną bibliotekę do nagłówka programu. Prześledźmy przykład:

Załóżmy, że nasza biblioteka ma nazwę biblioteka.h

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 można było korzystać z własnej biblioteki, musisz ją dodać do projektu programu. Gdy dodajesz swoja bibliotekę do programu, musisz zapisać jej ścieżkę względną w nagłowku programu w podójnym cudzysłowiu np.:

#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.

Przykład. Napiszmy dwie funkcje:

  • float max(float, float) - wyznaczającą wartość maksymalną, z podanych dwóch liczb
  • void hello() - wyświetlającą na ekranie treść: "Witaj programisto!!!"

sposobami omówionymi powyżej.

Sposób 1.

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
float max(float a,float b)
{
  if(a>b)
    return a;
  else
    return b;
}
 
void hello()
{  
  cout<<"Witaj programisto!!!";
}
 
int main(int argc, char *argv[])
{
  //wywołanie funkcji max
  cout<<"Wartość maksymalna z liczb 5 i 7 wynosi: "<<max(5,7)<<endl;
 
  //wywołanie funkcji hello
  hello();
 
  cout<<endl;
 
  system("pause");
  return 0;
}
 

 

Sposób 2.

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
//definicja prototypów funkcji max i hello
 
//zauważmy, że wystarczy podać typy argumentów bez ich nazw
float max(float,float); 
void hello();
 
int main(int argc, char *argv[])
{
  //wywołanie funkcji max
  cout<<"Wartość maksymalna z liczb 5 i 7 wynosi: "<<max(5,7)<<endl;
 
  //wywołanie funkcji hello
  hello();
 
  cout<<endl;
 
  system("pause");
  return 0;
}
 
//pełne definicje funkcji
float max(float a,float b)
{
  if(a>b)
    return a;
  else
    return b;
 
}
 
void hello()
{
  cout<<"Witaj programisto!!!";
}
 

 

Sposób 3.

biblioteka.h
#ifndef biblioteka_h
#define biblioteka_h
 
float max(float a,float b)
{
  if(a>b)
    return a;
  else
    return b;
}
 
void hello()
{
  cout<<"Witaj programisto!!!";
}
#endif

 

biblioteka.cpp
#include <cstdlib>
#include <iostream>
using namespace std;
 
#include "biblioteka.h"
 
int main(int argc, char *argv[])
{
  float 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;
 
  system("pause");
  return 0;
}
 

 

Wywoływanie funkcji

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 (do zmiennej typu zwracanej wartości), lub kierujemy na wyjście do pliku lub na ekran.

Podprogramy (funkcje) możemy wywoływać w głównej funkcji main() lub z wnętrza innych funkcji, metod, itd..

Prześledźmy przykłady:

Stworzymy dwie funkcje:

  • void sumaA(int, int) - wyświetlająca sumę dwóch liczb całkowitych
  • int sumaB(int, int) - zwracającą sumę dwóch liczb całkowitych
#include <cstdlib>
#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;
 
  system("pause");
  return 0;
}