Tema 2 – Clases y objetos ¿Qué es una clase?

Una clase es una estructura de datos que se usa para definir tipos que extiendan que provee el lenguaje. Las clases se utilizan por medio de sus instancias denominan objetos. Los objetos del mismo tipo !diferentes instancias de la compartir#n una estructura com$n pero podr#n poseer valores distintos en miembro. los primitivos las cuales se misma clase" sus variables

%e podr&a trazar una analog&a entre una clase y sus objetos con lo que es un molde y los elementos creados a partir de 'l. Una clase define una serie de variables y comportamientos por medio de los cuales se puede crear objetos que poseer#n dic(as variables y comportamientos. Cómo declarar una clase ) diferencia de C** en C+ no (ay un arc(ivo de declaraciones !.(" y otro de definiciones !.cpp" sino que por el contrario todo el c,digo que est' relacionado con una o m#s clases deber# ser incluido dentro de un mismo arc(ivo !.cs". Lo m#s normal es colocar una clase por arc(ivo .cs pero eso es solo una recomendaci,n se puede incluir la cantidad de clases que se quiera.
class <identificador>{ }

-n la declaraci,n el identificador debe ser $nico en un namespace. -l identificador de la clase debe tener un nombre que describa lo que representa la clase !Cliente .roducto etc". Modificadores de acceso /entro de lo que es el 0cuerpo1 de la clase se colocar# la definici,n de todos sus miembros que ser#n datos y m'todos. Las variables miembro de una clase se declaran como variables convencionales pero pueden poseer algunos modificadores de acceso que regulan la visibilidad que posee la variable o el m'todo. Modificador public protected private Acceso )cceso desde cualquier #mbito %olo acceso desde la propia clase y clases derivadas. %olo acceso desde la propia clase. Por default, si no se especifica otra cosa, una variable es privada. %olo acceso desde m'todos de clases que se encuentren dentro del mismo assembly. %olo acceso desde m'todos de clases que se encuentren dentro del mismo assembly m'todos de la misma clase y clases derivadas.

internal protected internal

2

-stas variables se llaman variables de clase y las tradicionales se las llama variables de objeto.. --$onsole'(rite)ine(miObjeto'var. -. $onsole'(rite)ine(Miclase'var/). $onsole'(rite)ine(Miclase'var.--#** "os métodos Las funciones declaradas dentro de una clase se conocen como m'todos y contienen el c.digo que ser# ejecutado por nuestro programa cuando se invocan.ara poder utilizar una clase (ay que crear una instancia !aunque es posible acceder a variables y m'todos est#ticos sin la necesidad de crear objetos de la clase".n ya que no tiene sentido almacenar en objetos valores que ser#n iguales para todos ellos sin excepci.ueden ser accedidas sin necesidad de instanciaci..--#* Miclase'var/ = #**. -ste tipo de variables pueden poseer modificadores de acceso!public private protected. class Miclase{ public string var = !"ola!. } class Main$lass{ public static void Main (string%& args){ Miclase miObjeto = new Miclase(). public string var# = ! como estas!.).n ariables est!ticas . = *. 2 .n sin embargo su valor puede ser modificado como cualquier otra variable. Miclase miObjeto = new Miclase(). Un ejemplo de acceso a variables a trav's de una instancia.). } } Constantes de una clase Las constantes dentro de una clase pueden poseer los mismo modificadores de acceso que las variables. Un objeto es una variable que lleva por tipo una clase. Las constantes pueden ser accedidas sin requerir ninguna instanciaci.n. $onsole'(rite)ine(!{*}{ }!+miObjeto'var + miObjeto'var#). public static int var/ = #*.Tema 2 – Clases y objetos Instanciación .error de compilaci. public const int var. $onsole'(rite)ine(Miclase'var/).".

