2009-07-10 11 views
5

Estoy tratando de aprender C++ a través de algunos tutoriales web. No tengo un compilador disponible, de lo contrario probaría esto. No estoy seguro de lo que significa un puntero de const. ¿Eso solo significa que siempre apunta a la misma dirección de memoria? ¿Por qué querrías hacer eso alguna vez? ¿Sería el siguiente código legal?Nuevo en C++. Pregunta sobre punteros constantes

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

Respuesta

1

Un puntero constante significa que usted puede cambiar el valor de la variable que está siendo señaló, pero no se puede cambiar el lugar donde se apunta el puntero. No los uso a menudo, pero una aplicación común para los punteros de const es definir los segmentos de memoria específicos que necesita abordar. Consulte this question para obtener más información.

Como un lado, debe intentar obtener un compilador en su computadora si puede. Me he demostrado muchas veces que los cerebros humanos son pobres compiladores de C++.

3

No puede aprender a conducir un automóvil simplemente leyendo libros.

Obtenga un compilador de C++ si desea aprender C++. g ++ es gratuito, al igual que Visual Studio 2008 Express Edition.

En cuanto a su pregunta, un puntero const es una zona de memoria que está lista solamente. Ejemplo: una clase puede proporcionar acceso de solo lectura a un búfer interno.

en cuenta que también tiene el puntero constante que también es constante, también conocido como

const char * const p 

En ese caso, incluso el valor del puntero no se puede modificar.

+3

Esta publicación es confusa y no distingue claramente entre cuando el valor es const y cuando el puntero es const. –

+0

Toma mucho más que leer una publicación para comprender claramente la noción de todos modos. –

+1

Tampoco puedes aprender las leyes de tráfico simplemente manejando. No aprenderá a programar sin programación, y no aprenderá lo que es legal y confiable sin leer libros. –

0

En su código, el puntero no se puede mover, pero los datos apuntados pueden cambiar.

Es legal hasta la primera eliminación. Una nueva subsiguiente no funcionaría porque es una asignación a una constante.

Es relativamente inusual ver esto, más común es ver hacia dónde apuntan los datos, pero el puntero puede moverse.

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

tener tanto puntero y el valor de ser const es común con cadenas

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

puntero constante podría significar un par de cosas diferentes. Recomiendo ver el C++ FAQ Lite al respecto.

se puede tener:

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

Las tres cosas diferentes medios. Sí, es un poco confuso.

En su caso, tiene el segundo, lo que significa que tiene un puntero constante a un objeto no constante. Es decir, puede cambiar el valor del entero a través del puntero, pero no puede cambiar a qué apunta el puntero. Entonces el código que publicaste no sería legal.

18

Una manera simple de recordar cómo funciona la función con punteros es recordar que siempre se aplica a lo que está a la izquierda, a menos que sea la palabra clave más a la izquierda, en cuyo caso se aplica a la derecha.

Ejemplos:

puntero a un char constante: El puntero se pueden cambiar para que apunte a otra cosa, pero la charla albergar dudas apunta a que no puede cambiar el valor.

const char * p; 

puntero constante a un char: El puntero no se puede cambiar para que apunte a cualquier otra cosa, pero el carbón al que apunta puede cambiar el valor.

char *const p; 

puntero constante a un char constante: El puntero no se puede cambiar para que apunte a cualquier otra cosa, y el carbón al que apunta no puede cambiar el valor.

const char *const p; 
+0

Segundo y tercer ejemplo tienen una const. Te refieres a char * const p; –

+0

Gracias por capturar eso. –

1

Tu código no es legal. No se puede asignar al aPointer (excepto que se usa la inicialización de estilo de copia, que de hecho no es una asignación aunque parezca) si aPointer se declara así.

Pero generalmente cuando la gente dice "un puntero constante", quieren decir const int * aPointer, no int * const aPointer como lo tiene en su código. Todo Internet explicará la diferencia de un sombrero. Hasta donde yo sé, el término "const pointer" no está definido en el estándar, por lo que somos libres de hacerlo aunque sea potencialmente confuso. "Pointer-to-const" sería una descripción inequívoca, y un puntero-a-const es mucho más comúnmente utilizado que un puntero-que-es-sí-const.

Un puntero-que-es-sí-const se utiliza para referirse a algo, donde no querrá que el puntero se refiera a algo diferente en ningún momento de su vida útil. Por ejemplo, this es un puntero-que-es-sí-const, porque "este objeto" sigue siendo el mismo objeto a través de la ejecución de una función miembro. El lenguaje C++ ha optado por no permitirle decidir de manera parcial que desea asignar algún otro valor al this, para hacer que se refiera a algún otro objeto. En C++, las referencias a menudo también sirven para ese propósito, ya que no se pueden "reubicar" para cambiar la referencia.

0

Puesto que usted es nuevo en C++, para la respuesta a esta pregunta y muchas otras preguntas que pueda tener o no sabe que tiene, echa un vistazo a la C++ FAQ

0

no tengo un compilador disponible para mí, de lo contrario habría probar esto

Todo el mundo tiene un compilador de C++ a su disposición: http://www.online-compiler.com

Hay muchos otros, pero este s Eems para trabajar ...

2

día G,

recordar esto fácilmente puede utilizar el truco que Scott Meyers describe en su excelente libro "A partir del C++" (sanitised Amazon link)

dibuja una línea a través de la declaración donde se encuentra el asterisco.

  • Si la palabra clave const aparece a la izquierda de la línea, entonces no puede cambiar el valor del elemento que está señalando.
  • Si la palabra clave const aparece a la derecha de la línea, no puede cambiar el puntero para señalar a otra ubicación.
  • Si const aparece en ambos lados, entonces no puede cambiar el puntero y no puede cambiar el valor de lo que está señalando.

BTW Ese libro es excelente, y aunque no es para principiantes, ¡definitivamente es una forma de llevar tu conocimiento de C++ al siguiente nivel! Muy recomendable.

HTH

aplausos,

+0

Cuando enseño C, me referí a él como una regla de "encubrimiento". –

+0

Estas reglas (y ese libro) son excelentes. –

0

Como ya se ha señalado el puntero constante quizás lo más común es

const char* p; 

La variable P se puede cambiar, pero los puntos de datos p a es unmodifable .

Sin embargo, mover la palabra clave const a la izquierda del asterisco no altera el significado de la declaración:

char const* p; 

prefiero la tarde ya que se vuelve mucho más fácil de recordar dónde colocar las palabras clave const cuando declarar punteros const a los punteros const:

char const* const* p; 

de nuevo, la variable p puede cambiar y los datos señalado es inmodificable. Además, los datos se declaran como punteros const, lo que significa que apunta a datos que no se pueden modificar.

La notación más común para este tipo es

const char* const* p; 

La colocación de la palabra clave const inmediatamente a la izquierda del asterisco se modifica (o signo de referencia) hace que sea fácil crear tipos complejos que implican la palabra clave const. Por ejemplo, un puntero a los punteros const:

char const** p; 

y un puntero constante a los punteros:

char* const* p; 

Recuerde a "leer" las declaraciones de puntero desde la derecha hacia la izquierda, y no declaran más de un puntero en cada declaración para evitar mucha confusión.