domingo, 11 de abril de 2010

if( &other != this )

Cuando se escribe el operator =, hay que protegerse contra la asignación de una variable consigo misma, por ejemplo:
a = a;
Esto cobra mas importancia si "a" es un objeto de una clase que tiene algun puntero al interior, porque a veces el operator= lo primero que hace es borrar el puntero guardado.

La fórmula, usualmente es una construcción de este estilo:

MiClase& operator=( MiClase& otro ) {
if( &otro != this ) {
...
}
return *this;
}


De este modo, el hacer
a = a;
hará nada, pues en ese caso, &other y this apuntaran a la misma direccion de memoria.

Strings

Definición
Los strings en C "no existen" como tipo, pero se toma una convención: Los strings son arreglos unidimensionales de caracteres que terminan en el caracter ASCII 0 ('\0').

Si se cumple con esta definición. se cuenta con una coleccion de funciones para trabajar con strings (strlen(), para calcular el largo, strcpy(), para copiar el contenido de un string a otro, etc. )

Caso especial: String literal
Los strings literales usan la comilla doble. El compilador transforma los string literales en arreglos unidimensionales con un 0 al final.

Definir una variable asi:
char *s = { 'h', 'o', 'l', 'a', '\0' };

es similar a haberlo hecho asi:
char *s = "hola";


Errores comunes:
- No dejar espacio suficiente para el caracter de fin.
char str[4];

strcpy( str, "hola" ); // <-- "hola" -> 5 caracteres, str -> espacio solo para 4

- Creer que un string ya tiene memoria por solo haber definido un puntero a char.

char *str;  // <-- no hay solicitud de memoria  strcpy( str, "problemas" );

pero, la definicion y la inicializacion inmediata sí solicita memoria
char *str = "no hay problemas";  // solicitud de memoria implicita

Punteros

Definición

Los punteros (o apuntadores) son variables que pueden guardar direcciones de memoria.

Dado esto, el lenguaje C ofrece varias alternativas para que un puntero adquiera un valor.

Al definir un puntero, éste ya tiene un valor. Si es una variable global, el valor es 0, si es una variable local (también llamadas automaticas), el valor no está definido y son la fuente de muchos problemas para quienes comienzan a programar en C o C++.


{
int *p; // que valor tiene p?
...
}


Maneras de asignar un puntero

- Asignar la dirección de memoria de otro objeto (usar el operador unario &)

{
int a;
int *p = &a;
...
}


- Asignar alguna dirección de memoria conocida (muy poco portable, peligroso, no recomendable)

{
int *p = 0x321;
...
}

- Solicitar memoria

{
int *p = (int *) malloc( sizeof(int) ); // a la C
int *q = new int; // a la C++
...
}

- Copiar la direccion de memoria que otro puntero guarda

{
int x;
int *p = &x; // direccion de x
int *q = p; // direccion de x
...
}