-sta lista puede estar vac&a.digo que se ejecutar# primero en nuestro programa. . Un ejemplo de uso de m'todos con dos clases3 class Miclase{ public string frase. } } void indica que el m'todo no devuelve ning$n valor. } } Lo mismo pero con una sola clase y con variable y m'todo private3 class Miclase{ string frase. Miclase miObjeto# = new Miclase(). Un identificador3 nombre del m'todo.ar#metros3 lista de variables que recibe el m'todo. } } class Main$lass{ public static void Main (string%& args){ Miclase miObjeto = new Miclase().Tema 2 – Clases y objetos Un m'todo posee3 • • • Un tipo de dato3 es el devuelto por el m'todo cuando finaliza. miObjeto#'imprimir0rase(). miObjeto'frase = !cadena es lo mismo 2ue decir string!. miObjeto#'imprimir0rase(). Miclase miObjeto# = new Miclase(). public void imprimir0rase(){ $onsole'(rite)ine(t1is'frase). miObjeto'frase = !cadena es lo mismo 2ue decir string!. 5 . miObjeto#'frase = !string es lo mismo 2ue decir cadena!. } public static void Main (string%& args){ Miclase miObjeto = new Miclase().n contiene el c. Métodos est!ticos Los m'todos est#ticos se llaman m'todos de clase. miObjeto'imprimir0rase(). miObjeto'imprimir0rase(). void imprimir0rase(){ $onsole'(rite)ine(t1is'frase). -l m'todo est#tico 4ain sirve como punto de entrada a la aplicaci. miObjeto#'frase = !string es lo mismo 2ue decir cadena!.

