Principios de POO con C - Universidad Salesiana de...

27
U.S. Intro En e que objet 2.1. A Para que atribu Intrín ocult elem priva El im 1 2 3 .B. – Progra oducción. sta unidad e son fundam tos. Abstracció declarar un tienen los utos y la nsicamente tación de i mentos del o ados y prote mpacto que e 1. Nivel Pr Los miem la propia Esta secc 2. Nivel Pr Los miem elemento base; sin anteriorm por los m de los ele 3. Nivel Pú Los elem cualquier public: amación II empezarem mentales pa n y Encaps na clase se e objetos, m as funcione se da el pro información objeto ident egidos. estos nivele rivado. mbros decla a clase, med ción se iden rotegido. mbros decl os sin ningú n embargo mente defin miembros d ementos la úblico. mentos públ r función lo II Prin mos a trabaja ara trabajar sulación empieza ide mediante los es miembr oceso de en n, en sí se tificados y es de segurid arados en e diante sus fu ntifica medi arados en e ún problem o para el nido. En sí de la clase d palabra rese licos son de os puede ut cipios ar con el len r con obje entificando s diagramas ro que pu ncapsulación este proce estos se cla dad que se e esta sección unciones mi ante la pala este nivel es ma por las c resto actúa son de uso derivada. Se ervada prot e libre acce tilizar. Esta s de P nguaje C++ tos, y dise previament s UML, en ueda tener n mediante eso se preo asifican en establecen e de la clase iembro, y la abra clave p stán dispon clases deriv an de man exclusivo p e identifican tected: eso desde c sección se POO + y se cubrir eñar un pro te los caract n los cuale r el objeto la cual se e ocupa por l tres grande en la encaps e sólo puede as funciones rivate: nibles para p vadas que h nera simila por los mie n antecedien ualquier lug identifica m Pá Unida con C rá aspectos ograma ori terísticas pr s se identif o a repre efectúa el pr la segurida es grupos: p sulación son en ser utiliz s amigas de poder empl hereden de ar al nivel embros de l ndo a la dec gar del pro mediante la ágina 11 dad 2 C++ centrales entado a rincipales fican los esentarse. roceso de d de los públicos, n: zados por e la clase. lear estos la clase privado la clase y claración grama, y a etiqueta

