Una funzione è un insieme di istruzioni che riceve input, esegue calcoli specifici, e produce output. L'idea è di inserirne alcuni comunemente o ripetutamente svolto compiti insieme per creare a funzione in modo che invece di scrivere più e più volte lo stesso codice per input diversi, possiamo chiamare questa funzione.
In termini semplici, una funzione è un blocco di codice che viene eseguito solo quando viene chiamato.
Sintassi:

Sintassi della funzione
Esempio:
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;> }> |
>
>Produzione
m is 20>
Complessità temporale: O(1)
Complessità spaziale: O(1)
Perché abbiamo bisogno di funzioni?
- Le funzioni ci aiutano riducendo la ridondanza del codice . Se la funzionalità viene eseguita in più punti del software, invece di scrivere lo stesso codice, ancora e ancora, creiamo una funzione e la chiamiamo ovunque. Ciò aiuta anche nella manutenzione poiché dobbiamo apportare modifiche in un solo posto se apportiamo modifiche alla funzionalità in futuro.
- Le funzioni creano codice modulare . Considera un file di grandi dimensioni con molte righe di codice. Diventa davvero semplice leggere e utilizzare il codice, se il codice è suddiviso in funzioni.
- Le funzioni forniscono astrazione . Ad esempio, possiamo utilizzare le funzioni della libreria senza preoccuparci del loro lavoro interno.
Dichiarazione di funzione
Una dichiarazione di funzione indica al compilatore il numero di parametri, i tipi di dati dei parametri e restituisce il tipo di funzione. Scrivere i nomi dei parametri nella dichiarazione della funzione è facoltativo ma è necessario inserirli nella definizione. Di seguito è riportato un esempio di dichiarazioni di funzione. (i nomi dei parametri non sono presenti nelle dichiarazioni seguenti)

Dichiarazione di funzione
Esempio:
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> );> |
>
>
Tipi di funzioni

Tipi di funzioni in C++
Funzione definita dall'utente
Le funzioni definite dall'utente sono blocchi di codice definiti dall'utente/cliente appositamente personalizzati per ridurre la complessità dei programmi di grandi dimensioni. Sono anche comunemente conosciuti come funzioni su misura che sono costruiti solo per soddisfare la condizione in cui l'utente si trova ad affrontare i problemi riducendo nel contempo la complessità dell'intero programma.
Funzione di libreria
Vengono chiamate anche le funzioni di libreria funzioni integrate . Queste funzioni fanno parte di un pacchetto del compilatore già definito e consiste in una funzione speciale con significati speciali e diversi. La funzione incorporata ci dà un vantaggio in quanto possiamo usarli direttamente senza definirli mentre nella funzione definita dall'utente dobbiamo dichiarare e definire una funzione prima di usarli.
Per esempio: sqrt(), setw(), strcat(), ecc.
Passaggio dei parametri alle funzioni
Vengono richiamati i parametri passati alla funzione parametri effettivi . Ad esempio, nel programma seguente, 5 e 10 sono parametri effettivi.
Vengono richiamati i parametri ricevuti dalla funzione parametri formali . Ad esempio, nel programma precedente xey sono parametri formali.

