La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II Prof. Dr. Gustavo Patiño MJ 16- 18 19-09-2013.

Presentaciones similares


Presentación del tema: "Informática II Prof. Dr. Gustavo Patiño MJ 16- 18 19-09-2013."— Transcripción de la presentación:

1 Informática II Prof. Dr. Gustavo Patiño MJ

2 Una clase es un concepto extendido de una estructura de datos: En lugar de albergar sólo datos, también puede albergar datos y funciones. Un objeto es una instanciación de una clase. En términos de variables, una clase sería el tipo de dato y el objeto sería la variable.

3 class Las clases son generalmente declaradas usando la palabra clave class, con el siguiente formato: class class_name { access_specifier_1: member1; access_specifier_2: member2;... } object_names; class class_name { access_specifier_1: member1; access_specifier_2: member2;... } object_names;

4 Donde class_name es un identificador valido para la clase. Object_names es una lista opcional de nombres de objetos de esta clase. El cuerpo de una declaración puede contener miembros, que pueden ser datos o declaración de funciones y opcionalmente access specifiers. class class_name { access_specifier_1: member1; access_specifier_2: member2;... } object_names; class class_name { access_specifier_1: member1; access_specifier_2: member2;... } object_names;

5 La declaración de clases es muy semejante a la declaración de estructuras de datos, excepto que ahora podemos incluir también funciones y miembros, y también este nuevo elemento llamado access specifiers.. Un access specifiers es una de los siguientes tres palabras claves: privatepublicprotected.

6 Estos especificadores modifican los derechos de acceso que los miembros que le siguen pueden tener: Miembros privados (private) Son accesibles solamente desde el interior de otros miembros de la misma clase, o desde sus amigos (friends). Miembros protegidos (protected): Accesibles desde miembros de la misma clase y desde sus amigos, y también desde miembros de sus clases derivadas. Miembros públicos (public): Accesibles desde cualquier lugar donde el objeto respectivo es visible.

7 class Por defecto, todos los miembros de una clase declarada con la palabra clave class tienen acceso privado de todos sus miembros. Por lo tanto, cualquier miembro que es declarado antes de otro especificador de clase, automáticamente tiene acceso privado. Por ejemplo: class RectanguloC{ int x, y; public: void def_valores (int,int); int area (void); } rect; class RectanguloC{ int x, y; public: void def_valores (int,int); int area (void); } rect;

8 Note la diferencia entre el nombre de la clase y el nombre del objeto: En el previo ejemplo RectanguloC es el nombre de la clase (o sea el nuevo tipo de dato), mientras que rect es un objeto del tipo RectanguloC. Es la misma relación que existe entre int y a en la siguiente declaración: int a; class RectanguloC { int x, y; public: void def_valores (int,int); int area (void); } rect; class RectanguloC { int x, y; public: void def_valores (int,int); int area (void); } rect;

9 Después de la declaración anterior de RectanguloC y rect, es posible referirse en el cuerpo del programa a cualquier miembro publico del objeto rect, como si ello fuese una función o una variable, colocando únicamente el nombre del objeto seguido de un punto (.), y luego colocando el nombre del miembro. Esto es semejante a lo que se hace también con estructuras de datos: rect.def_valores (3,4); myarea = rect.area(); rect.def_valores (3,4); myarea = rect.area(); class RectanguloC { int x, y; public: void def_valores (int,int); int area (void); } rect; class RectanguloC { int x, y; public: void def_valores (int,int); int area (void); } rect;

10 En este ejemplo, los únicos miembros de rect que a los que no se puede acceder en el cuerpo del programa son x y y, dado que ellos tienen acceso privado y sólo pueden ser invocados desde el interior de otros miembros de la misma clase. class RectanguloC{ int x, y; public: void def_valores (int,int); int area (void); } rect; class RectanguloC{ int x, y; public: void def_valores (int,int); int area (void); } rect;

11 area: 12

12 El operador scope :: especifica la clase a la cual pertenece el miembro que esta siendo declarado. En el ejemplo del RectanguloC, la función def_valores() puede usar las variables x y y, las cuales son miembros privados de la clase RectanguloC. Ya que la función area() ha sido definida dentro de la definición de clase, no es necesario usar el operador scope usado para definir la función def_valores().

13 En conclusión, cuando una función se declara dentro de una clase, y no se define allí mismo, su definición deberá ser fuera de la clase, requiriendo el uso del operador scope ::

14 Una de las grandes ventajas de una clase, es que como cualquier otro tipo de dato, es posible declarar varios objetos de la misma clase.

15 Por ejemplo, en el código donde se define la clase RectanguloC, es posible declarar otro objeto rectb, además del objeto rect. Estos serian dos objetos independientes de la misma clase RectanguloC.

16 Area de rect: 12 Area de rectb: 30 Area de rect: 12 Area de rectb: 30