Transcript of Principios de POO con C - Universidad Salesiana de...

  • U.S.

    Intro En eque objet 2.1. A Para que atribuIntrínocultelempriva El im

    1

    2

    3

    .B. – Progra

    oducción.

    sta unidad eson fundam

    tos.

    Abstracció

    declarar untienen los utos y lansicamente tación de i

    mentos del oados y prote

    mpacto que e

    1. Nivel Pr Los miemla propiaEsta secc

    2. Nivel Pr Los miemelementobase; sinanteriormpor los mde los ele

    3. Nivel Pú Los elemcualquierpublic:

    ramación II

    empezaremmentales pa

    n y Encaps

    na clase se eobjetos, m

    as funcionese da el pro

    informaciónobjeto identegidos.

    estos nivele

    rivado.

    mbros declaa clase, medción se iden

    rotegido.

    mbros declos sin ningún embargo

    mente definmiembros dementos la

    úblico.

    mentos públr función lo

    II

    Prin

    mos a trabajaara trabajar

    sulación

    empieza idemediante los

    es miembroceso de enn, en sí se tificados y

    es de segurid

    arados en ediante sus funtifica medi

    arados en eún problem

    o para el nido. En sí de la clase dpalabra rese

    licos son deos puede ut

    cipios

    ar con el lenr con obje

    entificando s diagramasro que pu

    ncapsulacióneste proce

    estos se cla

    dad que se e

    esta sección unciones miante la pala

    este nivel esma por las c

    resto actúason de uso

    derivada. Seervada prot

    e libre accetilizar. Esta

    s de P

    nguaje C++tos, y dise

    previaments UML, enueda tenern mediante eso se preoasifican en

    establecen e

    de la claseiembro, y la

    abra clave p

    stán disponclases derivan de man exclusivo p

    e identificantected:

    eso desde csección se

    POO

    + y se cubrireñar un pro

    te los caractn los cualer el objetola cual se e

    ocupa por ltres grande

    en la encaps

    e sólo puedeas funcionesrivate:

    nibles para pvadas que hnera similapor los mien antecedien

    ualquier lugidentifica m

    Unida

    con C

    rá aspectos ograma ori

    terísticas prs se identifo a repre

    efectúa el prla seguridaes grupos: p

    sulación son

    en ser utilizs amigas de

    poder emplhereden de

    ar al nivel embros de lndo a la dec

    gar del promediante la

    ágina 11

    dad 2

    C++

    centrales entado a

    rincipales fican los

    esentarse. roceso de d de los públicos,

    n:

    zados por e la clase.

    lear estos la clase

    privado la clase y claración

    grama, y a etiqueta

  • U.S.B. – Programación III Página 12

    En los diagramas UML se generalizan las características del objeto en la declaración de la clase y a todos los elementos que se identifiquen como públicos, se antecede el signo +, mientras que a los que se declaran como privados se colocan el signo -; mientras que a los protegidos no se le incluye signo alguno.

    Ejemplo:

    Nombre de la Clase- Atributo 1 - Atributo 2 + Atributo 3 Atributo 4

    + Función Miembro 1 - Función Miembro 1 + Función Miembro 1 + Función Miembro 1

    2.2. Declaración de una Clase Entendemos como declaración el hecho de establecer la estructura general y sintetizada, o prototipo, de una clase sin especificar el código que es necesario para su funcionamiento. Por otra parte, una clase es un tipo de dato abstracto definido por el usuario que contiene cero o más elementos dato llamado miembros dato, y cero, o más funciones que manipulan esos datos llamados miembros función o función miembro. La sintaxis de una clase es: Una clase es sintácticamente igual a una estructura, con la única diferencia de que en el tipo class todos los miembros son por defecto privados mientras que en el tipo struct1 por defecto son públicos. 1 También podríamos definir una clase empleando el struct, solo que debemos ser cuidadosos de incluir la etiqueta private: a fin de asegurar a los datos como privados.

    class nombre_clase{ miembro_1; miembro_2; . . . . . . miembro_N; función_miembro_1() función_miembro_2() función_miembro_3() . . . . . . };

    Lista de miembros

    Funciones miembro

  • U.S.B. – Programación III Página 13

    Ejemplos 1. Como primer ejemplo, el programa contiene a la clase miclase. Al ejecutar este programa podrá ver en pantalla los números 5 y 8. En este ejemplo a es privado, eso significa que solamente las funciones miembro de miclase pueden acceder directamente a ella. Esta es la razón por la que se requiere la función obtiene_n() 2. A continuación se cambia el elemento n a la sección pública de la clase, entonces ya es posible acceder a n desde cualquier ámbito del programa

    #include "iostream.h" #include "conio.h" class miclase{ int n; //variable privada de miclase public: void inicializa_n(int num); // funciones int obtiene_n(); // miembro }; void miclase::inicializa_n(int num) { n=num; } int miclase::obtiene_n() { return n; } void main() { miclase ob1, ob2; ob1.inicializa_n(5); ob2.inicializa_n(8); cout

  • U.S.B. – Programación III Página 14

    2.2.1 Componentes de una clase Una definición de una clase consta de dos partes: una declaración y una implementación: La declaración lista los miembros de la clase. La implementación o cuerpo define las funciones de la clase. Ejemplo Declaración de una clase Implementación de una clase class numero{ long num; public: void LeerValores(long iniN); long ObtenerValor(); }:

    void numero::LeerValores(long iniN) { num=iniN; } long numero::ObtenerValor() { return num; }

    Como podemos observar para indicar que la función ObtenerValor es miembro de la clase número se usa la siguiente notación:

    long numero::ObtenerValor() Luego de manera general se establece que la estructura para definir completamente a una clase es la siguiente.

    class nombre_de_la_clase{ tipo_dato variable; //variables privadas

    public: tipo_dato variable; //variables públicas void funcion_1(tipo_dato var); // funciones tipo_dato funcion_2(); // miembro void funcion_n(tipo_dato variable) { //Declaración de función miembro en línea }

    }; //Instrumentación de funciones miembro fuera de línea

    Funciones miembro

    Variables miembro

    void main() { miclase ob1, ob2; ob1.inicializa_n(5); ob2.inicializa_n(8); cout

  • U.S.B. – Programación III Página 15

    void nombre_de_la_clase:: funcion_1(tipo_dato var) { ……………… } tipo_dato nombre_de_la_clase:: funcion_2( ) { ……………… }

    Donde:

    • La función miembro declarada en línea, es aquella que esta a disposición del programa inmediamente se declare el objeto, pero esta nunca deberá contener ningún bloque de estructura de control iterativa o de control, ni ser demasiado extensa.

    • Todas las funciones miembro deberán ser declaradas, si se requieren procesos un

    poco más extensos procédase a declararse fuera de línea, colocando primero el tipo de dato que devuelve esa función miembro fuera de línea, luego el nombre de la clase, después el operador de ámbito :: y finalmente el nombre de la función y los parámetros que esta tuviese.

    2.2.2 Control de acceso a una Clase Una de las características fundamentales de una clase es ocultar tanta información como sea posible. Por tanto es necesario establecer ciertas restricciones en el modo en el que se puede acceder a los miembros de una clase. Una clase puede contener elementos:

    públicos privados protegidos

    Todo miembro de una clase se puede declarar en la sección pública (public) o privada (private) o protegida (protected). Dado que uno de los primero conceptos

    Sección privada Sección Protegida Sección Pública

    Variable y/o funciones

    Variable y/o funciones

    Variable y/o funciones

    Accesible solamente desde los miembros de la clase

    Accesible desde los miembros de la clase y las clases derivadas

    Accesible desde cualquier ámbito

  • U.S.B. – Programación III Página 16

    fundamentales de la POO es la ocultación de datos, los miembros de una clase van normalmente en la sección private, es decir, son privados, mientras que las funciones que operan sobre los datos son públicas, de modo que se puede acceder a ellos desde el exterior de la clase. Sin embargo aunque no existen reglas fijas, se puede afirmar lo siguiente:

    Ejemplos a) Bajo esta consideración podemos presentar el siguiente ejemplo de la declaración de una clase que implementa el encapsulamiento.

    }

    Implementación de una clase

    Para ir de acuerdo con los principios del lenguaje C y la estructura de un programa modular, en C++ se conservan los principios de declaración y definición que se manejan en C. En consecuencia una clase para ser desarrollada y poder ser utilizada debe ser declarada y posteriormente definida. b) En el siguiente ejemplo se ejemplifica el uso de private La única manera de asignar valores a un objeto fecha ahora es a través de la función pública fijar_fecha (interface del objeto), al pasar el mensaje respectivo, así:

    Los datos (variables) miembro de una clase deben ser declarados como privados, y la funciones miembro que nos permiten acceder a estos deben ser públicas.

    class Ejemplo1 { private: int variableMiembro; float funcionMiembroPrivada( ); // Puede existir funciones

    // privadas, si su uso sólo le // interesa a la clase

    public: char variableMiembroPublica(); // Pueden existir variables publicas

    // si son de poca importancia estructural void funcionMiembro(); protected: int variableMiembroHerencia; // protected reemplaza a private si

    // se piensa en herencia. double funcionMiembroHerencia( ); }

    class fecha { int dia, mes, año; //privado public: void fijar_fecha(int, int, int); };

  • U.S.B. – Programación III Página 17

    c) En el siguiente ejemplo se puede apreciar el uso de la variable protected

    Resumen de los modos de acceso a miembros

    private protected public

    f.miembro f.amiga f.derivada f.usuario

    Reglas de ocultación 1. Los miembros dato que no se quiere que se modifiquen desde el exterior, deberían ser

    privados o protegidos. 2. Los constructores/destructores deben ser públicos, en la mayoría de las ocasiones. 3. Las funciones que sean usadas para la manipulación interna de datos o que son

    invocadas por funciones de la propia clase deben ser privadas o protegidas. 4. El resto será público. 2.3. Declaración de variables de una clase determinada Un objeto es un elemento declarado de una clase (una instancia de una clase)

    fecha f; f.fijar_fecha(3, 2, 1996);

  • U.S.B. – Programación III Página 18

    Ejemplo Objeto es una variable (instancia u objeto) de tipo miclase que se compone de tres campos datos y de una función de acceso. Únicamente las funciones públicas están a disposición de los usuarios de la clase. Sólo las funciones privadas no podrán ser llamadas m´sa que a partir de una función miembro de la clase. Para modificar los campos e e y se escribirá:

    objeto.f( ); 2.4 Declaración de funciones miembro La Definición de las funciones miembro es muy similar a la definición ordinaria. Tienen una cabecera y un cuerpo y pueden tener tipos y argumentos, sin embargo poseen dos características importantes:

    Cuando se define una función miembro, se utiliza el operador de resolución de ámbito (::) para identificar la clase a la que pertenece la función Las funciones miembro (métodos) de las clases pueden acceder a las componentes privadas de la clase.

    Ejemplo 3.5

    class c1{ int i; public: void inicia(int x); void print(); }; class c2{ int j; public: void inicia(int x); void print(); }; void c1::inicia(int x) {

    void c2::inicia(int x) { j=x; } void c2::print() { cout

  • U.S.B. – Programación III Página 19

    i=x; } void c1::print() { cout

  • U.S.B. – Programación III Página 20

    void Pila::CreaPila() { tope=-1; } int Pila::PilaVacia() { if(tope==-1) return TRUE; else return FALSE; } int Pila::PilaLlena() { if(tope==MAX-1) return TRUE; else return FALSE; } void Pila::Poner(int x) { if(PilaLlena()) cout

  • U.S.B. – Programación III Página 21

    2.5. Clases Anidadas La potencia de abstracción de una clase se puede incrementar incluyendo otras declaraciones de clase. Una clase declarada en el inferior de otra clase se denomina clase anidada y se puede considerar como una clase miembro. Es posible en C++ anidar clases de forma análoga al anidamiento de estructuras: Ejemplo En el siguiente ejemplo la clase interna se denomina clase anidada, con respecto a Externa El identificador de una clase anidad está sujeto a las mismas reglas de acceso que los restantes miembros. Si una clase anidada se declara en la sección private de la clase circundante, la clase anidada será utilizable sólo por los miembros datos de la clase que la

    class Externa{ public: class Interna{ public: int x; }; };

    void main() { int aux; Pila p,s; clrscr(); p.CreaPila(); p.Poner(1); p.Poner(2); p.Poner(3); p.ImprimePila(); cout

  • U.S.B. – Programación III Página 22

    circunde. La clase que encierra puede acceder al nombre de la clase anidada sin resolución de ámbito. Si un nombre de una clase anidada es accesible a una clase o función que no la circunda, se debe aplicar el operador de resolución de ámbito (::) y se debe aplicar para utilizar el nombre. Ejemplos 1. Continuando con el ejemplo anterior, 2. 2.6. Constructores y Destructores 2.6.1 Constructores Muchas variables por lo general requieren de incialización, de hecho en POO prácticamente cada objeto que se crea va a necesitar algún tipo de inicialización. Para tratar esta situación se implementan las funciones constructoras en una declaración de clase. A un constructor de clase.

    class X { class Y { int m; } public: class Z { int m; } };

    Y y1; //***ERROR*** por no ambito X::Y y1; //***ERROR*** por ser privada Z z1; //***ERROR*** por no ambito X::Z z1; //OK!!

    void main() { Externa::Interna valor; int v=valor.x; }

  • U.S.B. – Programación III Página 23

    Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara. Los constructores tienen el mismo nombre que la clase, no retornan ningún valor y no pueden ser heredados. Además deben ser públicos, no tendría ningún sentido declarar un constructor como privado, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado. Características

    Tienen en mismo nombre que la clase No devuelven valores Pueden tener parámetros (y valores por defecto) Pueden ser definidos en linea o normalmente Pueden existir más de un constructor para una clase

    Cuando declaramos un objeto de una clase, el constructor es invocado automáticamente. Si no definimos uno, el compilador pone el suyo por defecto. Ejemplos 1. En la siguiente clase círculo se ejemplifica el uso de la función constructor

    A continuación se aprecia la definición de objetos de clase círculo Como vemos existen dos formas de definir objetos

    Un constructor es un miembro de la clase que captura la memoria asociada al objeto.

    class circulo { float x_centro, y_centro; float radio; public: circulo(float x, float y, float r) { x_centro = x; y_centro = y; radio = r }

    };

    Constructor, tiene el mismo nombre de la clase

    circulo c; //error faltan parámetros circulo c(2, 3, 1.5); //OK! circulo c = circulo(2, 3, 1.5); //OK!

    La mayoría de los lenguajes OO usan este formato

  • U.S.B. – Programación III Página 24

    2. Una representación gráfica de la función constructor se muestra a continuación basándonos en la clase Fecha

    Se pueden crear objetos de tipo Fecha de la siguiente forma: 2.6.1.1 Constructores por defecto El constructor por defecto es un constructor que no acepta argumentos. Ejemplo

    class contador{ long cuenta; public: contador(); void LeerValor(long dato); long DetenerValor(); }; contador::contador() { cuenta=0; }

    class fecha { int dia, mes, año; public: fecha(int d, int m, int a); void visualizar(void); }; // definición de la función constructor fecha::fecha(int d, int m, int a) { dia=d; mes=m; año=a; } void fecha::visualizar(void) { cout

  • U.S.B. – Programación III Página 25

    Este constructor por defecto asigna almacenamiento para construir un objeto de su clase y los pone a cero. 2.6.1.2 Constructores con argumentos La mayoría de los constructores toman argumentos. La función básica de un constructor es inicializar un objeto antes de utilizarlo. Esta inicialización supone funciones llamadoras, asignación de almacenamiento dinámica, establecer variables a valores específicos, etc. Los constructores del ejemplo 3.5 son constructores con argumentos. 2.6.1.3 Constructores con argumentos por defecto Los miembros de una clase se peden inicializar de diferentes formas. Los argumentos por defecto se pueden especificar en la declaración del constructor. Los miembros de las clases se inicializarán a éstos valores por defecto, si ningún otro se especifica.

    #include "iostream.h" #include "conio.h" class suma{ int a; int b; public: suma(int i=4, int j=5){ a=i; b=j; } void muestra(){cout

  • U.S.B. – Programación III Página 26

    2.6.1.4 Constructores sobrecargados Los constructores pueden ser sobrecargados, es decir, un constructor puede tener el mismo nombre, pero diferentes tipos de datos como argumentos. El constructor correcto será invocado por el compilador, según sea el tipo de dato de su argumento. Ejemplo Volvamos a rescribir la clase fecha, ahora con dos constructores:

    Si una clase posee constructor, será llamado siempre que se declare un objeto de esa clase, y si requiere argumentos, es obligatorio suministrarlos.

    Por ejemplo, las siguientes declaraciones son ilegales:

    La primera porque el constructor de "fecha" requiere tres parámetros, y no se suministran. La segunda es ilegal por otro motivo más complejo. Aunque existiese un constructor sin parámetros, no se debe usar esta forma para declarar el objeto, ya que el compilador lo considera como la declaración de un prototipo de una función que devuelve un objeto de tipo "fecha" y no admite parámetros. Cuando se use un constructor sin parámetros para declarar un objeto no se deben escribir los paréntesis. La siguiente declaración es correcta:

    Fecha ayer(2,5); Fecha fec();

  • U.S.B. – Programación III Página 27

    El resultado de ejecutar el programa será el siguiente:

    0/0/0 12/3/08

    Los valores usados como parámetros se usan para asignar valores a fecha. Realizamos una descripción más detallada:

    Fecha aniversario(3,12,5); Ejemplo 2.6.1.5. Constructores de copia Crean un objeto a partir de otro que ya existe. Se invocan implícitamente cuando se hacen una de estas cosas: Asignaciones entre objetos Paso de parámetros-objeto por valor

    Nombre de la clase

    Nombre del objeto

    Argumentos del constructor

  • U.S.B. – Programación III Página 28

    Por defecto, C++ pone un constructor de copia por defecto que copia byte a byte el objeto en sí, pero que da problemas cuando tenemos datos dinámicos: hay duplicación de punteros pero no de la información apuntada. Se caracterizan por tener como parámetro una referencia constante a un objeto de la clase a la que pertenecen. Ejemplo 2.6.2 Creación de Objetos Las dos formas de utilizar constructores para crear instancias de una clase son abreviadas y explícitas. Ejemplos de uso de la forma abreviada para declarar instancias de la clase Complejo es:

    Complejo c1, c2(10), c3(3,4); En la forma explícita se utiliza la sintaxis general: Ejemplo

    Complejo c1 = complejo(); Complejo c2 = complejo(10) Complejo c3 = complejo(3,4);

    class complejo { double re, im; public: complejo(const complejo &c) { //"c" es el objeto a la derecha de la asignación re = c.re; im = c.im; } complejo(double r=0.0, double i=0.0) { re = r; im = i; } };

    complejo c1; complejo c2 = c1; //invoca al constructor de copia

    NombreClase instancia=NombreClase()

  • U.S.B. – Programación III Página 29

    2.6.3 Destructores Miembro de la clase que libera la memoria asociada al objeto de la clase. Se invocan implícitamente cuando acaba el ámbito del objeto. Pueden ser invocados explícitamente con el operador delete. No tienen sentido si no hay memoria dinámica en el objeto. Características

    o Tienen en mismo nombre que la clase precedido de tilde "~" o No devuelven valores o No pueden tener parámetros o Pueden ser definidos en linea o normalmente o En una clase puede existir como máximo un constructor.

    Ejemplo 3.11

    Ejemplo

    class pila_char { int tam; char *pila; char *cima;

    public: pila_char(int t) { cima = pila = new char[tam = t]; } ~pila_char() { delete []pila; } };

    void f() { pila_char p(3); } //aquí se invoca el destructor de la pila void g() { pila_char p(3); //... delete p; // aquí se invoca el destructor de la pila }

  • U.S.B. – Programación III Página 30

    2.7. Funciones Amigas

    Habrá momentos en los que se quiera que una función tenga acceso a los miembros privados de una clase sin que esa función sea realmente un miembro de esa clase. De cara a esto están las funciones amigas. Son útiles para la sobrecarga de operadores y la creación de ciertos tipos de funciones E/S.

    El prototipo de esta funciones viene precedido por la palabra clave friend, cuando se desarrolla la función no es necesario incluir friend. Una función amiga no es miembro y no se puede calificar mediante un nombre de objeto. Estas funciones no se heredan y pueden ser amigas de más de una clase.

    Ejemplo

    • Recuerde: Un factor o divisor propio de un número entero n, es un número también entero menor que n que lo divide exactamente, es decir, que el resto de la división de n por su factor propio es exactamente 0.

    A continuación se ejemplifica la función amiga factor

    PROTOTIPO: friend tipo_devuelto nombre(parametros); DESARROLLO: tipo_devuelto nombre(parametros) { //cuerpo; }

  • U.S.B. – Programación III Página 31

    • La utilidad de las funciones amigas es poder acceder a los datos privados de una o

    más clases • Una función declarada friend de una clase C, es una función no miembro de la

    clase, que puede accedes a los miembros privados de la clase • Una función amiga puede declararse en cualquier sección de la clase. Como no es

    miembro de la clase no se ve afectada por los modificadores private y public. • Una función puede ser amiga de una clase y miembro de otra.

    2.8. Clases Amigas El caso más común de amistad se aplica a clases completas. Lo que sigue es un ejemplo de implementación de una lista dinámica mediante el uso de dos clases "amigas". Declaración

    Declaración de la función amiga

    friend class nombreClase

  • U.S.B. – Programación III Página 32

    Ejemplo 2.9. Operaciones con Objetos

    2.9.1 Asignación de Objetos Se puede asignar un objeto a otro a condición de que ambos objetos sean del mismo tipo (misma clase). Cuando un objeto se asigna a otro se hace una copia a nivel de bits de todos los miembros, es decir se copian los contenidos de todos los datos. Los objetos continúan siendo independientes. Ejemplo

    objeto_destino = objeto_origen;

    #include #include #include class miclase{ int a,b; public: void obtener(int i, int j){a=i;b=j;} void mostrar(){cout

  • U.S.B. – Programación III Página 33

    2.9.2 Array de Objeto Los objetos son variables y tienen las mismas capacidades y atributos que cualquier tipo d e variables, por tanto es posible disponer objetos en un array. La sintaxis es exactamente igual a la utilizada para declarar y acceder al array. También disponemos de arrays bidimensionales. Declaración: Inicialización: Ejemplo: Declaración de una arreglo unidimensional

    nombre_clase nombre_objeto[nº elementos]; nombre_clase nombre_objeto[nº elementos]={elementos};

    nombre_objeto[índice].función(valores);

    #include #include #include

    class ejemplo{ int a; public: void pasar(int x){a=x;} int mostrar() {return a;} }; void main() { ejemplo ob[4]; int indice; clrscr(); for(indice=0;indice

  • U.S.B. – Programación III Página 34

    Ejemplo: Declaración de una arreglo bidimensional 2.9.3. Paso de Objetos a Funciones Los objetos se pueden pasar a funciones como argumentos de la misma manera que se pasan otros tipos de datos. Hay que declarar el parámetro como un tipo de clase y después usar un objeto de esa clase como argumento cuando se llama a la función. Cuando se pasa un objeto a una función se hace una copia de ese objeto. Cuando se crea una copia de un objeto porque se usa como argumento para una función, no se llama a la función constructora. Sin embargo, cuando la copia se destruye (al salir de ámbito), se llama a la función destructora.

    #include #include #include class bidi{ int a,b; public: bidi(int n, int m){a=n;b=m;} int pasa_a(){return a;} int pasa_b(){return b;} }; void main() { clrscr(); int fil,col; bidi objeto[3][2]={ bidi(1,2),bidi(3,4), bidi(5,6),bidi(7,8), bidi(9,10),bidi(11,12)}; for(fil=0;fil

  • U.S.B. – Programación III Página 35

    Prototipo de función: Llamada a la función: Ejemplo: 2.9.4 Objetos Devueltos por Funciones Al igual que se pueden pasar objetos, las funciones pueden devolver objetos. Primero hay que declarar la función para que devuelva un tipo de clase. Segundo hay que devolver un objeto de ese tipo usando la sentencia return. Cuando un objeto es devuelto por una función, se crea automáticamente un objeto temporal que guarda el valor devuelto. Este es el objeto que realmente devuelve la función. Después el objeto se destruye, esto puede causar efectos laterales inesperados.

    tipo_devuelto nombre(nombre_clase nombre_objeto) { //cuerpo; }

    nombre_funcion(objeto);

    #include #include #include class objetos{ int i; public: objetos(int n){i=n;} int devol(){return i;} }; int sqr(objetos o) { return o.devol()*o.devol(); } void main() { objetos a(10), b(2); cout

  • U.S.B. – Programación III Página 36

    Ejemplo: 2.9.5 Punteros a Objetos Hasta ahora se ha accedido a miembros de un objeto usando el operador punto. Es posible acceder a un miembro de un objeto a través de un puntero a ese objeto. Cuando sea este el caso, se emplea el operador de flecha (->) en vez del operador punto. Para obtener la dirección de un objeto, se precede al objeto con el operador &. Se trabaja de igual forma que los punteros a otros tipos. Ejemplo:

    #include #include #include #include class ejemplo{ char cadena[80]; public: void muestra(){cout

  • U.S.B. – Programación III Página 37

    Ejercicios Propuestos

    1. Implementación la clase Dibujo, que muestre el dibuje que desee diseñar. 2. Implemente completamente la clase Pila. 3. Diseñe la clase círculo. 4. Elabore la clase matriz; que efectúe las operaciones principales y la generación de al

    menos dos matrices especiales.

    5. Diseñe la clase vector, que realice las operaciones fundamentales que se desarrollan con vectores, además de incluir métodos de búsqueda y ordenación de vectores.

    miclase::miclase(int x) { a=x; } int miclase::get() { return a; } void main() { clrscr(); miclase obj(200); miclase *p; p=&obj; cout