metodos library index c++ string pointers stl

library - string index of c++



DeclaraciĆ³n de cadena (2)

La declaración de cadenas funciona cuando declaro de las siguientes maneras:

string a = "xyz"; char a[] = "xyz";

Pero en caso de:

char *a = "xyz";

Da un ERROR en el compilador g ++ 4.9.2:

advertencia: conversión obsoleta de la constante de cadena a ''char *'' [-Wwrite-strings] char * a = "xyz";

Creo que estos tres tipos de declaración son diferentes el uno del otro. Por favor, ayúdame.


En versiones anteriores del lenguaje, puede usar:

char* a = "xyz";

Ahora, debes usar:

char const* a = "xyz";

Un literal de cadena, como "xyz" reside en las partes de solo rea del programa. Se puede usar para inicializar un char const* ya que no se supone que modifiques el contenido de lo que char const* . Usarlo para inicializar un char* abre la posibilidad de que un usuario lo modifique accidentalmente. Además, la modificación de tales cadenas es causa de un comportamiento indefinido.

Un literal de cadena también se puede usar para inicializar un char[] . En ese caso, el literal de cadena se copia en el espacio asignado para la matriz. Por lo tanto, no hay riesgo de modificar los datos de solo lectura del programa. Por lo tanto, usando

char a[] = "xyz";

está bien

La línea

string a = "xyz";

invoca el constructor de string que toma una char const* y luego usa ese objeto para inicializar a . Por lo tanto, esa línea también está bien.


string a = "xyz";

Utiliza la sintaxis del inicializador para invocar el constructor std::string( const char* ) .

char a[] = "xyz";

Esto declara una matriz lo suficientemente grande como para almacenar la cadena más el terminador. Sigue las reglas estándar de inicializador de matriz. Piense en ello como equivalente a char a[] = { ''x'', ''y'', ''z'', ''/0'' };

char *a = "xyz";

Esto toma un literal de cadena ( "xyz" ) y lo asigna a un puntero no constante . Dentro del lenguaje, dicho puntero significa que está bien modificar la cadena a la que apunta, pero ese es un comportamiento indefinido en este caso, porque los literales de cadena no pueden modificarse. Para evitar que cometas ese error, el compilador te advierte. Lo siguiente es válido y no emitirá una advertencia:

const char *a = "xyz";