Funkcja to zbiór instrukcji, który pobiera dane wejściowe, wykonuje określone obliczenia, i produkuje dane wyjściowe. Pomysł jest taki, aby umieścić niektóre powszechnie lub wielokrotnie wspólnie wykonali zadania, aby wykonać a funkcjonować dzięki czemu zamiast w kółko pisać ten sam kod dla różnych wejść, możemy wywołać tę funkcję.
Mówiąc najprościej, funkcja to blok kodu, który działa tylko wtedy, gdy zostanie wywołany.
Składnia:

Składnia funkcji
Przykład:
C++
// C++ Program to demonstrate working of a function> #include> using> namespace> std;> // Following function that takes two parameters 'x' and 'y'> // as input and returns max of two input numbers> int> max(> int> x,> int> y)> {> > if> (x>y)> > return> x;> > else> > return> y;> }> // main function that doesn't receive any parameter and> // returns integer> int> main()> {> > int> a = 10, b = 20;> > // Calling above function to find max of 'a' and 'b'> > int> m = max(a, b);> > cout <<> 'm is '> << m;> > return> 0;> }> |
>
>Wyjście
m is 20>
Złożoność czasowa: O(1)
Złożoność przestrzeni: O(1)
Dlaczego potrzebujemy funkcji?
- Funkcje nam w tym pomagają zmniejszenie redundancji kodu . Jeśli funkcjonalność jest realizowana w wielu miejscach oprogramowania, zamiast ciągle pisać ten sam kod, tworzymy funkcję i wywołujemy ją wszędzie. Pomaga to również w utrzymaniu, ponieważ jeśli w przyszłości będziemy wprowadzać zmiany w funkcjonalności, będziemy musieli wprowadzać zmiany tylko w jednym miejscu.
- Funkcje tworzą kod modułowe . Rozważmy duży plik zawierający wiele linii kodu. Czytanie i używanie kodu staje się naprawdę proste, jeśli kod zostanie podzielony na funkcje.
- Funkcje zapewniają abstrakcja . Możemy na przykład korzystać z funkcji bibliotecznych, nie martwiąc się o ich pracę wewnętrzną.
Deklaracja funkcji
Deklaracja funkcji informuje kompilator o liczbie parametrów, typach danych parametrów i typie zwracanej funkcji. Zapisywanie nazw parametrów w deklaracji funkcji jest opcjonalne, ale konieczne jest umieszczenie ich w definicji. Poniżej znajduje się przykład deklaracji funkcji. (nazwy parametrów nie występują w poniższych deklaracjach)

Deklaracja funkcji
Przykład:
C++
// C++ Program to show function that takes> // two integers as parameters and returns> // an integer> int> max(> int> ,> int> );> // A function that takes an int> // pointer and an int variable> // as parameters and returns> // a pointer of type int> int> * swap(> int> *,> int> );> // A function that takes> // a char as parameter and> // returns a reference variable> char> * call(> char> b);> // A function that takes a> // char and an int as parameters> // and returns an integer> int> fun(> char> ,> int> );> |
>
>
Rodzaje funkcji

Typy funkcji w C++
Funkcja zdefiniowana przez użytkownika
Funkcje zdefiniowane przez użytkownika to zdefiniowane przez użytkownika/klienta bloki kodu, specjalnie dostosowane w celu zmniejszenia złożoności dużych programów. Powszechnie znane są także tzw funkcje szyte na miarę które są budowane wyłącznie w celu spełnienia warunku, w którym użytkownik napotyka problemy, jednocześnie zmniejszając złożoność całego programu.
Funkcja biblioteki
Funkcje biblioteczne są również nazywane wbudowane funkcje . Funkcje te są częścią pakietu kompilatora, który jest już zdefiniowany i składa się ze specjalnej funkcji o specjalnych i różnych znaczeniach. Funkcja wbudowana daje nam przewagę, ponieważ możemy z niej bezpośrednio korzystać bez definiowania, podczas gdy w funkcji zdefiniowanej przez użytkownika musimy zadeklarować i zdefiniować funkcję przed jej użyciem.
Na przykład: sqrt(), setw(), strcat() itp.
Przekazywanie parametrów do funkcji
Wywoływane są parametry przekazane do funkcji rzeczywiste parametry . Na przykład w poniższym programie 5 i 10 to parametry rzeczywiste.
Wywoływane są parametry otrzymane przez funkcję parametry formalne . Przykładowo w powyższym programie x i y są parametrami formalnymi.

