Estructura vs clase en C++

En C++, una estructura funciona de la misma manera que una clase, excepto por dos pequeñas diferencias. El más importante de ellos es ocultar los detalles de implementación. Por defecto, una estructura no ocultará sus detalles de implementación a quien la use en el código, mientras que una clase por defecto ocultará todos sus detalles de implementación y, por lo tanto, evitará que el programador acceda a ellos. La siguiente tabla resume todas las diferencias fundamentales.

Clase

Estructura

Los miembros de una clase son privados por defecto. Los miembros de una estructura son públicos por defecto. 
Las clases/estructuras base de una clase son privadas de forma predeterminada. Las clases/estructuras base de una estructura son públicas de forma predeterminada.
Se declara usando la palabra clave class . Se declara usando la palabra clave struct .
es tipo referencia Es tipo valor.
Se utiliza para la abstracción de datos y la herencia adicional. Se utiliza para agrupar datos.
Puede tener valores NULL No puede tener valores NULL.
Puede tener todos los tipos de constructores y destructores. Puede tener solo un constructor parametrizado.

Algunos ejemplos que profundizan en estas diferencias:

1) Los miembros de una clase son privados por defecto y los miembros de una estructura son públicos por defecto. 

Por ejemplo, el programa 1 falla en la compilación pero el programa 2 funciona bien, 

Programa 1:

C++

// Program 1
// C++ Program to demonstrate that
// Members of a class are private
// by default
using namespace std;
 
class Test {
    // x is private
    int x;
};
 
int main()
{
    Test t;
    t.x = 20; // compiler error because x
              // is private
   
    return t.x;
}

 
 Producción:

prog.cpp: In function ‘int main()’:
prog.cpp:8:9: error: ‘int Test::x’ is private
    int x;
        ^
prog.cpp:13:7: error: within this context
    t.x = 20;
      ^

Programa 2: 

C++

// Program 2
// C++ Program to demonstrate that
// members of a structure are public
// by default.
#include <iostream>
 
struct Test {
    // x is public
    int x;
};
 
int main()
{
    Test t;
    t.x = 20;
   
    // works fine because x is public
    std::cout << t.x;
}
Producción

20

2) Una clase se declara con la palabra clave class y una estructura se declara con la palabra clave struct.

Sintaxis: 

class ClassName {
private:
    member1;
    member2;

public:
    member3;
    .
    .
    memberN;
};

Sintaxis: 

struct StructureName {
    member1;
    member2;
    .
    .
    .
    memberN;
};

3) La herencia es posible con clases y con estructuras.

Por ejemplo, los programas 3 y 4 funcionan bien.

Programa 3:

C++

// Program 3
// C++ program to demonstrate
// inheritance with classes.
#include <iostream>
using namespace std;
 
// Base class
class Parent {
public:
    int x;
};
 
// Subclass inheriting from
// base class (Parent).
class Child : public Parent {
public:
    int y;
};
 
int main()
{
    Child obj1;
   
    // An object of class Child has
    // all data members and member
    // functions of class Parent.
    obj1.y = 7;
    obj1.x = 91;
    cout << obj1.y << endl;
    cout << obj1.x << endl;
 
    return 0;
}
Producción

7
91

Programa 4:

C++

// Program 4
// C++ program to demonstrate
// inheritance with structures.
#include <iostream>
using namespace std;
 
struct Base {
public:
    int x;
};
 
// is equivalent to
// struct Derived : public Base {}
struct Derived : Base {
public:
    int y;
};
 
int main()
{
    Derived d;
   
    // Works fine because inheritance
    // is public.
    d.x = 20;
    cout << d.x;
    cin.get();
    return 0;
}

 
Producción

20

Debe leer: Diferencia entre estructuras C y estructuras C++
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *