Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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;


  Inicio.


[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