Newsgroup: it.comp.lang.c++
Titolo: a che serve const myclass&?

Salve, 
potreste dirmi a cosa serve una dichiarazione come const myclass& dove 
myclass è una classe?
Grazie
 
-- 
Luigi
--
bug windows [5] = {"95", "98", "NT", "Me", "2000"};


Ciao Luigi,
puo´ servire ad esempio, quando dichiari una funzione con un parametro cosi´
fatto, volendo specificare che all´interno di tale funzione non modificherai
l´oggetto passatole, ma potrai utilizzarne i dati ed i metodi.
Pensa ad esempio se myclass avesse definito l´ operatore di assegnamento, e
tu dentro la funzione a cui passi il riferimento a myclass volessi usare il
parametro come operando sinistro e cioe´ gli volessi assegnare un altro
oggetto di tipo myclass.
Il const nel prototipo della funzione ti previene dal farlo.
Es:
class myclass
{
int dummy;
public:
    myclass(int v) :dummy(v) {}
    void set(int v) {dummy = v;}
    int get() {return dummy;}
    operator = (const myclass &mc) {dummy = mc.dummy;}
};
void testclass(const myclass &mc)
{
    myclass localobj(5);
    // mc = localobj; errore in compilazione in quanto mc e´ const
}
int main ()
{
    const myclass myobj(8);
    testclass(myobj);
}
Non so se il programma e´ corretto, se ci sono altre spiegazioni sono ben
accette.
Mauro

Il const nel prototipo della funzione ti previene dal farlo.
Beh, non è il 'vantaggio' migliore...
Passando l'oggetto per riferimento non viene effettuata nessuna copia
di dati, ottenendo prestazioni nettamente superiori ed uso di memoria
limitato.
Luc.

Luc.
Hai ragione,
ma pensavo la domanda si riferisse piu´ alla keyword const associata alla
classe che al fatto di passare per riferimento un oggetto.
Mauro

classe che al fatto di passare per riferimento un oggetto.
Su alcuni sistemi potrebbe essere un ulteriore ottimizzazione.
Luc.

l´oggetto passatole, ma potrai utilizzarne i dati ed i metodi.
non è corretto dire che si possono utilizzarne i metodi. Su di un
oggetto const è consentito richiamare soltanto i metodi dichiarati
anch'essi const.
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it


Si usa nel costruttore di copia per esempio ...

Su alcuni sistemi potrebbe essere un ulteriore ottimizzazione.
inoltre permette di passare alla funzione anche un temporaneo:
class X { };
void f(X&);
void g(const X&);
int main() {
	f( X() ); // errore
	g( X() ); // corretto


 }
e per affettuoso sadismo nei confronti di un certo mio omonimo che sappiamo
essere disturbato da questi aspetti del C++ ricordo che in questo caso sto di
fatto passando un temporaneo anche alla f:
class X { public: X& me() { return *this; } };
void f(X&);
void g(const X&);
int main() {
f( X().me() );
g( X().me() );
}
:-P
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

}
uhm... ma non dovrebbe essere vietato richiamare il metodo non-const
X::me() su un temporaneo?


 X::me() su un temporaneo?
Perche' mai? Un metodo non const puo' essere chiamato su qulunque oggetto che
non sia const. E non sta scritto da nessuna parte che un temporaneo debba essere
const. E tanto meno un oggetto creato con X(). L'oggetto e' temporaneo solo nel
senso che muore alla fine dell'istruzione. Ma non e' un temporaneo creato dal
compilatore, e' creato da me. E un oggetto creato da me non e' mai const (lo e'
la variabile che lo contiene, semmai).


la variabile che lo contiene, semmai).
bene, questo non lo sapevo. Credevo che qualunque temporaneo fosse
const...


 const...
No, pero' e' un rvalue. Gli rvalue non sono modificabili, ma si possono
chiamare i loro metodi, presumo per poter scrivere cose come:
A a = b().c().d();
Questo crea dei problemi sottili, a causa dei quali in sede di votazione
la rappresentanza britannica del comitato ISO aveva suggerito di
impedire la chiamata di metodi non const su oggetti temporanei.
L'esempio classico di questi problemi e' il seguente:
vector<int> v(5,6);
vector<int>::iterator i;
...
*i++ = 5;
Se vector<>::iterator e' implementato con una classe l'istruzione e'
legale, se invece e' un puntatore, no.
Ciao,
Nicola

 legale, se invece e' un puntatore, no.
Scusa, mi sfugge il motivo per cui non dovrebbe essere legale. Me lo
spieghi?
EMG


Oops, mi sono confuso, non so cos'avevo in mente :-(
L'esempio corretto e' il seguente:
std::vector<int> v(5,6);
std::vector<int>::iterator i = --v.end();
Se std::vector<int>::iterator e' una classe, la chiamata e' a
operator--, altrimenti e' il tentativo di applicare l'operatore builtin
a un rvalue.
Ciao,
Nicola

 a un rvalue.
Dici che se i è un oggetto allora --v.end() è legale? A me la sola vista
provoca bruciori di stomaco... :-)
EMG

A a = b().c().d();
quindi sugli rvalue č vietato solo chiamare operator=(), mentre tutti
gli altri metodi (const o non-const) possono essere chiamati?
A proposito: č possibile dichiarare operator=() const?


 A proposito: č possibile dichiarare operator=() const?
Bella domanda.
Non vedo l'ora di istallarmi copiarmi su questa macchina lo standard e
estallarmi il compilatore, cosi' non mi tocca continuare a rispondere al buio!


a un rvalue.
mi sembra un'assimetria non da poco! Come mai č stata scelta questa
linea? Quali vantaggi porta?


 estallarmi il compilatore, cosi' non mi tocca continuare a rispondere al buio!
  ^
Errore di battitura o raffinato latinismo?
Ciao,
Nicola

 wrote in message
news:3B305322...@divalsim.it...

ROTFL !
Purtroppo non posso assumermi la paternità della battuta: e' un typo :-(


Errore di battitura o raffinato latinismo?
dal latino ex-stallare, cioč "stallare fuori da (l'hard disk)"
(qualsiasi cosa voglia dire "stallare").
Ad esempio, a me piacerebbe estallare windows ;-)


 (qualsiasi cosa voglia dire "stallare").
Esatto. Ma ovviamente Nicola lo considerava come derivato da ex-installare
(installare fuori, o disinstallare).
Ma la vera ironia consisteva nel resto della frase: interpretando il verbo in
quel modo si puo' intendere che io volessi di fatto togliere il compilatore per
mettere al suo posto lo standard. Implicitamente intendendo che il compilatore
non e' standard.
Per questo ho risposto con un ROTFL