. La librer&a 9CL ofrece una estructura llamada /ateTime que simplifica el manejo y unifica el almacenamiento de este tipo de datos. } } -n el m'todo est#tico imprimir6ec(a!" se invoca al tipo est#tico 7o8 de la clase /ateTime. .Tema 2 – Clases y objetos #ste tipo de métodos no podr!n acceder a variables de ob$eto%variables no est!ticas& o métodos de ob$etos. 'etornar valores cuadrado:alor!" retorna un entero ya que se especifica el tipo de dato a retornar y al final del m'todo se usa return que retorna el resultado del producto de la variable de instancia valor. $onsole'(rite)ine(!8l valor del cuadrado de {*} es9 { }!+ miObjeto'valor+ miObjeto'cuadrado6alor()). class Miclase{ public static void imprimir0ec1a(){ $onsole'(rite)ine(!)a fec1a actual es {*}!+ 3ate4ime'5ow). miObjeto'valor = *. public int cuadrado6alor(){ return t1is'valor 7 t1is'valor.n. -stos argumentos ser#n usados por el m'todo para realizar alguna acci. class Miclase{ public int valor. 7ormalmente todas las variables miembro son privadas y se accede a ellas por medio de m'todos de tipo set y get para modificar o acceder a su valor. } public static void Main (string%& args){ Miclase'imprimir0ec1a(). } } (so de par!metros Los par#metros sirven para enviar argumentos!valores o referencias" al invocar a un m'todo. } public static void Main (string%& args){ Miclase miObjeto = new Miclase(). -l modo de invocar un m'todo est#tico es por medio del identificador de la clase en lugar del identificador del objeto.

} public static void Main (string%& args){ int num = #*.Tema 2 – Clases y objetos class Miclase{ private int valor. } public static void Main (string%& args){ Miclase miObjeto = new Miclase(). Paso por referencia public static void set6alor>ef(ref int num){ num = *. Miclase'set6alor(num). if(miObjeto'set6alor(==)){ $onsole'(rite)ine(!8l valor es {*}!+ miObjeto'get6alor()). public static void set6alor(int num){ num = *. } public static void Main (string%& args){ int num = #*. bool set6alor(int num){ --si el argumento esta en el rango *:.-.* } < . } } } Paso por valor Usualmente en los m'todos los par#metros de transfieren por copia de valores!a excepci. } int get6alor(){ return t1is'valor. Miclase'set6alor>ef(ref num). }else return false. $onsole'(rite)ine(num). return true. $onsole'(rite)ine(num). Las dos variables se encuentran en posiciones de memoria distintas. } if(miObjeto'set6alor(=)){ $onsole'(rite)ine(!8l valor es {*}!+ miObjeto'get6alor()).n del paso de objetos". if(num >= * << num < *){ t1is'valor = num.--#* } -n num a la de la salida conserva su valor ya que lo que se pasa como argumento a set:alor solo es una copia del valor de num pero no una referencia.

d>ound = Mat1'>ound(d6alor). objeto#'mostrar6alor(). } public static void Main (string%& args){ 6ector objeto = new 6ector(). -n este caso se pasa al m'todo una referencia a otra variable por lo que lo que se (aga con esta en el m'todo tambi'n influir# a la variable externa al m'todo.Tema 2 – Clases y objetos Una referencia es una variable que contiene la direcci.+ out var>ai?+ out var>ound). $onsole'(rite)ine(!>ai?9 {*}!+ var>ai?). objeto'mostrar6alor(). $onsole'(rite)ine(!Metodo constructor con dos parametros!). public static void rai?>ound(double d6alor+ out double d>ai?+ out double d>ound){ d>ai? = Mat1'@2rt(d6alor). class 6ector{ float A = *'*f. -jemplo de m'todo que devuelve el seno y coseno de un n$mero pasado como argumento. } } = . Par!metros de salida %i se necesita que un m'todo devuelva m#s de un valor es posible especificar que ciertos par#metros sean de salida por medio del modificador out. } 6ector(float A+ float B){ t1is'A = A. 6ector(){ $onsole'(rite)ine(!Metodo constructor sin parametros!). -l m'todo constructor no posee tipo de datos de retorno. } #l método constructor -xiste un m'todo especial que es invocado cada vez que un objeto nuevo es creado de forma autom#tica.n de memoria de otra variable. t1is'B = B. -ste m'todo se llama constructor y su identificador debe ser exactamente el mismo que el de la clase de la cual forma parte. } void mostrar6alor(){ $onsole'(rite)ine(!({*}+{ })!+ t1is'A+ t1is'B). float B = *'*f. Tambi'n es posible crear m#s de un constructor cada uno con diferente cantidad de par#metros o con distintos tipos como par#metros. } public static void Main (string%& args){ double var>ai?+ var>ound. Miclase'rai?>ound(#='=. $onsole'(rite)ine(!>edondeo9 {*}!+ var>ound). 6ector objeto# = new 6ector(='*f+ *'*f).

