Recientemente estuve aprendiendo C++ y me di cuenta de que los literales de cadena en C++ tienen que ser constantes, mientras que en C no lo son. Aquí hay un ejemplo. El siguiente código sería válido en C, pero no en C++:
char* str = "Hello World";para hacer lo mismo en C++, se debe usar la siguiente declaración:
const char* str = "Hello World";¿Alguien podría explicar por qué?
C inicialmente no tenía la palabra clave const , por lo que rompería el código heredado si cambiaran los literales para requerir la calificación const después de la introducción de la palabra clave. Sin embargo, los literales de cadena de C son inmutables, por lo que cambiar el contenido es un comportamiento indefinido, incluso si no está calificado como const .
C++, por otro lado, fue diseñado con la palabra clave const . Inicialmente, C ++ permitía que se asignaran literales de cadena a char * s no calificados como const , presumiblemente por compatibilidad con el código C existente. Sin embargo, a partir del estándar C++03, decidieron desaprobar esta funcionalidad en lugar de permitir que la disonancia continuara a perpetuidad. Supongo que la cantidad de código heredado de C++ que se basa en char * s calificados no const que apuntan a literales de cadena es lo suficientemente pequeño como para que sea una compensación valiosa.
Ampliando un poco la respuesta de Christian Gibbons...
En C, los literales de cadena como "Hello World" se almacenan en matrices de char de modo que sean visibles durante la vida útil del programa. Se supone que los literales de cadena son inmutables, y algunas implementaciones los almacenarán en un segmento de memoria de solo lectura (de modo que intentar modificar el contenido del literal desencadenará un error de tiempo de ejecución). Algunas implementaciones no lo hacen, y es posible que intentar modificar el contenido del literal no desencadene un error de tiempo de ejecución (incluso puede parecer que funciona según lo previsto). La definición del lenguaje C deja el comportamiento "indefinido" para que el compilador sea libre de manejar la situación como mejor le parezca.
En C++, los literales de cadena se almacenan en matrices de const char , de modo que cualquier intento de modificar el contenido del literal desencadenará un diagnóstico en tiempo de compilación .
Como señala Christian, la palabra clave const no era originalmente parte de C. Sin embargo, originalmente era parte de C++, y hace que el uso de cadenas literales sea un poco más seguro.
Recuerde que la palabra clave const no significa "almacenar esto en la memoria de solo lectura", solo significa "esto puede no ser el objetivo de una tarea".
Recuerde también que, a menos que sea el operando de los operadores sizeof o unario * , o sea un literal de cadena usado para inicializar una matriz de caracteres en una declaración, una expresión de tipo "matriz de N elementos de T " se convertirá ("decay ") a una expresión de tipo "puntero a T " y el valor de la expresión será la dirección del primer elemento de la matriz.
En C++, cuando escribes
const char *str = "Hello, world"; la dirección del primer carácter de la cadena se almacena en str . Puede configurar str para que apunte a un literal de cadena diferente :
str = "Goodbye cruel world";pero lo que no puedes hacer es modificar el contenido de la cadena, algo como
str[0] = 'h';o
strcpy( str, "Something else" );