2012-01-09 22 views
26

Codice va in primo luogo:La funzione membro const può restituire un puntatore non-const a un membro dati?

class A 
{ 
    public: 
     ... 
     int *foo() const 
     { 
      return _px; 
     } 
    private: 
     int *_px; 
} 

La funzione di membro foo restituisce un puntatore non-const a private membro _px, che, credo, si apre una porta alla modifica membro _px, giusto?

È foo a const funzione membro? Dovrei aggiungere uno const davanti al tipo di ritorno?

UPDATE

Che const-membro-funzione dovrebbe garantire è che, non può cambiare tutti i dati-utente, giusto?

Nel mio caso, la funzione foo non apre una porta per la modifica class A s dati-membro _px, ma una porta per modificare ciò che _px indicando, Quindi la mia domanda è, fa questo violano ciò che un const-funzione deve garantire ?

+1

Cosa dice il compilatore con avviso abilitato? – Arunmu

+2

@ArunMu gcc 4.6.1 non dice nulla. – jrok

+0

@ArunMu, beh, non sembra niente. – Alcott

risposta

27

Una funzione membro const può restituire un puntatore o un riferimento const a un membro.

Tuttavia, l'esempio non restituisce un puntatore a un membro; restituisce una copia di un membro che sembra essere un puntatore. Ciò è consentito in una funzione membro const (anche se il puntatore si posiziona in un altro membro).

Questo non sarebbe stato consentito (si noti che è ora di tornare un punto di riferimento):

int *& foo() const {return _px;} 

ma questo sarebbe (che restituisce un riferimento const):

int * const & foo() const {return _px;} 
+0

Signore, la tua spiegazione è abbastanza chiara e corretta. IMO, 'pippo' in' classe A' apre una porta per modificare cosa '_px' punta a, il quale, penso, rende' pippo' una funzione membro non const, giusto? – Alcott

+0

@Alcott: 'const' su una funzione membro protegge solo i membri dell'oggetto stesso, non altri livelli di riferimento indiretto. Quindi all'interno della funzione '_px' è effettivamente' int * const'; il puntatore stesso non può essere modificato, ma il suo obiettivo può essere. –

4

int *_px diventa int *const _px all'interno di un membro const la funzione implica che il puntatore non può essere riposizionato ma i dati puntati sono ancora modificabili. Inoltre la tua funzione restituisce una copia del puntatore in modo che non importi comunque.

1

Sì, per il tuo caso può. Tuttavia, è generalmente consigliato di non farlo, perché permette di cambiare gli oggetti costanti:

void f(const A& a) 
{ 
    *(a.foo()) = 42; // damn! 
} 
3

Non aprire una porta alla modifica _px ma piuttosto quello che _px punti. Sta a te decidere se vuoi permetterlo o meno.

Ad esempio, un iterator::operator-> restituirebbe un puntatore non const e const_iterator::operator-> restituirebbe un puntatore const. Entrambi i metodi possono essere const stessi.

+0

Sì, apre una porta per modificare a cosa '_px' punta. – Alcott

Problemi correlati