Estructuras y clases en C ++
C ++ continúa siendo un lenguaje minoritario para el desarrollo integrado, pero los desarrolladores lo adoptan comúnmente cuando los proyectos se vuelven demasiado grandes para que C se pueda usar de manera eficiente. Estos desarrolladores suelen realizar la transición de C a C ++ y las sutiles diferencias entre los lenguajes representan una parte importante de su curva de aprendizaje. C ++ tiene estructuras, como C, porque no son iguales. C ++ tiene clases que son notablemente similares a las estructuras. Este artículo desglosa los detalles de estos elementos del lenguaje.
Estructuras en C
Una estructura en C es un elemento (objeto) de datos compuestos personalizados, que se puede construir a partir de los tipos de datos integrados existentes ( int , char , etc.), campos de bits (números enteros de un tamaño de bits especificado) y otras estructuras. La idea es agregar varios elementos de datos que van juntos. Por ejemplo, una estructura para contener coordenadas tridimensionales podría verse así:
coordenadas de la estructura {float x; flotar y; flotar z;};
Este código le dice al compilador qué coordenadas de estructura parece. Luego puede declarar variables de este tipo así:
ubicación de coordenadas de estructura;
La variable ubicación es de tipo coordenadas de estructura y sus campos internos pueden direccionarse mediante el operador "punto":
ubicación.x =1.0; ubicación.y =2.0; ubicación.z =9.99;
Por supuesto, se podría lograr un efecto similar usando tres flotadores separados variables con nombres como ubicación_x etc. Sin embargo, es mucho más fácil controlar la ubicación como una única variable que se puede pasar a funciones, etc.
La capacidad de incluir campos de bits otorga a las estructuras una capacidad que no está disponible en ninguna otra parte de C. Aquí hay un ejemplo:
struct bitreg {unsigned up:3; sin firmar:3; polaridad sin firmar:2;};
Cada uno de los campos de una variable de tipo struct bitreg tiene un tamaño de bit específico. El compilador se asegura de que los datos se almacenen de manera sensata, por lo que esperaríamos que dicha variable encajara en un byte. Además, todo el código de "bit bashing" para acceder a los campos dentro del byte se genera automáticamente. Entonces, el programador simplemente puede acceder a ellos así:
control struct bitreg; control.up =1; control.down =2; control.polarity =3;
En su mayor parte, el uso de estructuras en C es bastante sencillo y hace que el código sea más fácil de entender sin impacto en la eficiencia de ejecución. Sin embargo, hay dos puntos que los desarrolladores integrados deben tener en cuenta:
- Los procesadores modernos de gama alta (normalmente de 32 bits) tienen conjuntos de instrucciones que se adaptan fácilmente al uso de estructuras. De hecho, fueron diseñados para hacer precisamente esto. Sin embargo, la mayoría de las CPU de gama baja no ofrecen tales eficiencias, por lo que el uso de estructuras necesita cuidado.
- Los campos de bits son una buena característica y pueden resultar en un código eficiente y legible. Los desarrolladores integrados pueden detectar inmediatamente una oportunidad:utilice campos de bits para acceder a los registros de control de dispositivos. Muchos dispositivos periféricos tienen registros de 1 palabra o 1 byte de ancho que contienen varios campos de bits. Esto parece una gran combinación y, a veces, se puede hacer que funcione. Pero hay dos problemas:
- El compilador determina el diseño exacto de los campos de bits. Si todo se asigna correctamente a un dispositivo, es posible que el código funcione bien. Sin embargo, un cambio de compilador, o incluso una simple actualización del compilador, podría romper el código.
- El código generado por el compilador para acceder a los campos de bits probablemente utilizará una serie de operaciones Y / O y múltiples accesos al registro, lo que puede ser problemático. Además, algunos registros de dispositivos son de solo escritura y nunca se incluirían en el código generado por el compilador.
Aunque una estructura en C se parece un poco a un nuevo tipo de datos, en realidad no lo es. Un tipo de datos normalmente tendría un rango de operaciones que se pueden realizar en él; este no es el caso de una estructura C. Para hacer algo en una estructura C, además de hacer un puntero, debe acceder a los campos internos. Este asunto se trata en C ++.
Clases en C ++
El lenguaje C ++ tiene una serie de capacidades orientadas a objetos. Uno de ellos es el concepto de clase , que permite la descripción de algo mucho más parecido a un nuevo tipo de datos. Una variable (normalmente llamada objeto ) se puede instanciar de la clase; es decir, es un objeto de este nuevo tipo.
Una clase C ++ tiene casi exactamente la misma sintaxis que una estructura C y algunas capacidades muy similares. Sin embargo, existen algunas diferencias importantes:
- Una clase también puede contener funciones (llamadas métodos ).
- Los métodos y las variables miembro están ocultos del mundo exterior, a menos que su declaración siga un público:
- Puede haber un par de métodos especiales, el constructor y el destructor, que se ejecutan automáticamente cuando se crea y destruye una instancia de la clase (un objeto), respectivamente.
- Los operadores para trabajar en el nuevo tipo de datos se pueden definir usando métodos especiales (funciones miembro).
- Una clase se puede utilizar como base para la definición de otra (esto se denomina herencia ).
- Para declarar una variable del nuevo tipo (una instancia de la clase; un objeto) solo se requiere el nombre de la clase:la palabra clave clase no es obligatorio.
La mayoría de estas características se ilustran en este ejemplo:
clase myclass {char a; int b; public:void fun (); mi clase(); ~ myclass ();}; myclass myobj; myobj.fun ();
Las variables miembro a y b solo se puede acceder a las tres funciones miembro fun () , myclass () y ~ myclass () . Las dos últimas funciones son el constructor y el destructor. Solo divertido () es probable que se llame mediante el código de usuario. El código real para las tres funciones se definiría en otro lugar asociado con la clase mediante :: operador, así:
void myclass ::fun () {...
Estructuras en C ++
Además de las clases, C ++ tiene estructuras que son compatibles con versiones anteriores de C. Sin embargo, una estructura de C ++ también tiene las mismas capacidades adicionales que poseen las clases. Hay una sola diferencia entre una estructura y una clase en C ++. La accesibilidad predeterminada de las funciones y variables miembro en una clase es privada, como hemos visto; el valor predeterminado en una estructura es público. Por lo tanto, la funcionalidad de la clase anterior también podría expresarse así:
struct mystruct {void fun (); mi clase(); ~ myclass (); privado:char a; int b;};
Uso de clases y estructuras en C ++
Una vez que haya adquirido esta información, se le insta a no explotarla demasiado. Hay muchas razones para usar solo estructuras para el tipo de funcionalidad que ofrecen en C y clases cuando necesita capacidades adicionales. Principalmente, se trata de una cuestión de legibilidad del código. Otro desarrollador puede no ser tan claro en los detalles y el código escrito de una manera "no estándar" será confuso.
Una prioridad clave cuando escribe código es asegurarse de que sea legible (=mantenible). Alguien, podría ser usted, podría necesitar ver este código dentro de un año y comprender lo que hace. Algunos consejos:suponga que la persona que mantendrá su código es un psicópata armado, que tiene poca paciencia y conoce la dirección de su casa.
Incrustado
- Variables, literales y constantes de C++
- Clases y objetos de C++
- Gestión de memoria C++:nuevo y eliminar
- Herencia pública, protegida y privada de C++
- Semáforos:servicios públicos y estructuras de datos
- Grupos de indicadores de eventos:servicios públicos y estructuras de datos
- Java - Objeto y Clases
- Clases de almacenamiento en C++
- C++ Fecha y hora
- Estructuras de datos de C++
- Sobrecarga de C++ (operador y función)