1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados,...

40
Universidad Salesiana de Bolivia 6 PROGRAMACIÓN III Tema 2 2.1 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 que contiene uno 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: U.S.B – Programación III class nombre_clase{ miembro_1; miembro_2; . . . . . . miembro_N; función_miem bro_1() función_miem bro_2() Lista de miembros Funciones miembro 6

Transcript of 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados,...

Page 1: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 6 PROGRAMACIÓN III

Tema 2

2.1 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 que contiene uno 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 struct por defecto son públicos.

Ejemplos 2.1

U.S.B – Programación III

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

6

Page 2: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 7 PROGRAMACIÓN III

1.Como primer ejemplo, el programa contiene a la clase miclase. Al ejecutar este programa ud. podrá ver en pantalla los número 5 y 8.

U.S.B – Programación III 7

Page 3: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 8 PROGRAMACIÓN III

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

U.S.B – Programación III

#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 << ob1.obtiene_n() << endl; cout << ob2.obtiene_n() << endl; getch();}

#include "iostream.h"#include "conio.h"

class miclase{public: int n; //variable pública de miclase void inicializa_n(int num); // funcion miembro // ya no hace falta obtiene_n };void miclase::inicializa_n(int num){ n=num;}

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

8

Page 4: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 9 PROGRAMACIÓN III

3.2 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 2.2

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 numero se usa la siguiente notación

long numero::ObtenerValor()

3.3 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

U.S.B – Programación III

Funciones miembro

Variables miembro

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

9

Page 5: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 10 PROGRAMACIÓN III

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 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 datosson públicas, de modo que se puede acceder a ellos desde el exterior de la clase. Es decir, los datos van normalmente en la sección privada y las funciones en la sección pública o interfaz de la clase. Sin embargo aunque no existen reglas fijas, se puede afirmar lo siguiente:

1. Nivel Privado. Los miembros declarados en esta sección de la clase sólo pueden ser utilizados por la propia clase, mediante sus funciones miembro, y las funciones amigas de la clase. Esta sección se identifica mediante la etiqueta private:.

2. Nivel Protegido. Los miembros declarados en este nivel están disponibles para su uso sólo para las funciones miembro, funciones amigas de la clase y funciones miembro de clases derivadas. Una clase derivada, es una clase que se a construido a partir de otra aprovechando la herencia. Esta sección se identifica mediante la etiqueta protected:.

3. Nivel Público. Los elementos públicos son de libre acceso desde cualquier lugar del programa, y cualquier función los puede utilizar. Esta sección se identifica mediante la etiqueta public:.

U.S.B – Programación III

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

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.

10

Page 6: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 11 PROGRAMACIÓN III

Ejemplos 2.3

1. 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.

2. En el siguiente ejemplo se puede apreciar el uso de la variable protected

U.S.B – Programación III

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( );}

11

Page 7: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 12 PROGRAMACIÓN III

3.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 (interface del objeto). Paso de mensajes:

Resumen de los modos de acceso a miembros

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.

U.S.B – Programación III

class fecha {int dia, mes, año; //privado

public:void fijar_fecha(int, int, int);

};

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

12

Page 8: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 13 PROGRAMACIÓN III

2.4 DECLARACIÓN DE VARIABLES DE UNA CLASE DETERMINADA

Un objeto es un elemento declarado de una clase (una instancia de una clase)

Ejemplo 2.4

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();

3.5 DECLARACION 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 2.5class c1{ void c2::inicia(int x)

U.S.B – Programación III

class miclase{ // definición de la clase int x; // dato privado float y; // dato privado public: int z; // dato público void f(); // función pública };

miclase objeto;

Un objeto es un elemento declarado de un tipo clase. Se conoce también

como una instancia de una clase

13

Page 9: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 14 PROGRAMACIÓN III

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){ i=x;}void c1::print(){ cout <<i;}

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

void main(){ c1 ob1; c2 ob2; ob1.inicia(2); ob2.inicia(4); ob1.print(); ob2.print();}

Como podemos observar, a pesar de que en ambas clases c1 y c2, se define los miembros inicia y print para cada clase tiene una función diferente con respecto de sus datos privados.A los miembros de una clase se accede de igual forma que a los miembros de una estructura. Existen dos métodos para acceder a un miembro de una clase. El operador punto (.) y el operador flecha (->) que actúan de modo similar. La sintaxis de acceso a los miembros dato es:

Nombre_clase.nombre_miembroPor ejemplo podemos apreciar que para acceder a la función miembro inicia usamos la siguiente instrucción

ob2.inicia(4);2.6 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 3.5

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

U.S.B – Programación III

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

14

Page 10: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 15 PROGRAMACIÓN III

circundante, la clase anidada será utilizable sólo por los miembros datos de la clase que la 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.

2.6 CONSTRUCTORES Y DESTRUCTORES2.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

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.

U.S.B – Programación III

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

15

Page 11: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 16 PROGRAMACIÓN III

Ejemplo 2.6

1. En la siguiente clase circulo 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

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:

U.S.B – Programación III

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ámetroscirculo c(2, 3, 1.5); //OK!circulo c = circulo(2, 3, 1.5); //OK!

La mayoría de los lenguajes OO usan este formato

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

Declaración del constructor

Se inicializan valores

Fecha hoy(4,10,5);Fecha aniversario(3,12,5);

16

Page 12: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 17 PROGRAMACIÓN III

2.6.1.1 Constructores por defectoEl constructor por defecto es un constructor que no acepta argumentos. Ejemplo 2.6

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.

23.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 especificas 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.

U.S.B – Programación III 17

Page 13: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 18 PROGRAMACIÓN III

El resultado de ejecutar éste programa será:

3.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 3.7

Volvamos a rescribir la clase fecha, ahora con dos constructores:

U.S.B – Programación III 18

Page 14: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 19 PROGRAMACIÓN III

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:

El resultado de ejecutar el programa será el siguiente:

0/0/012/3/08

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

U.S.B – Programación III

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

19

Page 15: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 20 PROGRAMACIÓN III

Fecha aniversario(3,12,5);

Ejemplo 3.8

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 objetosPaso de parámetros-objeto por valor

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.

U.S.B – Programación III

Nombre de la clase

Nombre del objeto

Argumentos del constructor

20

Page 16: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 21 PROGRAMACIÓN III

Ejemplo 3.9

3.6.2 CREACION DE OBJETOS

Las dos formas de utilizar constructores para crear instancias de una clase son abreviadas y explícita. 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 3.10

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

3.6.3 DESCTRUCTORES

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

U.S.B – Programación III

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(<Lista argumentos constructor>)

21

Page 17: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 22 PROGRAMACIÓN III

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

Ejemplo 3.11

2.7 EL PUNTERO THIS

Para cada objeto declarado de una clase se mantiene una copia de sus datos, pero todos comparten la misma copia de las funciones de esa clase. Esto ahorra memoria y hace que los programas ejecutables sean más compactos, pero plantea un problema. Cada función de una clase puede hacer referencia a los datos de un objeto, modificarlos o leerlos, pero si sólo hay una copia de la función y varios objetos de esa clase, ¿cómo hace la función para referirse a un dato de un objeto en concreto?

La respuesta es: usando el puntero especial llamado this. Se trata de un puntero que tiene asociado cada objeto y que apunta a si mismo. Ese puntero se puede usar, y de hecho se usa, para acceder a sus miembros.

Ejemplo#include <iostream>using namespace std; class pareja { public: // Constructor pareja(int a2, int b2); // Funciones miembro de la clase "pareja" void Lee(int &a2, int &b2); void Guarda(int a2, int b2); private: // Datos miembro de la clase "pareja" int a, b; };

Para cada dato podemos referirnos de dos modos distintos, lo veremos con la función Guarda.

U.S.B – Programación III 22

Page 18: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 23 PROGRAMACIÓN III

void pareja::Guarda(int a2, int b2) { a = a2; b = b2;}

Veamos ahora la manera equivalente usando el puntero this:void pareja::Guarda(int a2, int b2) { this->a = a2; this->b = b2;}

Veamos otro ejemplo donde podemos aplicar el operador this. Se trata de la aplicación más frecuente, como veremos al implementar el constructor copia, o al sobrecargar ciertos operadores.

A veces necesitamos invocar a una función de una clase con una referencia a un objeto de la misma clase, pero las acciones a tomar serán diferentes dependiendo de si la referencia que pasamos se refiere al mismo objeto o a otro diferente, veamos cómo podemos usar el puntero this para determinar esto:

#include <iostream>using namespace std;

class clase { public: clase() {} void EresTu(clase& c) { if(&c == this) cout << "Sí, soy yo." << endl; else cout << "No, no soy yo." << endl; }}; int main() { clase c1, c2; c1.EresTu(c2); c1.EresTu(c1); return 0;}

La función "EresTu" recibe una referencia a un objeto de la clase "clase". Para saber si se trata del mismo objeto, comparamos la dirección del objeto recibido con el valor de this, si son la misma, es que se trata del mismo objeto.

No, no soy yo.Sí, soy yo.

U.S.B – Programación III 23

Page 19: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 24 PROGRAMACIÓN III

2.8 AMIGAS (friend)2.8.1. 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 3.13

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

U.S.B – Programación III

PROTOTIPO:

friend tipo_devuelto nombre(parametros);

DESARROLLO:

tipo_devuelto nombre(parametros){ cuerpo;}

24

Page 20: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 25 PROGRAMACIÓN III

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.

3.8.2 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

Ejemplo

U.S.B – Programación III

Declaración de la función amiga

friend class nombreClase

Prototipo para que la clase1 reconozca la existencia de la clase2

Clase2 amiga de la clase1

25

Page 21: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 26 PROGRAMACIÓN III

2.9 MODIFICADORES PARA MIEMBROS

2.9.1 FUNCIONES EN LÍNEA

A menudo nos encontraremos con funciones miembro cuyas definiciones son muy pequeñas. En estos casos suele ser interesante declararlas como inline. Cuando hacemos eso, el código generado para la función cuando el programa se compila, se inserta en el punto donde se invoca a la función, en lugar de hacerlo en otro lugar y hacer una llamada.

Esto nos proporciona una ventaja, el código de estas funciones se ejecuta más rápidamente, ya que se evita usar la pila para pasar parámetros y se evitan las instruccio

nes de salto y retorno. También tiene un inconveniente: se generará el código de la función tantas veces como ésta se use, con lo que el programa ejecutable final puede ser mucho más grande.

Es por esos dos motivos por los que sólo se usan funciones inline cuando las funciones son pequeñas. Hay que elegir con cuidado qué funciones declararemos inline y cuales no, ya que el resultado puede ser muy diferente dependiendo de nuestras decisiones.

Ejemplo

class Ejemplo { int A; public: Ejemplo(int a){A=a;} // definición en línea del constructor

private: int A;};

2.10 OPERACIONES CON OBJETOS

2.10.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.

U.S.B – Programación III

objeto_destino=objeto_origen;

26

Page 22: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 27 PROGRAMACIÓN III

Ejemplo 3.15

2.10.2 ARRAY DE OBJETO

Los objetos son variables y tienen las mismas capacidades y atributos que cualquier tipo de 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 3.16 Declaración de una arreglo unidimensional #include <iostream.h> #include <stdio.h> #include <conio.h> class ejemplo{ int a; public: void pasar(int x){a=x;} int mostrar() {return a;} }; void main()

U.S.B – Programación III

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

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

27

Page 23: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 28 PROGRAMACIÓN III

{ ejemplo ob[4]; int indice; clrscr(); for(indice=0;indice<4;indice++) ob[indice].pasar(indice); for(indice=0;indice<4;indice++) { cout << ob[indice].mostrar(); cout << "\n"; } getch(); }

Ejemplo 3.17 Declaración de una arreglo bidimensional #include <iostream.h> #include <stdio.h> #include <conio.h> 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<3;fil++) { for(col=0;col<2;col++) { cout << objeto[fil][col].pasa_a(); cout << " "; cout << objeto[fil][col].pasa_b(); cout << "\n"; } } getch(); }

U.S.B – Programación III 28

Page 24: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 29 PROGRAMACIÓN III

2.10.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.

Prototipo de función:

Llamada a la función:

Ejemplo:

U.S.B – Programación III

tipo_devuelto nombre(nombre_clase nombre_objeto){ cuerpo;}

nombre_funcion(objeto);

#include <iostream.h>#include <stdio.h>#include <conio.h>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 << sqr(a); cout << sqr(b); getch();}

29

Page 25: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 30 PROGRAMACIÓN III

2.10.4 OBJETOS DEVUELTOS POR FUCIONES

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.

Ejemplo:

2.10.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

U.S.B – Programación III

#include <iostream.h>#include <stdio.h>#include <conio.h>#include <string.h>class ejemplo{ char cadena[80];public: void muestra(){cout<<cadena<<"\n";} void copia(char *cad){strcpy(cadena,cad);}};

ejemplo entrada(){ char cadena[80]; ejemplo str; cout<<"Introducir cadena: "; cin>>cadena; str.copia(cadena); return str;}void main()<{ ejemplo ob; ob=entrada(); ob.muestra(); getch();}

30

Page 26: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 31 PROGRAMACIÓN III

dirección de un objeto, se precede al objeto con el operador &. Se trabaja de igual forma que los punteros a otros tipos.

Ejemplo:

U.S.B – Programación III

#include <iostream.h>#include <stdio.h>#include <conio.h>

class miclase{ int a;public: miclase(int x); int get();};miclase::miclase(int x){ a=x;}int miclase::get(){ return a;}

void main(){ clrscr(); miclase obj(200); miclase *p; p=&obj; cout << "El valor del Objeto es " << obj.get(); cout << "El valor del Puntero es " << p->get(); getch();}

31

Page 27: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 32 PROGRAMACIÓN III

1.

Implementación de la clase Dibujo

class Dibujo{ int posX; int posY; char cabeza; char cuerpo; char piernas; public: Dibujo(int iniX,int iniY); void SeMuestra(); void SeEnoja(); void Desaparece(); void haciaElEste(int distancia);};Dibujo::Dibujo(int iniX,int iniY){ posX=iniX; posY=iniY; cabeza=2; cuerpo=197; piernas=94; //186;}void Dibujo::SeMuestra(){ gotoxy(posX,posY); cprintf("%c",cabeza); gotoxy(posX,posY+1); cprintf("%c",cuerpo); gotoxy(posX,posY+2); cprintf("%c",piernas);}void Dibujo::SeEnoja(){ textcolor(RED); gotoxy(posX,posY); SeMuestra();}void Dibujo::Desaparece(){ gotoxy(posX,posY); cout<<" "; gotoxy(posX,posY+1); cout<<" "; gotoxy(posX,posY+2); cout<<" ";}

U.S.B – Programación III 32

Page 28: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 33 PROGRAMACIÓN III

void Dibujo::haciaElEste(int distancia){ for(int i=1;i<=distancia;i++) { Desaparece(); posX=posX+1; SeMuestra(); getch(); }}void main(){ Dibujo dibu(5,5); Dibujo dibu2(15,15); clrscr(); dibu.SeMuestra(); dibu2.SeMuestra(); getch(); dibu.SeEnoja(); getch(); dibu.Desaparece(); getch(); dibu.haciaElEste(5); dibu2.haciaElEste(5); getch();}

2. Implementación de la clase Circulo

class CIRCULO{ private: int x; int y; int radio; int visible; int color; public: CIRCULO(int InicX,int InicY,int InicRadio,int Iniccolor); virtual void Muestra(void); virtual void Oculta(void); virtual void Escala(int EnCuanto);};

CIRCULO::CIRCULO(int InicX,int InicY,int InicRadio,int InicColor){ x=InicX; y=InicY; radio=InicRadio; color=InicColor;}

U.S.B – Programación III 33

Page 29: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 34 PROGRAMACIÓN III

avoid CIRCULO::Muestra(void){ visible=1; setcolor(color); circle(x,y,radio);}void CIRCULO::Oculta(void){ if(visible) { visible=0; circle(x,y,radio); }}void CIRCULO::Escala(int EnCuanto){ if(visible) { Oculta(); radio=radio+EnCuanto; Muestra(); }}

3. Clase matriz

class MATRIZ{ float m[TAM][TAM]; public: void inicia(); //inicializa la matriz void muestra(); void inversa(); }; //inicializa matriz void MATRIZ::inicia() { for(int i=0;i<=2;i++) for(int j=0;j<=2;j++) {gotoxy(j*2+10,i+10);cout<<""; cin>>m[i][j]; } for(i=0;i<=2;i++) for(int j=3;j<=5;j++) { if (i+3==j) m[i][j]=1;

else m[i][j]=0; } } //muestra los elementos de la matriz void MATRIZ::muestra() { clrscr();

U.S.B – Programación III 34

Page 30: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 35 PROGRAMACIÓN III

for(int i=0;i<=2;i++) for(int j=0;j<=5;j++) {gotoxy(j*4+10,i+10);cout<<m[i][j]; } } void MATRIZ::inversa() {int j=0,k,l,sw=0; float aux; for(int i=0;i<=2;i++) { if(i==j) {if(m[i][j]==1)

{for(k=j;k<=2;k++) {if(k!=i) {if(m[k][j]!=0) aux=m[k][j]; for(l=0;l<=5;l++) m[k][l]=m[i][l]*(-aux)+m[k][l]; } }}

else{aux=m[i][j]; for(l=0;l<=5;l++) m[i][l]=m[i][l]/aux;}

} muestra(); getche(); j++; } for(i=2;i>0;i--) { for(j=i-1;j>=0;j--) { if(m[j][i]!=0) { aux=m[j][i];

cout<<aux;getche(); for(l=0;l<=5;l++) m[j][l]=m[i][l]*(-aux)+m[j][l]; muestra(); getche();

} } } for(i=0;i<=3;i++) for(j=0;j<=5;j++) { if(j==i) if(m[i][j]=0) sw=1; } if(sw==1) cout<<"La matriz no tiene inversa "; }

U.S.B – Programación III 35

Page 31: 1virtual.usalesiana.edu.bo/.../dossier/12012/1338.docx · Web view, es decir, son privados, mientras que las funciones que operan sobre los datosson públicas, de modo que se puede

Universidad Salesiana de Bolivia 36 PROGRAMACIÓN III

//funci¢n principal void main() { MATRIZ a,b; //Crear dos matrices int i; clrscr(); //inicializa las pilas gotoxy(5,5); cout<<" M A T R I Z I N V E R S A "; a.inicia(); a.muestra(); getche(); a.inversa(); a.muestra(); getche(); }

U.S.B – Programación III 36