7o se puede controlar exactamente el momento en el cual la memoria asignada vuelve a ser memoria disponible para otros objetos. C . objeto. . 6ector objeto. objeto. -n C+ no existe el operador contrario a ne8 !como s& existe en C** donde dic(o operador se denomina delete".digo.n no funciona para crear copias de objetos3 objeto.Tema 2 – Clases y objetos Constructor de copia -s posible especificar un constructor de copia para poder crear un objeto que sea igual a otro en contenido de datos. = null. Utilizar el operador de asignaci. } -s posible que un constructor invoque otro constructor. = new 6ector(objeto#). Un objeto no poseer# todos los datos en su porci.n es com$n a todos los constructores> no tendr&a ning$n sentido duplicar c.n de memoria3 las constantes y las variables est#ticas estar#n ubicadas en un lugar $nico. $onsole'(rite)ine(!Metodo constructor de copia!). -sto suele realizarse cuando parte de la tarea de inicializaci. 6ector(6ector copia){ t1is'A = copia'A. objeto#'mostrar6alor(). } public static void Main (string%& args){ 6ector objeto# = new 6ector(='*f+ *'*f).ara esto bastar# con pisar la referencia de un objeto por el valor null. C+ gestiona la memoria de modo autom#tico> para esto provee un recolector de basura !garbage collector" que se encarga de eliminar la memoria que en alg$n momento se solicit. y que ya no se utiliza m#s.'mostrar6alor(). = objeto#. Cuando un objeto deja de ser $til lo ideal es recuperar la memoria que ocupa. t1is'B = copia'B. 7o se est# copiando el contenido de un objeto en otro solo se copia la referencia. /espu's de crearse se (ace uso de ellos y llegado un punto dejaran de ser $tiles. )estrucción de ob$etos Los objetos poseen un ciclo de vida.?9A-T?2 objeto5 es una B-6-B-7C@) a objeto2.@) /. Lo que si se puede indicar al sistema cu#ndo un objeto deja de ser $til. } void mostrar6alor(){ $onsole'(rite)ine(!({*}+{ })!+ t1is'A+ t1is'B). -l objeto5 7? -% U7) C?.

'*f). public 6ector(float A+ float B){ t1is'A = A. .digo necesario para desinicializar el objeto. D$'@uppress0inali?e(t1is). -ste m'todo solo es invocado por el garbage collector. #structuras Una estructura es un tipo de dato muy similar a una clase.Tema 2 – Clases y objetos -l destructor es m'todo que se invoca cuando el objeto es destruido. } /e esta manera el garbage collector eliminar# el objeto sin invocar al destructor previamente.lo que posee el car#cter D como prefijo. C6ector(){ $onsole'(rite)ine(!3estructor!). . } -l destructor puede servir para cerrar un arc(ivo y as& asegurarse de que antes de que el garbage collector elimine el objeto el arc(ivo estar&a cerrado.digo de desinicializaci.uede contener pr#cticamente todos los elementos que puede poseer una clase. L a diferencia principal *ue posee es *ue la estructura es un tipo de dato mane$ado por valor.n. { struct 6ector{ float A. float B. -ste m'todo podr# ser invocado manualmente. public void 3ispose(){ $onsole'(rite)ine(!3ispose!). )ll& podremos colocar el c.ero no podemos estableces cu#ndo el garbage collector (ar# su trabajo. %u declaraci. } } } G .n es similar al constructor s.n de diseFo que consiste en crear un m'todo espec&fico que contenga todo el c. } public void mostrar6alor(){ $onsole'(rite)ine(!({*}+{ })!+ t1is'A+ t1is'B). } } class Main$lass{ public static void Main (string%& args){ 6ector vec = new 6ector(='*f+ . namespace ejemploE . vec'mostrar6alor(). Eay una alternativa llamada /isposal que es un patr. t1is'B = B.

-s importante saber si dic(o tipo es una clase o una estructura para no cometer errores.n lo puede cambiar. . es necesario previamente asi./2'# "A M#M/'IA La memoria est# dividida en tres partes Iona de /atos %tacH y Eeap.con las estructuras si se desea invocar alg$n constructor en particular. '#PA. 3ona de )atos La Iona de /atos es donde se guardan las instrucciones del programa las clases los m'todos y las constantes. Para poder utili+ar una estructura. L .n.or ejemplo si ejecutamos un m'todo las variables locales de ese m'todo se guardar&an en el %tacH y al finalizar el m'todo se borran del %tacH pero (ay que tener en cuenta que el %tacH es fijo y solamente estar&amos usando y dejando de usar una parte del %tacH y por esa misma caracter&stica de ser est#tico si lo llenamos caer&amos en un %tacH?verflo8-rror. en tiempo de compilación es cuando se define el tama5o *ue tendr! . 7o es posible practicar (erencia. . -n concreto se . -sta parte de la memoria es totalmente fija y nada durante el tiempo ejecuci. 7o es posible especificar destructores. . 7o es posible especificar constructores sin par#metros. -s posible el uso de ne.tac4 -l %tacH para explicarlo de una manera m#s r#pida se puede imaginar como si fuese un )rray que es de tama5o fi$o durante el tiempo e$ecución del pro. Las estructuras son derivadas de la clase ?bject. Tambi'n se almacenan las variables locales par#metrosKvalores de retorno de los m'todos etc. Las estructuras son asignadas en el stacH mientras que por el contrario los objetos son asignados en el (eap.Tema 2 – Clases y objetos Las diferencias entre una estructura y una clase son3 • • • • 7o es v#lido inicializar las variables en la misma l&nea que su declaraci.uardan dos tipos de elementos.rama./ A C/0C#P1/.nar valor a todas sus propiedades. las referencias a ob$etos%o instancias& y datos de tipo primitivo !int float c(arJ".

con referencia al stacF } } class MB$lass{ public static void Main (string%& args){ MB$lass mBObject. Como interact7an el 6eap y el . -. Las referencias tienen un tipo que est# determinado por la clase de la que se crear# la instancia y puede apuntar a esa clase o subclases!elementos que (ereden de la clase".se crea la referencia en el stacF mBObject = new MB$lass().rimero se crea la referencia luego el objeto y se (ace que la referencia apunte (acia 'l luego se crea otro objeto y se (ace que la referencia a(ora apunte (acia el nuevo objeto. los ob$etos son creados. } } .e Collector %i los objetos est#n perdidos en memoria no tienen referencias y por lo tanto no se pueden acceder esos son los candidatos a ser borrados por el NC. class MB$lass{ public static void Main (string%& args){ MB$lass mBObject.Tema 2 – Clases y objetos 6eap -l Eeap es la +ona de la memoria din!mica.n referenciaMobjeto es de muc(os a uno es decir un objeto puede estar siendo apuntado por muc(as referencias pero una referencia solo apunta a un objeto.se crea el objeto en el 1eap -.-. eliminados o modificados en esta parte de la memoria. mBObject = new MB$lass().tac4 -l %tacH guarda referencias y datos primitivos las referencias pueden apuntar a elementos del (eap!es decir a los objetos". 'elación con el 8C 8arba. La relaci. 2O . mBObject = new MB$lass().

--G } } L&nea 5. bool fijar6alor(int i6alor){ if(i6alor >= * << i6alor < mEi6alor = i6alor. %e crea el segundo objeto en el (eap se crea la segunda referencia en el stacH y la referencia apunta al objeto. } } c" class MB$lass{ public int mEi6alor.M P/onde se encuentran los erroresQ. La primera referencia apunta (acia el segundo objeto. AC1I I)A)#. L&nea . static void imprimir6alor(){ $onsole'(rite)ine(mEi6alor).. a" class MB$lass{ const int a. } b" class MB$lass{ public int mEi6alor. MB$lass mB@econdObject = new MB$lass().--. int c.--/ mB0irstObject = mB@econdObject. L&nea <. } } } *){ 22 . -n este momento el primer objeto se queda sin referencia es desec(ado por el NC y se libera memoria. Corregidlos. La segunda referencia apunta a nada por lo que tambi'n el segundo objeto es desec(ado por el NC y se libera memoria.9 2. L&nea =. %e crea el primer objeto en el (eap se crea la primera referencia en el stacH y la referencia apunta al objeto.--= mB@econdObject = null.Tema 2 – Clases y objetos class MB$lass{ public static void Main (string%& args){ MB$lass mB0irstObject = new MB$lass(). int b. return true.

MPCu#l es el nivel de acceso que se usa por defecto en miembros de clase sino se especifica lo contrarioQ 22 .ueden las estructuras poseer constructoresQ P-n qu' formaQ <.Tema 2 – Clases y objetos 2.MPCu#les son las diferencias principales entre clases y estructurasQ ..MP.MP-s necesario instanciar una clase para acceder a3 !marcar correcta" a" Una variable de tipo entero no est#ticaQ b" Una variable de tipo entero est#ticaQ c" Un m'todo est#ticoQ 5.