Newsgroup: it.comp.lang.c++
Titolo: Passaggio di parametri const per valore.

Salve a tutti.
In tema di pignolerie...
...quale utilità può avere un passaggio di questo tipo?
  void Funzione(const int i);
Il const non è ridondante e condiziona inutilmente l'implementazione
della funzione?
Salutoni,
Marcello.

...

No, il const non è ridondante. E' però quasi inutile in questo caso, a meno
che tu non voglia *effettivamente* evitare di modificare un valore
temporaneo.
In realtà ciò che in genere si passa come const sono i puntatori o i
reference (in quanto modificarli comporterebbe una modificazione
dell'oggetto passato alla funzione, sempre A MENO CHE non si voglia
esattamente questo).
Per intenderci, una delle utilità che si potrebbe avere dal passaggio di un
puntatore o un reference const, è nel caso si debbano passare GRANDI OGGETTI
(e il passaggio per valore risulti troppo costoso).
Ciao
Domenico Barra

 esattamente questo).
In realta' in una dichiarazione come quella dell'OP, dove comunque
l'oggetto e' passato per valore, il const *e'* ridondante, tanto che il
compilatore e' libero di ignorarlo.
Nella definizione della funzione le cose cambiano, intanto perche'
comunque il compilatore e' tenuto a verificare che l'oggetto non venga
modificato. Nel caso di uno scalare, come nell'esempio, la cosa non ha
molta importanza; nel caso invece di una classe definita dall'utente
potrebbe averne, perche' questa potrebbe causare side-effect nei suoi
metodi non-const, che esulano dall'oggetto effettivamente copiato. In
questo caso pero' si porrebbe il problema del significato di definire
const un metodo (un metodo const e' libero di modificare un oggetto
puntato da un membro, se questo e' definito come puntatore a non-const). 
Ciao,
Nicola

 della funzione?
Si, anche a me sembra sia inutile.
EMG

modificato.
Vorresti dire che in genere dichiari una funzione 'bool x(int a)', e poi
nella definizione la chiami 'bool x (const int a)' ? Dato che non ho il
tempo di fare un programma di prova, non ho verificato se ciň sia possibile
(non mi sembra, ma posso sbagliarmi), ma mi sembra una mancanza di coerenza
...
Domenico

 (non mi sembra, ma posso sbagliarmi), ma mi sembra una mancanza di coerenza
E' specificato cosi' dallo standard (c'e' stata una discussione sul tema
abbastanza di recente su comp.lang.c++.moderated). Siccome il parametro
e' passato per valore, al chiamante non fa differenza.
Ciao,
Nicola

e' passato per valore, al chiamante non fa differenza.
Sorry, non lo sapevo, grazie.
Tuttavia io manterrei sempre la definizione uguale alla dichiarazione, non
credi?
Ciao
Domenico

della funzione?
In generale no.  Innanzi tutto considera che i parametri sono visti
come variabili locali alla funzione, in particolare e` lecito
scrivere:
void f(int i) {
   ...
   i =5;
}
Chiaramente trattandosi di passaggio per valore l'operazione non
modifica l'eventuale variabile utilizzata come parametro nella
chiamata di funzione.
Dichiarando il parametro const, impedisci del tutto una simile
operazione, inoltre se il parametro e` una istanza di classe,
il const impedisce di chiamare su quel parametro metodi
non const. Se i metodi di un oggetto possono avere effetti anche su
altre istanze (tramite membri statici), l'uso di const puo` essere
molto importante.
Paolo
-------------------------------------------
  Paolo Marotta
 
http://web.tiscalinet.it/paolo_marotta/
-------------------------------------------

credi?
Concordo, in generale e` un'ottima e ragionevolissima linea guida 
quella di mantenere inalterata la dichiarazione dalla definizione
(anche nei nomi dei parametri). Considerato anche che spesso
quello che interessa vedere e` il prototipo e non la definizione...


 credi?
Certamente. Anzi, benche' il meccanismo sia giustificato dal punto di
vista funzionale, lo trovo fuorviante. D'altronde il C++ ci piace per
queste cose, no?
Ciao,
Nicola