2009-07-10 20 views
5

Sto cercando di imparare C++ tramite alcuni tutorial web. Non ho a disposizione un compilatore, altrimenti proverei a farlo. Non sono sicuro di cosa si intende per un puntatore const. Significa solo che punta sempre allo stesso indirizzo di memoria? Perché vorresti mai farlo? Il seguente codice sarebbe legale?Nuovo in C++. Domanda su puntatori costanti

... 
int * const aPointer = new int; 
... //do something with aPointer 
delete aPointer; 
... //do something else, including possibly more 'new' statements 
aPointer = new int; 
... 

risposta

1

Un puntatore const significa che è possibile modificare il valore della variabile che viene sottolineato, ma non è possibile modificare in cui il puntatore è puntato. Non li uso spesso io stesso, ma un'applicazione comune per i puntatori const consiste nel definire specifici segmenti di memoria che è necessario indirizzare. Vedere this question per ulteriori informazioni.

Come parte, dovresti cercare di ottenere un compilatore sul tuo computer, se puoi. Mi sono mostrato molte volte che i cervelli umani sono poveri compilatori C++.

3

Non puoi imparare a guidare un'auto solo leggendo libri.

Ottieni te stesso un compilatore C++ se vuoi imparare il C++. g ++ è gratuito, così come Visual Studio 2008 Express Edition.

Per quanto riguarda la tua domanda, un puntatore const è una zona di memoria che è solo pronto. Esempio: una classe può fornire accesso in sola lettura a un buffer interno.

Nota che anche voi avete il puntatore const che è anche const, alias

const char * const p 

In questo caso, anche il valore del puntatore non può essere modificato.

+3

Questo post è confuso e non distingue chiaramente tra quando il valore è const e quando il puntatore è const. –

+0

Ci vuole molto di più che leggere un post per capire chiaramente l'idea comunque. –

+1

Non puoi imparare le leggi sul traffico solo guidando. Non imparerai come programmare senza programmare, e non imparerai cosa è legale e affidabile senza leggere libri. –

0

Nel codice, il puntatore non può spostarsi, ma i dati puntati possono cambiare.

È legale fino alla prima eliminazione. Una successiva non funzionerebbe perché è un compito assegnato a una costante.

E 'relativamente raro vedere questo, più comune è quello di vedere dove i dati hanno indicato è immutabile ma il puntatore può muoversi.

int bar; 
int baz; 
const int * foo = &bar; 
*foo = 4; // illegal 
foo = &baz; // legal 

avere sia puntatore e il valore di essere const è comune con le stringhe

const wchar_t * const myString = L"String that will never change."; 
9

puntatore Const potrebbe significare un paio di cose diverse. Raccomando di controllare il C++ FAQ Lite sull'argomento.

si può avere:

const int* p; 
int* const p; 
const int* const p; 

Tutte e tre le cose cattive diverse. Sì, è un po 'confusionario.

Nel tuo caso, si ha il secondo, il che significa che si ha un puntatore costante a un oggetto non costante. Cioè, puoi cambiare il valore dell'intero tramite il puntatore, ma non puoi cambiare a cosa punta il puntatore. Quindi il codice che hai postato non sarebbe legale.

18

Un modo semplice per ricordare come funziona const con i puntatori è ricordare che si applica sempre a ciò che è a sinistra, a meno che non sia la parola chiave a sinistra, nel qual caso si applica a destra.

Esempi:

puntatore ad un char costante: Il puntatore può essere cambiato per puntare a qualcosa di diverso, ma il carattere che punti inizialmente di non può cambiare il valore.

const char * p; 

puntatore costante a un char: Il puntatore non può essere modificato per puntare a qualsiasi altra cosa, ma il carattere a cui punta può cambiare il valore.

char *const p; 

puntatore costante a un char costante: Il puntatore non può essere modificato per puntare a qualsiasi altra cosa, e il carattere a cui punta non può cambiare il valore.

const char *const p; 
+0

Il secondo e il terzo esempio hanno un const errato. Intendi char * const p; –