Parametr formalny i parametr rzeczywisty
Istnieją dwa najpopularniejsze sposoby przekazywania parametrów:
- Przekaż wartość: W tej metodzie przekazywania parametrów wartości aktualnych parametrów są kopiowane do parametrów formalnych funkcji. Parametry rzeczywiste i formalne przechowywane są w różnych lokalizacjach pamięci, więc wszelkie zmiany dokonane w funkcjach nie mają odzwierciedlenia w rzeczywistych parametrach wywołującego.
- Przejdź przez odniesienie: Zarówno parametry rzeczywiste, jak i formalne odnoszą się do tych samych lokalizacji, więc wszelkie zmiany dokonane wewnątrz funkcji mają swoje odzwierciedlenie w rzeczywistych parametrach wywołującego.
Definicja funkcji
Przekaż wartość jest używany, gdy wartość x nie jest modyfikowana za pomocą funkcji fun().
C++
// C++ Program to demonstrate function definition> #include> using> namespace> std;> void> fun(> int> x)> {> > // definition of> > // function> > x = 30;> }> int> main()> {> > int> x = 20;> > fun(x);> > cout <<> 'x = '> << x;> > return> 0;> }> |
>
>Wyjście
x = 20>
Złożoność czasowa: O(1)
Złożoność przestrzeni: O(1)
Funkcje wykorzystujące wskaźniki
Funkcja fun() oczekuje wskaźnika ptr na liczbę całkowitą (lub adres liczby całkowitej). Modyfikuje wartość pod adresem ptr. Operator dereferencji * służy do uzyskania dostępu do wartości pod adresem. W instrukcji „*ptr = 30” wartość pod adresem ptr zostaje zmieniona na 30. Operator adresu & służy do uzyskania adresu zmiennej dowolnego typu danych. W instrukcji wywołania funkcji „fun(&x)” przekazywany jest adres x, dzięki czemu x można modyfikować przy użyciu jego adresu.
C++
// C++ Program to demonstrate working of> // function using pointers> #include> using> namespace> std;> void> fun(> int> * ptr) { *ptr = 30; }> int> main()> {> > int> x = 20;> > fun(&x);> > cout <<> 'x = '> << x;> > return> 0;> }> |
>
>Wyjście
x = 30>
Złożoność czasowa: O(1)
Złożoność przestrzeni: O(1)
Różnica między wywołaniem według wartości a wywołaniem przez referencję w C++
Zadzwoń według wartości | Zadzwoń przez referencje |
---|---|
Kopia wartości jest przekazywana do funkcji | Do funkcji przekazywany jest adres wartości |
Zmiany dokonane wewnątrz funkcji nie są odzwierciedlone w innych funkcjach | Zmiany dokonane wewnątrz funkcji zostaną odzwierciedlone także poza funkcją |
Argumenty rzeczowe i formalne zostaną stworzone o godz inna lokalizacja pamięci | Argumenty rzeczowe i formalne zostaną stworzone o godz to samo miejsce w pamięci. |
Punkty do zapamiętania na temat funkcji w C++
1. Większość programów C++ ma funkcję o nazwie main(), która jest wywoływana przez system operacyjny, gdy użytkownik uruchamia program.
2. Każda funkcja ma typ zwracany. Jeśli funkcja nie zwraca żadnej wartości, jako typ zwracany używana jest wartość void. Co więcej, jeśli typ zwracany przez funkcję jest pusty, nadal możemy użyć instrukcji return w treści definicji funkcji, nie określając w niej żadnych stałych, zmiennych itp., wspominając jedynie o instrukcji „return;”. symbolizują zakończenie funkcji, jak pokazano poniżej:
C++
void> function name(> int> a)> {> > .......> // Function Body> > return> ;> // Function execution would get terminated> }> |
>
>
3. Aby zadeklarować funkcję, którą można wywołać tylko bez żadnego parametru, powinniśmy użyć pusta zabawa (pustka) . Na marginesie, w C++ pusta lista oznacza, że funkcję można wywołać tylko bez żadnego parametru. W C++ zarówno void fun(), jak i void fun(void) są takie same.
Główna funkcja
Funkcja główna jest funkcją specjalną. Każdy program C++ musi zawierać funkcję o nazwie main. Służy jako punkt wejścia dla programu. Komputer rozpocznie uruchamianie kodu od początku funkcji głównej.
Rodzaje głównych funkcji
1. Bez parametrów:
CPP
// Without Parameters> int> main() { ...> return> 0; }> |
>
>
2. Z parametrami:
CPP
// With Parameters> int> main(> int> argc,> char> *> const> argv[]) { ...> return> 0; }> |
>
>
Powodem posiadania opcji parametru dla funkcji głównej jest umożliwienie wprowadzania danych z wiersza poleceń. Kiedy używasz funkcji main z parametrami, zapisuje ona każdą grupę znaków (oddzielonych spacją) po nazwie programu jako elementy tablicy o nazwie argumentacja .
Ponieważ funkcja main ma typ zwracany wew , programista musi zawsze mieć w kodzie instrukcję return. Zwrócona liczba służy do poinformowania programu wywołującego, jaki był wynik wykonania programu. Powrót 0 sygnalizuje, że nie było żadnych problemów.
Rekurencja w C++
Kiedy funkcja jest wywoływana w ramach tej samej funkcji, w C++ nazywa się to rekursją. Funkcja wywołująca tę samą funkcję nazywana jest funkcją rekurencyjną.
Funkcja, która wywołuje samą siebie i nie wykonuje żadnego zadania po wywołaniu funkcji, nazywana jest rekursją ogona. W rekurencji ogonowej zazwyczaj wywołujemy tę samą funkcję z instrukcją return.
Składnia:
C++
recursionfunction()> {> > recursionfunction();> // calling self function> }> |
>
>
Aby dowiedzieć się więcej zobacz Ten artykuł .
C++ Przekazywanie tablicy do funkcji
W C++, aby ponownie wykorzystać logikę tablicową, możemy utworzyć funkcję. Aby przekazać tablicę do funkcji w C++, musimy podać tylko nazwę tablicy.
function_name(array_name[]); //passing array to function>
Przykład: Wydrukuj minimalną liczbę w podanej tablicy.
C++
#include> using> namespace> std;> void> printMin(> int> arr[5]);> int> main()> {> > int> ar[5] = { 30, 10, 20, 40, 50 };> > printMin(ar);> // passing array to function> }> void> printMin(> int> arr[5])> {> > int> min = arr[0];> > for> (> int> i = 0; i <5; i++) {> > if> (min>arr[i]) {> > min = arr[i];> > }> > }> > cout <<> 'Minimum element is: '> << min <<> '
'> ;> }> // Code submitted by Susobhan Akhuli> |
>
>Wyjście
Minimum element is: 10>
Złożoność czasowa: O(n) gdzie n jest rozmiarem tablicy
Złożoność przestrzeni: O(n) gdzie n jest rozmiarem tablicy.
Przeciążenie C++ (funkcja)
Jeśli utworzymy dwóch lub więcej elementów o tej samej nazwie, ale różniących się liczbą lub typem parametrów, jest to znane jako przeciążenie C++. W C++ możemy przeciążać:
- metody,
- konstruktorzy i
- indeksowane właściwości
Rodzaje przeciążeń w C++ to:
- Przeciążenie funkcji
- Przeciążenie operatora
Przeciążanie funkcji C++
Przeciążanie funkcji definiuje się jako proces posiadania dwóch lub więcej funkcji o tej samej nazwie, ale różnych parametrach. W przypadku przeciążenia funkcji funkcja jest redefiniowana przy użyciu różnych typów lub liczby argumentów. Tylko dzięki tym różnicom kompilator może rozróżnić funkcje.
Zaletą przeciążania funkcji jest to, że zwiększa czytelność programu, ponieważ nie trzeba używać różnych nazw dla tej samej akcji.
Przykład: zmiana liczby argumentów metody add().
C++
// program of function overloading when number of arguments> // vary> #include> using> namespace> std;> class> Cal {> public> :> > static> int> add(> int> a,> int> b) {> return> a + b; }> > static> int> add(> int> a,> int> b,> int> c)> > {> > return> a + b + c;> > }> };> int> main(> void> )> {> > Cal C;> // class object declaration.> > cout << C.add(10, 20) << endl;> > cout << C.add(12, 20, 23);> > return> 0;> }> // Code Submitted By Susobhan Akhuli> |
>
>Wyjście
30 55>
Złożoność czasowa: O(1)
Złożoność przestrzeni: O(1)
Przykład: gdy typy argumentów są różne.
C++
// Program of function overloading with different types of> // arguments.> #include> using> namespace> std;> int> mul(> int> ,> int> );> float> mul(> float> ,> int> );> int> mul(> int> a,> int> b) {> return> a * b; }> float> mul(> double> x,> int> y) {> return> x * y; }> int> main()> {> > int> r1 = mul(6, 7);> > float> r2 = mul(0.2, 3);> > cout <<> 'r1 is : '> << r1 << endl;> > cout <<> 'r2 is : '> << r2 << endl;> > return> 0;> }> // Code Submitted By Susobhan Akhuli> |
>
concat ciągi Java
>Wyjście
r1 is : 42 r2 is : 0.6>
Złożoność czasowa: O(1)
Złożoność przestrzeni: O(1)
Przeciążenie funkcji i niejednoznaczność
Kiedy kompilator nie jest w stanie zdecydować, która funkcja spośród funkcji przeciążonych ma zostać wywołana, sytuacja ta nazywana jest niejednoznaczność przeciążająca funkcję.
Gdy kompilator wyświetla błąd niejednoznaczności, kompilator nie uruchamia programu.
Przyczyny niejednoznaczności:
- Konwersja typu.
- Funkcja z domyślnymi argumentami.
- Funkcja z przekazem przez referencję.
Konwersja typu:-
C++
#include> using> namespace> std;> void> fun(> int> );> void> fun(> float> );> void> fun(> int> i) { cout <<> 'Value of i is : '> << i << endl; }> void> fun(> float> j)> {> > cout <<> 'Value of j is : '> << j << endl;> }> int> main()> {> > fun(12);> > fun(1.2);> > return> 0;> }> // Code Submitted By Susobhan Akhuli> |
>
>
Powyższy przykład pokazuje błąd wywołanie przeciążonego „fun(double)” jest niejednoznaczne . Funkcja fun(10) wywoła pierwszą funkcję. Zgodnie z naszymi przewidywaniami funkcja fun(1.2) wywołuje drugą funkcję. Ale to nie odnosi się do żadnej funkcji, tak jak w C++, wszystkie stałe zmiennoprzecinkowe są traktowane jako double, a nie jako float. Jeśli zamienimy float na double, program zadziała. Dlatego jest to konwersja typu z float na double.
Funkcja z argumentami domyślnymi: -
C++
#include> using> namespace> std;> void> fun(> int> );> void> fun(> int> ,> int> );> void> fun(> int> i) { cout <<> 'Value of i is : '> << i << endl; }> void> fun(> int> a,> int> b = 9)> {> > cout <<> 'Value of a is : '> << a << endl;> > cout <<> 'Value of b is : '> << b << endl;> }> int> main()> {> > fun(12);> > return> 0;> }> // Code Submitted By Susobhan Akhuli> |
>
>
Powyższy przykład pokazuje błąd wywołanie przeciążonego „fun(int)” jest niejednoznaczne . Fun(int a, int b=9) można wywołać na dwa sposoby: pierwszy to wywołanie funkcji z jednym argumentem, czyli fun(12), a drugi to wywołanie funkcji z dwoma argumentami, czyli fun(4 ,5). Funkcja fun(int i) jest wywoływana z jednym argumentem. Dlatego kompilator nie mógł wybrać pomiędzy fun(int i) i fun(int a,int b=9).
Funkcja z przekazem referencyjnym: -
C++
#include> using> namespace> std;> void> fun(> int> );> void> fun(> int> &);> int> main()> {> > int> a = 10;> > fun(a);> // error, which fun()?> > return> 0;> }> void> fun(> int> x) { cout <<> 'Value of x is : '> << x << endl; }> void> fun(> int> & b)> {> > cout <<> 'Value of b is : '> << b << endl;> }> // Code Submitted By Susobhan Akhuli> |
>
>
Powyższy przykład pokazuje błąd wywołanie przeciążonego „fun(int&)” jest niejednoznaczne . Pierwsza funkcja przyjmuje jeden argument w postaci liczby całkowitej, a druga funkcja przyjmuje jako argument parametr referencyjny. W tym przypadku kompilator nie wie, która funkcja jest potrzebna użytkownikowi, ponieważ nie ma różnicy składniowej pomiędzy fun(int) i fun(int &).
Funkcja przyjaciela
- Funkcja przyjaciela to specjalna funkcja w języku C++, która pomimo tego, że nie jest funkcją członkowską klasy, ma uprawnienia dostępu do prywatnych i chronionych danych klasy.
- Funkcja znajomego to funkcja niebędąca członkiem lub zwykła funkcja klasy, która jest deklarowana za pomocą słowa kluczowego friends wewnątrz klasy. Deklarując funkcję jako zaprzyjaźnioną, nadawane są jej wszystkie uprawnienia dostępu.
- Słowo kluczowe friends jest umieszczane tylko w deklaracji funkcji, ale nie w jej definicji.
- Kiedy wywoływana jest funkcja znajomego, nie jest używana ani nazwa obiektu, ani operator kropki. Może jednak zaakceptować obiekt jako argument, do którego wartości chce uzyskać dostęp.
- Funkcję znajomego można zadeklarować w dowolnej sekcji klasy, tj. publicznej, prywatnej lub chronionej.
Deklaracja funkcji przyjaciela w C++
Składnia:
class { friend (argument/s); };>
Przykład_1: Znajdź największą z dwóch liczb za pomocą funkcji znajomego
C++
#include> using> namespace> std;> class> Largest {> > int> a, b, m;> public> :> > void> set_data();> > friend> void> find_max(Largest);> };> void> Largest::set_data()> {> > cout <<> 'Enter the first number : '> ;> > cin>> a;> > cout <<> '
Enter the second number : '> ;> > cin>>b;> }> void> find_max(Largest t)> {> > if> (t.a>t.b)> > t.m = t.a;> > else> > t.m = t.b;> > cout <<> '
Largest number is '> << t.m;> }> int> main()> {> > Largest l;> > l.set_data();> > find_max(l);> > return> 0;> }> |
>
>
Wyjście
Enter the first number : 789 Enter the second number : 982 Largest number is 982>