Clase o estructura en C++: el eterno debate
\n\nImagina la situación: estás escribiendo código en C++ y necesitas crear un nuevo tipo de datos. Inmediatamente surge la pregunta en tu mente: «¿Cuándo debo usar class y cuándo struct?». Esta pregunta no solo atormenta a los principiantes: en Stack Overflow ha acumulado miles de visitas y decenas de acalorados debates. Y no es de extrañar: en C++, estas dos palabras clave a primera vista hacen lo mismo, pero con matices.
\n\nEn este artículo, aclararemos de una vez por todas cuál es la diferencia real entre class y struct, cuándo elegir qué y cómo no meter la pata. ¡Vamos allá!
La principal diferencia: modificadores de acceso por defecto
\n\nSi piensas que class y struct son entidades completamente diferentes, estás equivocado. En C++, la única diferencia fundamental entre ellos es el modificador de acceso por defecto:
- \n
- struct: todos los miembros (campos y métodos) son por defecto
public. \n - class: todos los miembros son por defecto
private. \n
Eso es todo. No hay más diferencias a nivel de lenguaje. Ni rendimiento, ni magia. Solo accesibilidad. Veamos con ejemplos cómo funciona esto.
\n\nEjemplo con struct
\nstruct Point {\n int x;\n int y;\n};\n\n// Se puede acceder directamente\nPoint p;\np.x = 10;\np.y = 20;\n\nEjemplo con class
\nclass Point {\n int x; // ¡private por defecto!\n int y;\npublic:\n void setX(int val) { x = val; }\n void setY(int val) { y = val; }\n};\n\nPoint p;\n// p.x = 10; // ¡Error! x es private\np.setX(10); // Así sí se puede\n\nComo ves, la diferencia está solo en cómo «ocultas» los datos por defecto. Pero esto no significa que elegir entre class y struct sea cuestión de gustos. Existen prácticas establecidas.
\n\n¿Cuándo elegir struct?
\n\nEn la comunidad de C++ hay un consenso tácito: struct es para datos simples. Usa struct cuando tu tipo sea simplemente un conjunto de campos públicos sin lógica compleja. Ejemplos clásicos:
\n\n- \n
- Coordenadas de un punto (
x, y) \n - Color en RGB (
r, g, b) \n - Configuración (
width, height, title) \n - Resultado de una operación (
success, errorMessage) \n
En estos casos, no es necesario ocultar los datos, ya que son públicos de por sí. struct hace que el código sea más limpio y corto. Además, struct es ideal para tipos POD (Plain Old Data): estructuras que se pueden copiar con un simple memcpy.
Ejemplo de uso correcto de struct
\nstruct Vector2 {\n float x;\n float y;\n \n // Se pueden agregar métodos simples\n float length() const {\n return std::sqrt(x*x + y*y);\n }\n};\n\n// Lo usamos como un contenedor de datos simple\nVector2 v = {3.0f, 4.0f};\nstd::cout << v.length(); // 5.0\n\nObserva: incluso si struct tiene métodos, es normal. Lo importante es que los campos sigan siendo públicos y el tipo no requiera lógica de invariantes compleja.
¿Cuándo elegir class?
\n\nClass es la opción por defecto para objetos completos. Usa class cuando:
- \n
- Tienes lógica compleja que requiere encapsulación. \n
- Quieres controlar estrictamente cómo se modifican los datos. \n
- Tu tipo tiene invariantes (por ejemplo, «la edad no puede ser negativa»). \n
- Usas herencia, funciones virtuales, polimorfismo. \n
Un ejemplo clásico es la clase «Cuenta bancaria». El saldo no debe ser público, de lo contrario alguien podría establecer accidentalmente un valor negativo.
\n\nEjemplo de uso correcto de class
\nclass BankAccount {\nprivate:\n double balance;\n std::string owner;\n \npublic:\n BankAccount(const std::stri