Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] reference type

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41

    [C++] reference type

    Scusate forse non ho capito molto bene l'utilizzo del tipo reference:

    codice:
    template <typename type>
    type& CMatrix<type>::operator() (const unsigned& row, const unsigned& col) {
        return this->matrix[row][col];
    }
    in questo caso ad esempio (sto scrivendo una classe per lavorare su matrici) definisco il function object che presi due unsigned row e col restituisce il valore matrix[row,col] di tipo type, che però non è creato (i.e. copiato) ma è una variabile di tipo reference. Cioè se ho ben capito la reference è un tipo di variabile che mi consente di accedere in sola lettura all'indirizzo di matrix[row][col] piuttosto che creare una variabile di tipo type contente il valore matrix[row][col]. Inoltre sempre se ho ben capito, al variare del valore memorizzato all'indirizzo matrix[row][col] varia anche ciò che restituisce la reference (cioè è come se puntasse a quella cella, ma non ci posso fare sopra le operazioni che farei con un pointer, ma solamente leggere ciò che è memorizzato a quell'indirizzo).

    Domanda: la reference è un tipo di variabile e quindi occupa memoria o è qualcos'altro che non riesco a capire?

    grazie, Iacopo.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    function object? Quella è una funzione di classe non un function object.
    Cioè se ho ben capito la reference è un tipo di variabile che mi consente di accedere in sola lettura all'indirizzo di matrix[row][col]
    No, accedi proprio all'elemento presente in matrix[row][col] non all'indirizzo contenuto (non hai &matrix[row][col]), e ci accedi con la possibilità di modificarlo ( i reference servono a questo ). E' const type& che non ti da questa facoltà (cioè i const reference).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    function object? Quella è una funzione di classe non un function object.
    Si hai ragione l'overload di operator() non è usato per creare un function object in questo caso.

    No, accedi proprio all'elemento presente in matrix[row][col] non all'indirizzo contenuto (non hai &matrix[row][col]), e ci accedi con la possibilità di modificarlo ( i reference servono a questo ).
    Ma quindi qual'è il senso? figurati pensa te che io ho sempre passato tutto via reference e pensavo facesse un'altra cosa. Cioè ho sempre pensato che fosse come un operatore di referenza o come diamine si chiama (& variabile == address). Invece mi stai dicendo che fa tutt'altro, ritorna quindi una variabile (perchè se reference è un tipo sarà anche una variabile dico bene?) grazie alla quale posso andare ad agire sull'elemento "referenziato" senza crearne copie. Questo è il vantaggio?
    Altrimenti non capisco perchè non passare proprio un indirizzo che però magari può dare problemi a runtime se per caso puntasse chissà cosa, cioè io non passo gli indirizzi spesso perchè mi è sempre sembrata una cosa molto suscettibile all'errore. Da quanto avevo capito il modo sicuro di farlo era tramite reference ma forse non avevo ben compreso.....

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    grazie alla quale posso andare ad agire sull'elemento "referenziato" senza crearne copie. Questo è il vantaggio?
    Si. Un vantaggio che si evidenzia specialmente quando i parametri sono classi, la cui copia è onerosa.
    Altrimenti non capisco perchè non passare proprio un indirizzo che però magari può dare problemi a runtime se per caso puntasse chissà cosa,
    Appunto per non avere problemi a runtime. Un reference è sempre legato a doppio filo a una variabile, pertanto non può andarsene per i fatti suoi. Insomma un reference è per sempre.
    Puoi pensarlo come a un puntatore mascherato con regole molto più ferree.
    codice:
    int i = 10;
    int *p = &i;
    
    int k = 20;
    p = &k; // valido.
    /////////////////////////////
    
    int i = 10;
    int& p = i;
    
    int k = 20;
    p = k; // ERRORE!
    Lo svantaggio di questo è che non si possono avere array di reference e se una classe contiene una variabile reference essa può essere inizializzata solo nella constructor list e non nel corpo del costruttore.

    Il vantaggio è che accedi alla variabile referenziata con una sintassi naturale e con la certezza che sarà sempre legata a qualcosa di valido (non come un puntatore di cui occorre controllare che sia non NULL per poi dereferenziarlo).
    Ultima modifica di shodan; 17-01-2014 a 11:50
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Grazie mille per il chiarimento.

    i

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 © 2025 vBulletin Solutions, Inc. All rights reserved.