Inicio > Programación > C++: Diferencias entre estructuras y clases

C++: Diferencias entre estructuras y clases

Miércoles, 5 de agosto de 2009 Dejar un comentario Ir a comentarios

cpp1

Desde hace mucho tiempo me he preguntado acerca de las diferencias y similitudes a la hora de usar clases y estructuras en C++, pero hasta ahora no me había parado a buscar información sobre ello. La única diferencia entre las structs y las classes es que los miembros de las estructuras son public por defecto, y los miembros de las clases son private. Suele haber una idea equivocada de que una estructura de C++ es lo mismo que una estructura de C, y que por lo tanto hay muchas diferentes entre las estructuras y clases, como que las estructuras no tienen constructores, métodos miembro o herencia. Sin embargo, como ya he dicho solo se diferencian por el ámbito de las variables miembro.

Las estructuras de C

Las estructuras de C son bestias bastante simples. Solo contienen tipos de datos primitivos como miembros, y todos son visibles a cualquier cosa que pueda acceder a la definición de la estructura. No tienen métodos, constructores o destructores, y no incorporan un mecanismo de herencia.

Las estructuras de C++

Sin embargo, las estructuras de C++ no son lo mismo que las de C. Es cierto que C++ es totalmente compatible con las declaraciones de estructuras de C; cualquier definición legal de una estructura en C compilará y definirá exactamente lo mismo que se hace en C. Pero en C++, las estructuras pueden hacer mucho más. De hecho, las estructuras de C++ son exactamente lo mismo que las clases, en todo menos en un aspecto.  Si declaramos miembros en una estructura de C++ de la siguiente forma

struct Foo
{
    int bar;
    char* baz;
};

Los miembros de la estructura tendrán visibilidad pública por defecto, que quiere decir que la siguiente función:

Foo makeFoo()
{
    Foo temp;
    temp.bar = 1;
    temp.baz = "test";
    return temp;
}

Compilará bien. Sin embargo, si por el contrario definimos una clase como la sigiente:

class Foo
{
    int bar;
    char* baz;
};

Entonces la función ahora no compilará, debido a que los miembros de la clase son privados por defecto. Para solucionar esta situación puedes declarar dichas variables como públicas:

class Foo
{
public:
    int bar;
    char* baz;
};

Pero … sorpresa, sorpresa, también puedes cambiar la visbilidad de los miembros de la estructura para que sean por ejemplo privados:

struct Foo
{
private:
    int bar;
    char* baz;
};

Por supuesto, establecer la visibilidad de las variables miembro no tiene mucho sentido si no hacemos uso de todo el resto de funcionalidades que nos proporcionan las clases: funciones miembro, constructores, destructores, herencia, etc. Con las estructuras de C++ se puede decir lo mismo. Prueba lo siguiente:

#include <iostream>
using namespace std;

struct Example
{
    int a;

    Example(int b);
    void printA();
};

Example::Example(int b)
{
    a = b;
}

void Example::printA()
{
    cout << "a = " << a;
}

Compila bien.

Fuentes de información:

GD Star Rating
loading...
C++: Diferencias entre estructuras y clases, 8.5 out of 10 based on 2 ratings
Share
  1. alfa
    Jueves, 6 de agosto de 2009 a las 07:41 | #1
    GD Star Rating
    loading...

    Esa es la unica diferencia?, tambien soportan la herencia?

  2. Martes, 11 de agosto de 2009 a las 22:15 | #2
    GD Star Rating
    loading...

    Por lo que he leído así es. Ya he probado a usar la herencia con las estructuras en C++ y funciona sin ningún tipo de problema ;)

  3. Lunes, 17 de agosto de 2009 a las 19:18 | #3
    GD Star Rating
    loading...

    En si, es la única diferencia, si bien no soy gran fanático de C++, por pruebas y dudas que me surgieron he hecho pruebas e incluso se puede hacer que una clase herede de una estructura o que una estructura herede de una clase. Es algo bastante loco pero es así.

  1. Sin trackbacks aún.