17 Este es el concepto básico de la Programación orientada a objetos: Las funciones y los datos son ambos miembros de cada objeto. Cada uno de estos objetos, tienen sus propias variables y funciones miembro.

18 Nótese que en este ejemplo, no ha sido necesario dar ningún parámetro de entrada en el llamado a las funciones rect.area o rectb.area. Estas funciones han usado directamente los datos definidos al interior de los respectivos objetos rect y rectb.

19 Los objetos generalmente necesitan inicializar variables o asignar memoria dinámica durante su proceso de creación a fin ser plenamente operativos y evitar valores inesperados durante su ejecución.

20 En el ejemplo de RectanguloC qué hubiera sucedido si se hubiese invocado la función area() antes de llamar a la función def_valores()?

21 A fin de evitar resultados inesperados, las clases pueden incluir una función especial llamada constructor, la cual es automáticamente llamada cuando un nuevo objeto de esta clase es creado. Esta función constructor debe tener el mismo nombre de la clase y no puede tener ningún tipo de retorno, ni siquiera void. A continuación se muestra el mismo ejemplo de RectanguloC incluyendo ahora un constructor:

22 Area de rect: 12 Area de rectb: 30 Area de rect: 12 Area de rectb: 30

23 Nótese la manera cómo los argumentos son pasados al constructor en el momento en que el objeto de esta clase es creado. Los constructores no pueden ser llamados explícitamente como si fueran funciones regulares. Ellos son solamente ejecutados cuando un nuevo objeto de la clase es creado. RectanguloC rect (3,4); RectanguloC rectb (5,6); RectanguloC rect (3,4); RectanguloC rectb (5,6);

24 Igual que cualquier otra función, un constructor también puede ser sobrescrito con más de una función que tenga el mismo nombre pero diferentes tipos o números de parámetros.

25 Recuérdese que para el caso de funciones sobrescritas, el compilador llamará aquella cuyos parámetros coincidan con los argumentos usados en el llamado a la función. En el caso de constructores, la definición que será ejecutada será aquella cuyos argumentos anotados coincidan con la declaración del objeto.

26 Area de rect: 12 Area de rectb: 25 Area de rect: 12 Area de rectb: 25

27 Importante: Nótese la manera como se declara un objeto y se quiere usar el constructor por defecto (aquel sin parámetros). No se usan paréntesis (): Rectangle rectb; // correcto CRectangle rectb(); // Incorrecto! Rectangle rectb; // correcto CRectangle rectb(); // Incorrecto!

28 Si en la definición de una clase no se declara ningún constructor, el compilador asume que la clase tiene un constructor por defecto sin ningún argumento. Por lo tanto, después de declarar una clase como la siguiente: class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; } }; class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; } };

29 El compilador asume que la clase CExample tiene un constructor por defecto, de este modo es posible declarar objetos de esta clase simplemente declarándolos sin argumentos: CExample ex; class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; } }; class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; } };

30 No obstante, una vez el programador declara su propio constructor para una clase, el compilador deja de ofrecer un constructor por defecto. De esta manera, es necesario declarar todos los objetos de esta clase de acuerdo a los prototipos de constructor definidos dentro de la clase. Por ejemplo:

31 En este caso, la siguiente declaración será correcta: Pero, no será correcta, ya que la clase ha sido declarada para tener un constructor explicito, reemplazando de este modo el constructor por defecto. CExample ex (2,3); CExample ex; class CExample { public: int a,b,c; CExample (int n, int m) { a=n; b=m; }; void multiply () { c=a*b; }; }; class CExample { public: int a,b,c; CExample (int n, int m) { a=n; b=m; }; void multiply () { c=a*b; }; };

32 En el lenguaje C++ es perfectamente valido crear apuntadores para clases. Para ello es importante recordar que una vez una clase ha sido declarada, una clase se vuelve un nuevo tipo de dato. De este modo es posible usar el nombre de la clase como el tipo de dato para el apuntador. Por ejemplo: En este caso, prect es un apuntador para un objeto de la clase RectanguloC. RectanguloC* prect;

33 Igual que sucede con estructuras de datos, a fin de referirse directamente a un miembro de un objeto apuntado por un apuntador, es posible usar el operador flecha (->).

34 Area de a: 2 Area de *b: 12 Area de *c: 2 Area de d[0]: 30 Area de d[1]: 56 Area de a: 2 Area de *b: 12 Area de *c: 2 Area de d[0]: 30 Area de d[1]: 56

35 A continuación se presenta un resumen de la manera como se puede interpretar un apuntador y los operadores de clases (*, &,., ->, [ ]).


Descargar ppt "Informática II Prof. Dr. Gustavo Patiño MJ 16- 18 19-09-2013."

Presentaciones similares


Anuncios Google