4.5.3 Operaciones permitidas con estructuras
§1 Sinopsis
La únicas operaciones con estructuras que se permiten en C++ son las siguientes:
- Asignación (asignarlas o ser asignadas)
- Obtener su dirección (referenciarlas mediante punteros)
- Ser utilizadas como argumento de funciones
- Ser utilizadas como valor de retorno de funciones
§2 Asignarlas o recibir asignación como entidad única
En estos casos, origen y destino de la asignación tiene que ser del mismo tipo, aunque si no lo son, todavía es posible la asignación miembro a miembro. Ejemplo:
struct A {
int i,j;
} a, a1;
struct B {
int i,j;
} b;
a = a1; // OK: mismo tipo, se realiza asignación miembro a miembro
a = b; // ILEGAL: tipos diferentes
a.i = b.i; a.j = b.j; // Ok: asignación miembro a miembro
Observe que la asignación anterior se refiere a
instancias de estructuras, no a las clases en sí mismas (recuerde que las estructuras son un tipo especial de clases
4.5). Es decir:
struct StrA { ... };
stuct StrB = StrA; // Error!!
La asignación anterior no está permitida. Sin embargo, puesto que se trata de clases puede construirse una estructura que contenga exactamente los mismos elementos que otra anterior derivándola por herencia:
struct StrB : StrA {};
Sin embargo, recordemos que en este caso ambas estructuras son tipos distintos, por lo que más tarde no pueden efectuarse asignaciones del tipo:
StrA Sa;
StrB Sb = Sa; // Error. Tipos distintos!!
§3 Obtener su dirección
Ver al respecto "Operadores de puntero" (
4.9.11b). Ejemplo:
struct StrA sa;
struct StrA* sptr;
sptr = &sa;
Nota: en el capítulo correspondiente (
4.5.7) se detallan todos los aspectos relativos a los punteros a estructuras. Recordar aquí que al ser
un tipo de clases, les son aplicables los mismos principios y reglas que a aquellas. En concreto todo lo señalado respecto a
punteros. Ver a este respecto: Punteros a clases (
4.2.1f) y Punteros a miembros (
4.2.1g).
§4 Pasar como argumento a funciones
El paso puede realizarse de varias formas:
void f1(StrA sa); // directamente
void f2(StrA* sptr); // mediante un puntero a estructura
void f3(StrA& sref); // mediante una referencia
Más detalles al respecto en: argumentos de funciones
(
4.4.5).
§5 Ser devueltas por funciones
Una función puede devolver una estructura, un puntero a estructura o incluso una referencia:
StrX f1(void); // f1() devuelve una estructura
StrX* f2(void); // f2() devuelve puntero a estructura
Más detalles al respecto en: Valor devuelto
(
4.4.7).
§6 Observe que en principio no están permitidos los operadores de relación con las estructuras. Es decir,
estos objetos no pueden ser comparados (
4.9.12):
StrA sa;
StrB sb;
sa =< sb; // Ilegal !!
Nota: la razón es que el compilador C++ no define tales operadores por defecto para las estructuras.
Sin embargo, es posible sobrecargarlos y utilizarlos con ellas, con lo que la expresión anterior resultaría perfectamente legal.
Ver al respecto el capítulo dedicado a la sobrecarga de operadores
( 4.9.18).