[C con Clase] para que strcpy

Steven Davidson steven en conclase.net
Vie Jun 8 18:49:10 CEST 2007


Hola Rodolfo,

El pasado 2007-06-08 15:17:10, rodolfo escribió:

r> Hola a todos.-
r> Gracias Steven, como siempre aclarado el punto, aunque en esta ocasion creo 
r> que
r> mi pregunta no estuvo completa, me falto esto.

Veamos la 2ª parte de la duda.

r> Estoy revisando un programa que sobrecarga operadores para una
r> clase llamada Cadena.
r> Programa:
r> int main()
r> {
r>    Cadena c1( "feliz" );

[CORTE]

r> nota mia: ¿ porque es necesario strcpy( ptrC, cadena2 )?
r>           porque no simplemente copio el puntero de cadena2 en ptrC
r>           hacieno ptrC = cadena2;
r>           para que ptrC apunte a la direccion de "feliz", que no esta usando
r>           nadie, ¿o si?.
r>           ¿ para que necesito crear otra cadena en otro lugar ?
r>           ¿ que hay de malo con el lugar que ocupa "feliz" ?

Bien. En primer lugar, ten presente que podemos instanciar cuantos objetos queramos. Esto significa que cada objeto tiene su propio puntero. Si copiamos los punteros, en lugar de crear nueva memoria para cada objeto, y por tanto cada puntero, obtendremos que todos los objetos no contienen los caracteres sino que apuntan a diferentes cadenas. Esto infiere que al modificar el contenido de una cadena, por asociación, modificamos todos los objetos cuyos punteros apuntan a la misma cadena. Por ejemplo,

Cadena a( "feliz" ), b( a ), c( b );
c[0] = 'F';  // Esto realmente daría un error

cout << a << endl;
cout << b << endl;
cout << c << endl;

En pantalla, aparecería:

Feliz
Feliz
Feliz

Esto ocurre porque todos los punteros apuntan a la misma cadena.

La razón de crear una clase 'Cadena', y posteriormente instanciar diferentes objetos, es para manipular diferentes "cadenas de caracteres". Por ello, cada objeto crea su propia memoria para manipular su propia cadena de caracteres.


En cuanto a las cadenas literales, éstas son controladas por el compilador y se consideran constantes. Por lo tanto, no podemos modificar su contenido, que seguramente provocaría un error en tiempo de ejecución.


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase