Clases y funciones miembro.
Categoría: 1. Programación y electrónica.
Las palabras clave private y public son especificadores de acceso que definen derechos de acceso.
- Si en una declaración de variables se usa public, el programa funciona. Pero si en la declaración de funciones se usa private, las funciones miembro y los objetos declarados en main() no van a tener acceso a ellas y el programa no se puede compilar.
El propósito de la designación private pretende de manera específica imponer seguridad en los datos requiriendo que todo el acceso a los miembros de datos provate sea a través de las funciones miembro proporcionadas.
En general, todas las funciones de clase deberrían ser publlic; como tales suministran capacidades para manipular las variables de clase desde fuera de la clase.
La función constructora tiene un propósito definido en especial: puede usarse para inicializar miembros de datos de clase con valores.
En la sección de implementación de la clase, del programa 9.1, las tres funciones miembro se escriben para permitir capacidades de inicialización, asignación y despliegue, respectivamente.
Las funciones miembro definidas en la sección de implementación tienen el mismo formato que todas las funciones de C++ escritas por el usuario con la adición del nombre de clase y el operador de resolución de alcance, ::, que identifica la función como un miembro de una clase particular.
En un lenguaje puro orientado a objetos todos los tipos de datos se construyen como clases, todos los valores de datos son objetos, todos los operadores pueden ser sobrecargados y cada operación con datos sólo puede ejecutarse usando una función que es miembro de una clase.
Aunque un lenguaje híbrido, como C++, debe tener la capacidad de definir clases, la característica distintiva de un lenguaje híbrido es que es posible escribir un programa completo sólo usando código de procedimientos.
Una forma de aumentar de manera significativa la pproductividad del programador es crear código que pueda utilizarse sin una revisión, prueba y revalidación extensas.
Proporcionar una interfaz gráfica de usuario (GUI) en la cual un usuario pueda moverse con facilidad incluso en una sola ventana es un desafío utilizando código de procedimientos. Programar ventanas múltiples y quizá superpuestas en la misma pantalla gráfica aumenta enormemente la complejidad cuando se usa código de procedimientos.
El hecho de permitir al programador definir nuevos tipos de datos, como por ejemplo un tipo rectangular, del cual pueden crearse y desplegarse en pantalla objetos rectangulares específicos, forma la base de la orientación a objetos de C++.
Una clase define tanto datos como funciones. La sección de declaración declara tanto los tipos de datos como las funciones para la clase. Luego se usa la sección de implementación para definir las funciones cuyos prototipos se han declarado en la sección de declaración.
class Nombre_clase
{
+ miembros de datos o variables de instancia miembros de
+ funciones miembro la clase
};
Por ejemplo,una fecha puede almacenarse como tres números enteros, uno para el ems, día y año, respectivamente. De manera alternativa, también puede usarse un solo número entero largo en la forma aaaammdd. Usando la implementación del número entero largo la fecha 5/16/08 se almacenaría como el número entero 20080516. Para ordenar fechas, el formato de número entero largo es muy atractivo debido a que la secuencia numérica de las fechas corresponde a la secuencia del calendario. El propósito de la designación private pretende de manera específica imponer seguridad en los datos requiriendo que todo el acceso a los miembros de lso datos private sea a través de las funciones miembro proporcionadas. Este tipo de acceso, el cual restringe que un usuario vea la manera en que los datos están almacenados en realidad, se conoce como ocultamiento de datos. una vez que se designa una categoría de clase como private, permanece en vigor hasta que se enlista una categoría nueva.
Después de los miembros de datos de la clase private, los prototipos de función enlistados en la clase Fecha se han declarado com public. Esto significa que estas funciones de clase pueden ser llamadas por los objetos y funciones que no estén en la clase (externos). Ver imagen 1.
Aunque se ha elegido en forma interna almacenar todos los años como valores de cuatro dígitos (1999) que conserven información del siglo, los usuarios están acostumbrados a ver fechas donde el año es representado como un valor de dos dígitos, com 12/15/99. Para desplegar los últimos dos dígitos del valor del año, puede usarse la expresión 1999%100 que produce el valor 99 y si el año es 2006, la expresión 2006%100 produce el valor 6. Hay que observar que si se ha usado una asignación como anio=anio%100; en realidad se alteraría el valor almacenado de anio para que correspondiera a los últimos dos dígitos del año. Dado que se desea conservar el año como un número de cuatro dígitos, debe tenerse cuidado en sólo manipular el valor desplegado usando la expresión anio%100 dentro del flujo cout. Los manipuladores setfill y setw se utilizan para asegurar que los valores desplegados corresponden a fechas aceptadas de manera convencional. por ejemplo, la fecha marzo 9, 2006, debería aparecer como 3/9/06 o 03/09/06. El manipulador setw obliga a que se despliegue cada valor en un ancho de campo de 2. Dado que este manipulador sólo tiene efecto para la siguiente inserción,se ha incluido antes del despliegue de cada valor de datos. Sin embargo, como el manipulador setfill permanece en efecto hasta que se cambia el carácter de relleno, sólo se ha incluido una vez. Aquí se ha usado el manipulador setfill para cambiar el carácter de relleno de su valor por omisión de un espacio en blanco al carácter 0. Hacer esto asegura que una fecha como diciembre 9, 2006, aparecerá como 12/09/06 y no 12/9/6.
int main()
{
Fecha a, b, c(4,1,2000);
b.estFecha(12,25,2006);
a.mostrarFecha( );
b.mostrarFecha( );
c.mostrarFecha( );
return 0;
}
Las variables definidas como parte de una clase declarada por un usuarion se conocen como objetos.
Cuando se define el objeto a, la función constructora Fecha es invocada en forma automática. Debido a que no se han asignado parámetros a a, se usan los valores por omisión de la función constructora, produciendo la inicialización:
a.mes = 7
a.dia = 25
b.anio = 2006
La siguiente instrucción en main( ), b.estFecha(12,25,2006), llama a la función estFecha de b, la cual asigna los valores de argumento12, 25, 2006 a los miembros de datos de b, lo que produce la asignación:
b.mes = 12
b.dia = 25
b.anio = 2006
Hay que observar que una instrucción como cout
Es importante entender que debido a que todos los miembros de datos de la clase fueron especificados como private, una instrucción como b.mes = 12 sería inválida dentro de main( ).
Cada vez que un objeto nuevo es instanciado, es decir creado, se crea un conjunto nuevo de miembros de datos pertenecientes al objeto.
Visto de esta manera, una clase puede considerarse como una guia a partir de la cual pueden crearse instancias (objetos) particulares. Cada instancia (objeto) de una clase tendrá su propio conjunto de valores particulares para el conjunto de miembros de datos especificados en la sección de declaración de la clase.
Además de los tipos de datos permitidos para un objeto, una clase también define el comportamiento; es decir, las operaciones que se permite que se ejecuten en los miembros de datos de un objeto.
El código del programa 9.1 se encuentra en el archivo de texto adjunto.
Constructores
Una función constructora es cualquier función que tenga el mismo nombre que su clase.
El propósito deseado de un constructor es inicializar los miembroa de datos de un objeto nuevo. Como tal, dependiendo del número y tipos de argumentos suministrados, una función constructora es invocada de manera automática cada vez que se crea un objeto.
Una función constructora también puede ejecutar otras tareas como los constructores que llaman o los constructores sobrecargados y en línea, como mueatra el código de los programas 9.3 y 9.3a, en el archivo de texto adjunto.
El término constructor por omisión se usa con bastante frecuencia en C++. Se refiere a cualquier constructor que no requiere ningún argumento cuando es invocado. Esto puede deberse a que no se declararon argumentos, lo cual sucede con el valor por omisión suministrado por el compilador, o debido a que todos los argumentos se les han dado valores por omisión.
Del mismo modoen que los constructores pueden sobrecargarse, también pueden escribirse como funciones en línea. Hacerlo así tan sólo significa definir la función en la sección de declaración de la clase.
Bibliografía
Bronson, Gary, J. 2007. C++ para ingeniería y ciencias. Segunda edición. International Thomson Editores. México.