+0

Grazie per aver capito. –

1

Il tuo codice non è legale. Non è possibile assegnare a aPointer (eccetto l'utilizzo dell'inizializzazione stile copia, che di fatto non è assegnata anche se sembra che sia) se aPointer è dichiarato const in questo modo.

Ma di solito quando la gente dice "un puntatore const", significa const int * aPointer, non int * const aPointer come nel codice. L'intera internet spiegherà la differenza con la goccia di un cappello. Per quanto ne so, il termine "puntatore const" non è definito nello standard, quindi siamo liberi di farlo anche se è potenzialmente confuso. "Pointer-to-const" sarebbe una descrizione non ambigua e un pointer-to-const è molto più comunemente usato di un puntatore-che-è-stesso-const.

Un puntatore-che-è-stesso-const viene utilizzato per riferirsi a qualcosa, in cui non si desidera che il puntatore si riferisca a una cosa diversa in qualsiasi punto della sua vita. Ad esempio, this è un puntatore-che-è-stesso-const, perché "questo oggetto" rimane lo stesso oggetto attraverso l'esecuzione di una funzione membro. Il linguaggio C++ ha scelto di non lasciarti decidere in parte che vuoi assegnare un altro valore a this, per fare riferimento ad altri oggetti. I riferimenti in C++ spesso servono anche a questo scopo, dal momento che non possono essere "ri-inseriti" per cambiare il referente.

0

Dal momento che siete nuovi a C++, per la risposta a questa domanda e molte altre domande si può avere o non sai di avere, controlla la C++ FAQ

0

Non ho un compilatore a mia disposizione, altrimenti avrei provare questo fuori

Ognuno ha un compilatore C++ a loro disposizione: http://www.online-compiler.com

ci sono molti altri, ma questo s EEMS al lavoro ...

2

G'day,

per ricordare questo facilmente è possibile utilizzare il trucco che Scott Meyers descrive nel suo eccellente libro "Effective C++" (sanitised Amazon link)

si disegna una linea attraverso la dichiarazione in cui si trova l'asterisco.

  • Se la parola chiave const appare a sinistra della linea, non è possibile modificare il valore dell'elemento a cui si punta.
  • Se la parola chiave const appare a destra della linea, non è possibile modificare il puntatore in modo che punti a un'altra posizione.
  • Se const appare su entrambi i lati, non è possibile modificare il puntatore e non è possibile modificare il valore di ciò che si sta puntando.

BTW Questo libro è eccellente, e anche se non per un principiante, è sicuramente un modo per portare la conoscenza del C++ al livello successivo! Altamente raccomandato.

HTH

acclamazioni,

+0

Durante l'insegnamento di C, ho fatto riferimento ad esso come una regola di "copertura". –

+0

Queste regole (e quel libro) sono eccellenti. –

0

Come è stato già sottolineato il puntatore const forse più comune è

const char* p; 

La variabile p può cambiare, ma i punti dati p To è unmodifable .

Tuttavia, spostare la parola chiave const a sinistra l'asterisco non altera il significato della dichiarazione:

char const* p; 

preferisco il più tardi in quanto diventa molto più facile da ricordare dove posizionare le parole chiave const quando dichiarando puntatori const ai puntatori const:

char const* const* p; 

nuovo, la variabile p può cambiare ei dati indicato è immodificabile. Inoltre, i dati sono dichiarati come puntatori const che significa che punta a dati che non possono essere modificati.

La notazione più comuni per questo tipo è

const char* const* p; 

Posizionando la parola chiave const immediatamente a sinistra dell'asterisco essa modifica (o commerciale per riferimento) rende facile creare tipi complessi che coinvolgono la parola chiave const. Ad esempio, un puntatore a puntatori const:

char const** p; 

e un puntatore const ai puntatori:

char* const* p; 

Ricordatevi di "leggere" le dichiarazioni di puntatore da destra a sinistra, e non si dichiarano più di un puntatore in ogni affermazione per evitare un sacco di confusione.