Originariamente inviata da
Eddy16391
Buona sera ragazzi,
mi sono da poco affacciato al mondo del C++ e quindi mi stavo leggendo la guida che c'è sul sito.
Poi però è obbligatorio un buon libro.
la mia domanda è, questi prototipi sono obbligatori? A cosa servono?
2) Servono a far capire al compilatore che parametri accetta la funzione che stai usando.
1) Ni. L'esempio 26 non è un campione di chiarezza in quanto prima mette il prototipo, poi la definizione e infine il main. In questa sequenza, il prototipo è inutile. Se però metti in sequenza il prototipo, il main e la definizione e commenti il prototipo, il compilatore non sa che funzione stai usando (che sia definita appena più sotto non conta, conta solo la linea in cui la invochi) e si lamenta.
A parte questi esempi minimali in cui si opera su un file solo, i prototipi sono sempre obbligatori quando si opera su più file.
Un'altra domanda, qual'è la differenza tra il passare alle funzioni i parametri per valore o per riferimento? Perchè non riesco a capire quale sia la differenza dagli esempi che hanno fatto, se non formale, visto che i risultati sono identici.
Altro esempio infelice, nel quale però puoi evincere il perché del prototipo.
Il tipico esempio è la funzione swap.
Domanda: quale funzione scambia i due valori?
Quale funzione che scambia i due valori è più elegante?
codice:
include <iostream> // questo è l'header corretto!
void swap_byval(int a, int b);
void swap_byptr(int* a, int* b);
void swap_byref(int& a, int& b);
int main () {
int x = 10;
int y = 20;
std::cout << "no swap: X = " << x << "; Y = " << y << endl;
swap_byval(x,y);
std::cout << "swap_byval: X = " << x << "; Y = " << y << endl;
swap_byptr(&x,&y);
std::cout << "swap_byptr: X = " << x << "; Y = " << y << endl;
swap_byref(x,y);
std::cout << "swap_byref: X = " << x << "; Y = " << y << endl;
return 0;
}
void swap_byval(int a, int b) {
int c = a;
a = b;
b = c;
}
void swap_byptr(int* a, int* b) {
int c = *a;
*a = *b;
*b = c;
}
void swap_byref(int& a, int& b) {
int c = a;
a = b;
b = c;
}