Creo que te refieres
¿Por qué const implica un enlace interno en C ++?
Es cierto que si declara un objeto constante en el ámbito del espacio de nombres, entonces tiene un enlace interno.
El Apéndice C ( C ++ 11, C.1.2 ) da la justificación
Cambio: un nombre de alcance de archivo que se declara explícitamente const, y no se declara explícitamente extern, tiene un vínculo interno, mientras que en C tendría un vínculo externo
Justificación: Debido a que los objetos const se pueden usar como valores en tiempo de compilación en C ++, esta característica insta a los programadores a proporcionar valores de inicializador explícitos para cada const. Esta característica permite al usuario colocar objetos constantes en archivos de encabezado que se incluyen en muchas unidades de compilación.
Como dijo litb, los
const
objetos tienen enlaces internos en C ++. Esto se debe a que están pensados para usarse así:// a.cpp const int BUFSIZE = 100; char abuf[BUFSIZE]; // b.cpp const int BUFSIZE = 256 int bbuf[BUFSIZE];
fuente
Const y static son conceptos ortogonales tanto en C como en C ++.
La
const
palabra clave le dice al compilador que no permita que la variable aparezca como el lvalue de cualquier expresión, esencialmente haciéndola de solo lectura.En C, la
static
palabra clave tiene varios usos dependiendo de a qué se aplique. Cuando se aplica a una variable de una función, indica que la variable no está almacenada en el ámbito local de una función, pero es accesible a través de sus invocaciones. Cuando se aplica a una función o variable global, se vuelve accesible solo para un archivo en particular; en otras palabras, es accesible solo dentro de la unidad de compilación (a menos que se declareextern
).En C ++, la
static
palabra clave se puede usar dentro de una definición de clase, para hacer que una variable o funciones se compartan en todas las instancias de la clase, en lugar de ser local para cada instancia. Además, una función de clase estática en C ++ solo puede acceder a variables estáticas de esa clase (o clases a las que tiene acceso). Ahora, en C ++const
proporciona a los miembros un enlace interno a la unidad de compilación a menos que se declaren explícitamenteextern
; esto puede ser a lo que se refiere. Esto permite que las constantes de tiempo de compilación se compartan entre unidades mediante el uso de archivos de encabezado. Tenga en cuenta, sin embargo, que los miembros no son realmente estáticos, sino que la constante se compila en cada ubicación donde se hace referencia.fuente
En C & C ++, el término estático tiene múltiples significados (puede gobernar el enlace y el almacenamiento) .Tendrá que leer el D&E de Stroustrup para apreciar su razón de ser, pero cuando declara que una variable es constante en el ámbito del espacio de nombres, automáticamente tiene un enlace interno, mientras que en C tienes que declararlo estático para forzarlo a tener un enlace interno.
Por supuesto, en C ++, el uso de estático para controlar el enlace ha quedado obsoleto, los espacios de nombres anónimos se pueden usar para simular el enlace interno en C ++.
Se suponía que las variables const en C ++ reemplazaban las constantes del preprocesador, y dado que las constantes del preprocesador solo son visibles en los archivos que las definen, de manera similar, const automáticamente hace que la variable sea visible solo en el archivo que la define.
fuente
Esos conceptos son ortogonales y no deben pensarse como lo mismo.
Constness es una propiedad de acceso: indica solo si su variable debe ser de solo lectura (const) o de escritura y lectura (no const).
La estáticidad es una propiedad de por vida (y técnicamente la localización de la memoria): indica si la variable será global en el alcance de una clase (cuando está en una clase) o una unidad de traducción (cuando se usa con una variable global definida en un cpp) .
fuente
No es así, y el ejemplo más obvio es que si tiene una variable miembro constante (que es inicializada por el constructor, por supuesto), no es compartida por todos los objetos de esa clase, sino individual para cada uno.
class A { public: A(int newx) : x(newx); private int x; }
litb da la mejor respuesta, arriba.
fuente
No es así. Escribiendo lo siguiente:
const int i = 0;
no hace
i
estática (en C o C ++).fuente