4.5a1 Las estructuras C++ como clases
§1 Sinopsis
Las estructuras C++, se implementaron por compatibilidad hacia atrás con el código C clásico, aunque realmente su funcionalidad no era necesaria, ya que las clases sobrepasan ampliamente, y con ventaja, la funcionalidad de las estructuras C.
En realidad, las estructuras C++ son clases (diríamos que "disfrazadas") con algunas particularidades específicas [1]. Por ejemplo, todos sus miembros son públicos. Por esta razón, aunque las clases engloban a las estructuras C, de las que son un superconjunto, gozan de propiedades que estas no tienen.
Su naturaleza de "clases" puede ser puesta de manifiesto con un sencillo ejemplo:
#include <iostream.h>
class B {
public: int x;
};
struct ST : public B {
int fun();
};
int ST:: fun() { return x; }
class CL: public ST {
public: int y;
};
int main(void) { // ===============
ST s;
s.x = 10;
cout << "s.x == " << s.fun() << endl;
CL c;
c.x = 20;
c.y = 30;
cout << "c.x == " << c.fun() << endl;
cout << "c.y == " << c.y << endl;
return 0;
}
Salida:
s.x == 10
c.x == 20
c.y == 30
Resulta evidente que, aparte de su definición (struct); tanto la notación de acceso, como la definición de la propia
función-miembro (algo impensable en las estructuras C); las posibilidad de heredar de otras clases y ser utilizada a su vez como
clase-base, hacen de la estructura ST una auténtica clase C++.
Subsisten sin embargo algunas peculiaridades de las antiguas estructuras C que no han sido totalmente trasladadas a los compiladores C++. Por ejemplo, sean las estructuras anidadas:
struct Ext {
int x;
struct Int {
int x;
};
};
En el C clásico, si no existe en el programa otra estructura con el mismo nombre que la interior, esta puede ser referenciada como si hubiera sido declarada fuera. Las siguientes sentencias serían equivalentes [2]:
struct Int i;
Ext::Int i;
Sin embargo, su correspondiente traducción a clases:
class Ext {
public:
int x;
class Int {
public:
int x;
};
};
No permite, en ninguno de los compiladores probados, utilizar la expresión:
class Int i;
[1] Stroustrup declara que una estructura es un tipo de clase ("a struct is a kind of class"). TC++PL §10.2.1
[2] Actualmente esto se cumple para el compilador Borland C++ 5.5 pero no para MS Visual C++ 6.0 ni para GNU GCC 2.95.2