Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    9

    [C++] overload operatori

    Ciao!
    Studiavo il c++ ma mi è sorto il seguente dubbio

    Il manuale sul quale studio pone il seguente esempio

    codice:
    class Classe
    {
    public:
    
    	int iNumero;
    	
    	Classe()
    	{
    		iNumero = 0;
    	}
    
    	Classe  &operator += (const Classe &c)
    	{
    		iNumero += c.iNumero;
    
    		return *this;
    	}
    
    };
    perchè, nella funzione membro operatore +=, dovrei ritornare *this come riferimento piuttosto che per valore?

    Che cambierebbe se la definissi nel seguente modo?

    codice:
    class Classe
    {
    public:
    
    	int iNumero;
    	
    	Classe()
    	{
    		iNumero = 0;
    	}
    
    	Classe  operator += (const Classe &c)
    	{
    		iNumero += c.iNumero;
    
    		return *this;
    	}
    
    };

    Grazie mille

  2. #2
    Quello che otterresti è che viene creata una copia temporanea dell'istanza sulla quale hai chiamato l'operatore e quindi viene chiamato il costruttore di copia. In questa semplice classe non credo che ci siano differenze particolari. Altre classi come auto_ptr e simili in cui il costruttore di copia trasferisce dei puntatori tra le istanze, avresti non pochi problemi.


    PS: cambia manuale perchè avere una classe con la sola parte pubblica non mi sembra un gran esempio di programmazione ad oggetti...ma questa è solo una mia opinione

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    9
    Ciao
    Grazie mille per la risposta.
    Scusa ma quindi se io scrivessi una cosa del genere:

    codice:
    Classe c1;
    
    c1.iNumero = 1;
    
    Classe c2;
    
    c2.iNumero = 2;
    
    Classe c3 = c2+=c1;

    se l'operatore += restituisce un indirizzo, cosa succede quando incovo l'operatore? c3 punta a c2? ma c3 non è un puntatore, o sbaglio?


    Grazie per la pazienza ma il manuale che ho (hai ragione lo cambio) non mi spiega nulla inerente a ciò e ho una gran confusione in testa

  4. #4
    Prima di tutto fai attenzione che tornare un Classe & non vuol dire tornare un puntatore/indirizzo ma un reference all'oggetto. C'è differenza tra un reference ed un puntatore e questa la trovi scritta da varie parti (guarda anche le pillole del forum magari trovi qualcosa di utile).
    Nel tuo esempio quindi c3 non punta a c2, ma ne è una copia esatta. In pratica quello che succede è che prima viene eseguito l'operatore + di Classe che ritorna un reference a c2 (è come se tornasse esattamente c2, non una copia e non un puntatore, ma propio c2), poi viene invocato l'operatore di copia (=) di Classe che non essendo definito non fa altro che copiare i vari membri come farebbe in C. Alla fine quello che hai è che c è una copia esatta di c2 ma non è c2.

    In conclusione dovresti documentarti sulla differenza tra un reference ed un puntatore.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    9
    Gazie per la spiegazione.
    Allora, credo di iniziare a comprendere. VVoVe:
    Ho "attinto" informazione dalla traduzione del mitico Thinking in C++.

    In pratica, tornando al codice postato precedentemente, il costruttore di copia di Classe si "inserisce" fra c3 e il riferimento ritornato dalla funzione membro operatore +=, andando a creare un nuovo oggetto (c3) da quest'ultimo.

    Giusto?

    Ma allora, nei tipi standard, se io scrivessi una cosa del genere, cosa accade?

    codice:
    
    int &Fun(int &var)
    {
    	return var;
    }
    
    int y = 3;
    
    int g = Fun(y);
    Ovvero, è il compilatore in automatico a creare la variabile g partendo dal reference ritornato dalla funzione Fun? ( che in sostanza non è altro che y).

    Grazie ancora per la pazienza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    9
    Ho fatto una domanda stupida ,me ne sono accorto solo ora ...però non facciamoci caso, ti prego passamela sono alle prime armi

    Grazie fastcoder

  7. #7
    Non ti preoccupare complimenti per la scelta di Thinking in C++ ottimo punto di partenza

    Buone ferie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.