2010-09-14 10 views
109

en C++ específicamente, ¿cuáles son las diferencias semánticas entre por ejemplo:semántica C++ de `const` estática vs` const`

static const int x = 0 ; 

y

const int x = 0 ; 

tanto para static como un enlace y una especificador de clase de almacenamiento (es decir, dentro y fuera de una función).

+6

'static' es probablemente la palabra clave más sobrecargada en C++. El significado de su código varía ampliamente dependiendo de si está en el ámbito del espacio de nombres, en el alcance de la clase o en el alcance de la función. Es posible que desee aclarar eso. – sbi

+1

@sbi: pensé que ya lo hice. Alcance de función (donde es un especificador de clase de almacenamiento) y alcance de archivo (donde es un especificador de vinculación). Los miembros de la clase y las variables relacionadas con el espacio de nombres específicamente no me conciernen con respecto a esta pregunta, aunque si alguien siente que hay una distinción interesante, no dude en cubrirla también. – Clifford

+0

@Clifford: Lamento haber pasado por alto esas últimas palabras. Sin embargo, esto reveló un malentendido de su parte: en C++, el alcance del archivo _es_ el ámbito del espacio de nombres. Si declara algo fuera de cualquier espacio de nombre, simplemente pertenecerá al _global namespace_ (y se puede acceder a través de un prefijo '::' sin identificador en el frente). No estoy al tanto de ninguna diferencia significativa entre el espacio de nombres global y el espacio de nombres anidado en él. Ciertamente no hay ningún objeto relacionado con objetos "estáticos". – sbi

Respuesta

101

En el alcance del archivo, no hay diferencia en C++. const hace que el enlace interno sea el predeterminado, y todas las variables globales tienen una vida útil estática. Pero la primera variante tiene el mismo comportamiento en C, por lo que puede ser una buena razón para usarla.

Dentro de una función, la segunda versión se puede calcular a partir de parámetros, en C o C++ no tiene que ser una constante en tiempo de compilación como lo requieren otros lenguajes.

Dentro de una clase, básicamente lo mismo que para las funciones, se puede calcular un valor de instancia const en el ctor-initializer-list. Un static const se establece durante la inicialización de inicio y permanece sin cambios para el resto del programa. (Nota: el código de static miembros se ve un poco diferente porque la declaración y la inicialización se separan.)

Recuerde, en C++, const significa sólo lectura, no constante. Si tiene un puntero a const, entonces otras partes del programa pueden cambiar el valor mientras no mira. Si la variable se definió con const, entonces nadie puede cambiarla después de la inicialización, pero la inicialización aún puede ser arbitrariamente compleja.

+1

¿Hay algo llamado alcance de archivo? Solo estaba verificando $ 3.3 y creo que el más cercano es 'alcance del espacio de nombres'. ¿Es mi entendimiento correcto? El estándar C++ 03 menciona el alcance del archivo solo en los Apéndices – Chubsdad

+0

. No usó el término "scope del espacio de nombres" porque se activa en una tangente de cómo los miembros de la mayoría de los espacios de nombres tienen enlaces externos por defecto, pero los miembros del espacio de nombres anónimo tienen enlace interno. Lo cual no tiene nada que ver con una pregunta sobre 'static ', excepto que hace que el control estático sea obsoleto. –

+1

Sugeriría que * el alcance del archivo * es un artefacto del enlazador en lugar del compilador, por lo que es posible que no reciba mucha atención en el estándar del lenguaje. Estrictamente, es probablemente el "alcance de la unidad de compilación". – Clifford