Parametro formale e parametro effettivo
Esistono due modi più diffusi per passare i parametri:
- Passa per valore: In questo metodo di passaggio dei parametri, i valori dei parametri effettivi vengono copiati nei parametri formali della funzione. I parametri effettivi e formali vengono archiviati in posizioni di memoria diverse, pertanto eventuali modifiche apportate alle funzioni non si riflettono nei parametri effettivi del chiamante.
- Passa per riferimento: Sia i parametri effettivi che quelli formali si riferiscono alle stesse posizioni, quindi qualsiasi modifica apportata all'interno della funzione si riflette nei parametri effettivi del chiamante.
Definizione della funzione
Passa per valore viene utilizzato laddove il valore di x non viene modificato utilizzando la funzione 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;> }> |
>
>Produzione
x = 20>
Complessità temporale: O(1)
Complessità spaziale: O(1)
Funzioni che utilizzano puntatori
La funzione fun() si aspetta un puntatore ptr a un numero intero (o all'indirizzo di un numero intero). Modifica il valore all'indirizzo ptr. L'operatore di dereferenziazione * viene utilizzato per accedere al valore in un indirizzo. Nell'istruzione '*ptr = 30', il valore dell'indirizzo ptr viene modificato in 30. L'operatore indirizzo & viene utilizzato per ottenere l'indirizzo di una variabile di qualsiasi tipo di dati. Nell'istruzione di chiamata della funzione 'fun(&x)', viene passato l'indirizzo di x in modo che x possa essere modificato utilizzando il suo indirizzo.
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;> }> |
>
>Produzione
x = 30>
Complessità temporale: O(1)
Complessità spaziale: O(1)
Differenza tra chiamata per valore e chiamata per riferimento in C++
Chiama per valore | Chiama per riferimento |
---|---|
Una copia del valore viene passata alla funzione | Alla funzione viene passato un indirizzo di valore |
Le modifiche apportate all'interno della funzione non lo sono riflette su altre funzioni | Le modifiche apportate all'interno della funzione vengono riflesse anche al di fuori della funzione |
Verranno creati argomenti effettivi e formali diversa posizione di memoria | Verranno creati argomenti effettivi e formali stessa posizione di memoria. |
Punti da ricordare sulle funzioni in C++
1. La maggior parte dei programmi C++ ha una funzione chiamata main() che viene chiamata dal sistema operativo quando un utente esegue il programma.
2. Ogni funzione ha un tipo restituito. Se una funzione non restituisce alcun valore, viene utilizzato void come tipo restituito. Inoltre, se il tipo restituito della funzione è void, possiamo comunque utilizzare l'istruzione return nel corpo della definizione della funzione non specificando alcuna costante, variabile, ecc. con essa, menzionando solo l'istruzione 'return;' che lo farebbe simboleggiano la cessazione della funzione come mostrato di seguito:
C++
void> function name(> int> a)> {> > .......> // Function Body> > return> ;> // Function execution would get terminated> }> |
>
>
3. Per dichiarare una funzione che può essere chiamata solo senza alcun parametro, dovremmo usare divertimento vuoto (vuoto) . Come nota a margine, in C++, una lista vuota significa che una funzione può essere chiamata solo senza alcun parametro. In C++, sia void fun() che void fun(void) sono uguali.
Funzione principale
La funzione principale è una funzione speciale. Ogni programma C++ deve contenere una funzione denominata main. Serve come punto di ingresso per il programma. Il computer inizierà a eseguire il codice dall'inizio della funzione principale.
Tipi di funzioni principali
1. Senza parametri:
CPP
// Without Parameters> int> main() { ...> return> 0; }> |
>
>
2. Con parametri:
CPP
// With Parameters> int> main(> int> argc,> char> *> const> argv[]) { ...> return> 0; }> |
>
significato di xdxd
>
Il motivo per avere l'opzione del parametro per la funzione principale è consentire l'input dalla riga di comando. Quando usi la funzione main con parametri, salva ogni gruppo di caratteri (separati da uno spazio) dopo il nome del programma come elementi in un array denominato argv .
Poiché la funzione main ha il tipo restituito di int , il programmatore deve sempre avere un'istruzione return nel codice. Il numero restituito viene utilizzato per informare il programma chiamante quale è stato il risultato dell'esecuzione del programma. Restituire 0 segnala che non ci sono stati problemi.
Ricorsione C++
Quando la funzione viene chiamata all'interno della stessa funzione, in C++ si parla di ricorsione. La funzione che richiama la stessa funzione è detta funzione ricorsiva.
Una funzione che richiama se stessa e non esegue alcuna attività dopo la chiamata alla funzione è nota come ricorsione in coda. Nella ricorsione in coda, generalmente chiamiamo la stessa funzione con l'istruzione return.
Sintassi:
C++
recursionfunction()> {> > recursionfunction();> // calling self function> }> |
>
>
Per saperne di più vedere Questo articolo .
C++ Passaggio di array a funzione
In C++, per riutilizzare la logica dell'array, possiamo creare una funzione. Per passare un array a una funzione in C++, dobbiamo fornire solo il nome dell'array.
function_name(array_name[]); //passing array to function>
Esempio: stampa il numero minimo nell'array specificato.
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> |
>
>Produzione
Minimum element is: 10>
Complessità temporale: O(n) dove n è la dimensione dell'array
Complessità spaziale: O(n) dove n è la dimensione dell'array.
organizzazione e architettura informatica
Sovraccarico C++ (funzione)
Se creiamo due o più membri con lo stesso nome ma diversi nel numero o nel tipo di parametri, si parla di sovraccarico C++. In C++, possiamo sovraccaricare:
- metodi,
- costruttori e
- proprietà indicizzate
I tipi di sovraccarico in C++ sono:
- Sovraccarico di funzioni
- Sovraccarico degli operatori
Sovraccarico delle funzioni C++
Il sovraccarico delle funzioni è definito come il processo di avere due o più funzioni con lo stesso nome, ma parametri diversi. Nell'overloading delle funzioni, la funzione viene ridefinita utilizzando tipi o numeri di argomenti diversi. È solo attraverso queste differenze che un compilatore può distinguere tra le funzioni.
Il vantaggio dell’overloading delle funzioni è che aumenta la leggibilità del programma perché non è necessario utilizzare nomi diversi per la stessa azione.
Esempio: modifica del numero di argomenti del metodo 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> |
>
>Produzione
30 55>
Complessità temporale: O(1)
Complessità spaziale: O(1)
Esempio: quando il tipo degli argomenti varia.
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> |
>
>Produzione
r1 is : 42 r2 is : 0.6>
Complessità temporale: O(1)
Complessità spaziale: O(1)
Sovraccarico di funzioni e ambiguità
Quando il compilatore non è in grado di decidere quale funzione deve essere invocata tra le funzioni sovraccaricate, questa situazione è nota come ambiguità di sovraccarico della funzione.
Quando il compilatore mostra l'errore di ambiguità, il compilatore non esegue il programma.
Cause di ambiguità:
- Conversione del tipo.
- Funzione con argomenti predefiniti.
- Funzione con passaggio per riferimento.
Conversione del tipo:-
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> |
>
>
L'esempio sopra mostra un errore il richiamo al “divertimento(doppio)” sovraccarico è ambiguo . Il fun(10) chiamerà la prima funzione. Il fun(1.2) chiama la seconda funzione secondo la nostra previsione. Ma questo non si riferisce ad alcuna funzione come in C++, tutte le costanti in virgola mobile sono trattate come double e non come float. Se sostituiamo float con double, il programma funziona. Pertanto, questa è una conversione di tipo da float a double.
Funzione con argomenti predefiniti: -
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> |
>
>
L'esempio sopra mostra un errore la chiamata di 'fun(int)' sovraccaricato è ambigua . fun(int a, int b=9) può essere chiamato in due modi: il primo è chiamando la funzione con un argomento, cioè fun(12) e un altro modo è chiamando la funzione con due argomenti, cioè fun(4 ,5). La funzione fun(int i) viene invocata con un argomento. Pertanto, il compilatore non potrebbe essere in grado di selezionare tra fun(int i) e fun(int a,int b=9).
Funzione con passaggio per riferimento: -
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> |
>
>
L'esempio sopra mostra un errore la chiamata di 'fun(int&)' sovraccaricato è ambigua . La prima funzione accetta un argomento intero e la seconda funzione accetta un parametro di riferimento come argomento. In questo caso, il compilatore non sa quale funzione è necessaria all'utente poiché non esiste alcuna differenza sintattica tra fun(int) e fun(int &).
Funzione amico
- Una funzione amico è una funzione speciale in C++ che, nonostante non sia una funzione membro di una classe, ha il privilegio di accedere ai dati privati e protetti di una classe.
- Una funzione amico è una funzione non membro o una funzione ordinaria di una classe, che viene dichiarata utilizzando la parola chiave amico all'interno della classe. Dichiarando una funzione come amica, alla funzione vengono concessi tutti i permessi di accesso.
- La parola chiave friend viene inserita solo nella dichiarazione della funzione ma non nella definizione della funzione.
- Quando viene chiamata la funzione friend non viene utilizzato né il nome dell'oggetto né l'operatore punto. Tuttavia, può accettare l'oggetto come argomento al cui valore desidera accedere.
- Una funzione amico può essere dichiarata in qualsiasi sezione della classe, ovvero pubblica, privata o protetta.
Dichiarazione della funzione amico in C++
Sintassi:
class { friend (argument/s); };>
Esempio_1: trova il più grande tra due numeri utilizzando la funzione amico
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;> }> |
>
>
Produzione
Enter the first number : 789 Enter the second number : 982 Largest number is 982>