Você está na página 1de 44

PROGRAMACIN ORIENTADA A OBJETOS CON C++

DRA. NANCY ARANA


Universidad de Guadalajara.

Cambios menores respecto a C estructurado.


Extensin de los archivos: *.cpp Comentarios

Tipos enumerados
Tipos enumerados para colecciones de datos. Una vez que se declara un tipo como enum en C++ no es necesario volver a usar la palabra clave

// solo puede tomar los valores de color

Declaracin de variables de tipo estructura definida por el usuario. En C++ no es necesario colocar la palabra clave struct

Flexibilidad en declaracin de variables.


En ANSI C las variables tenan que ser declaradas (salvo que fueran extern) al comienzo de un bloque, antes de la primera sentencia ejecutable de dicho bloque. En C++ las variables pueden ser declaradas en cualquier lugar de un bloque (Un bloque es una unidad bsica de agrupamiento de declaraciones e instrucciones encerrada entre llaves ({}) ). For (register i=0; i<1000; i++){ double algo; algo=3.4 + i; } En C++ la variable que sirve de contador al bucle puede declararse e inicializarse en la propia sentencia for.

Alcance de una variable.


Al igual que C, en C++ el alcance puede variar de local, global (o de archivo), pero inclumos visibilidad y duracin de variables a nivel de clase, adems que, el alcance de una variable local se ve afectada por el bloque en el que se declare. Una variable local declarada dentro de un bloque oculta una variable global del mismo nombre u otra variable local tambin del mismo nombre declarada en un bloque ms exterior.
//se imprime 2.0 //se imprime 2.0 //se imprime 3.0 //se imprime 2.0

Operador de resolucin de visibilidad.


En C++ las variables definidas dentro de una clase variables miembro pueden ser declaradas como privadas o como pblicas5. Las variables miembro que han sido declaradas como privadas no son visibles fuera de la clase; si se declaran como pblicas se puede acceder a ellas mediante los operadores punto (.) y flecha (->), con las mismas reglas que para las variables miembro de las estructuras de C. Las funciones miembro de una clase tienen visibilidad directa sobre todas las variables miembro de esa clase, sin necesidad de que les sean pasadas como argumento. C++ dispone del operador (::), llamado operador de resolucin de visibilidad (scope resolution operator). Este operador, antepuesto al nombre de una variable global que est oculta por una variable local del mismo nombre, permite acceder al valor de la variable global6.

// escribe 2
.

//escribe 10 //escribe 2

const
En C++ el especificador const se puede utilizar con variables y con punteros. Si una variable se define como const se tiene la garanta de que su valor no va a cambiar durante toda la ejecucin del programa. Si en alguna sentencia del programa se intenta variar el valor de una variable definida como const, el compilador produce un mensaje de error. Esta precaucin permite detectar errores durante la compilacin del programa, lo cual siempre es ms sencillo que detectarlos en tiempo de ejecucin. Las variables const de C++ pueden ser utilizadas para definir el tamao de un vector en la declaracin de ste, cosa que no est permitida en C.

const para punteros


En el caso de los punteros hay que distinguir entre dos formas de aplicar el cualificador const: 1. un puntero variable apuntando a una variable constante. Un puntero a una variable const no puede modificar el valor de esa variable

2. un puntero constante apuntando a una variable cualquiera. El puntero siempre apuntar a la misma variable, pero sta puede cambiar su valor.

En ANSI C una variable declarada como const puede ser modificada a travs de un puntero a dicha variable.

Especificador inline para funciones.


C++ permite sustituir, en tiempo de compilacin, la llamada a una funcin por el cdigo correspondiente en el punto en que se realiza la llamada. De esta manera la ejecucin es ms rpida, pues no se pierde tiempo transfiriendo el control y realizando conversiones de parmetros. Las funciones inline resultan interesantes en el caso de funciones muy breves, que aparecen en pocas lneas de cdigo pero que se ejecutan muchas veces (en un bucle for, por ejemplo). 1. Una primera forma de utilizar funciones inline es anteponer dicha palabra en la declaracin de la funcin, como por ejemplo:

2. Otra forma de utilizar funciones inline sin necesidad de utilizar esta palabra es introducir el cdigo de la funcin en la declaracin (convirtindose de esta manera en definicin), ponindolo entre llaves { } a continuacin de sta. Este segundo procedimiento suele utilizarse por medio de ficheros header (*.h).

Sobrecarga de funciones.
La sobrecarga (overload) de funciones consiste en declarar y definir varias funciones distintas que tienen un mismo nombre. Dichas funciones se definen de forma diferente. En el momento de la ejecucin se llama a una u otra funcin dependiendo del nmero y/o tipo de los argumentos actuales de la llamada a la funcin. El valor de retorno no influye en la decisin del compilador (enlace esttico), respecto a qu funcin deber llamar.

Valores por defecto en la llamada de una funcin


En ANSI C se espera encontrar una correspondencia biunvoca entre la lista de argumentos actuales (llamada) y la lista de argumentos formales (declaracin y definicin) de una funcin. En C++ la situacin es diferente pues se pueden definir valores por defecto para todos o algunos de los argumentos formales. Despus, en la llamada, en el caso de que algn argumento est ausente de la lista de argumentos actuales, se toma el valor asignado por defecto a ese argumento.

La funcin mdulo puede entonces llamarse de las siguientes formas:

En el segundo caso se utiliza el valor por defecto n=3 incluido en la declaracin.

Parmetros por referencia


C++ ofrece una nueva forma de pasar argumentos por referencia a una funcin, que no obliga a utilizar dentro de la funcin el operador indireccin (*) para acceder al valor de la variable que se quiere modificar. Esto se hace por medio de un nuevo tipo de dato que no existe en C llamado tipo referencia (reference). Las variables referencia se declaran por medio del carcter (&). Por lo dems, son variables normales que contienen un valor numrico o alfanumrico. Se tiene la ventaja de que no hay que utilizar el operador indireccin (no hay que anteponerles ningn carcter u operador) dentro de la funcin a la cual se envan los parmetros. Los vectores y matrices (arrays) no pueden ser declarados como variables referencia, porque ya tienen una forma propia y natural de ser pasados como argumentos a una funcin.

Manejo de variables dinmicas: new y delete


Con los operadores new y delete el programador tiene entera libertad para decidir crear o destruir sus variables cuando las necesite. Una variable creada con el operador new dentro de cualquier bloque, perdura hasta que es explcitamente borrada con el operador delete. Puede traspasar la frontera de su bloque y ser manipulada por instrucciones de otros bloques. Se puede utilizar el operador new para crear variables de cualquier tipo, new devuelve, en todos los casos, un puntero a la variable creada. Tambin se pueden crear variables de tipos definidos por el usuario. Cuando una variable ya no es necesaria se destruye con el operador delete para poder utilizar la memoria que estaba ocupando, mediante una instruccin del tipo: delete <nombre_variable>;

Operaciones de entrada y salida: cout, cin.


En C++ adems de las funciones printf() y scanf(), que siguen estando vigentes, se pueden utilizar los operadores cin y cout. Para utilizar estos nuevos operadores es necesario incluir la librera iostream.h con la instruccin #include <iostream.h>. *14 Ya no hace falta especificar el tipo de dato que va a ser impreso o ledo, asocindolo con un formato determinado. Es el propio programa el que decide el tipo de dato en tiempo de ejecucin. Estos operadores estn sobrecargados de tal manera que admiten tanto los tipos predefinidos como aquellos tipos de datos definidos por el usuario. Para poder escribir o leer desde ficheros es necesario incluir la librera <fstream.h>. *14

Modificaciones mayores: Programacin Orientada a Objetos.


La Programacin Orientada a Objetos (POO) permite realizar grandes programas mediante la unin de elementos ms simples. A estas elementos ms simples, mdulos o "componentes", que interactan entre s cuando se ejecuta un programa, se les denomina objetos. Mientras que las clases son las especificaciones sintcticas que describen a los objetos que tendrn un mismo comportamiento y una misma estructura. Es decir es la implementacin del tipo de datos abstracto (datos y funciones que actan sobre dichos datos). Un objeto es la unidad individual que en tiempo de ejecucin realiza las tareas de un programa. Estos objetos interactan unos con otros, en contraposicin a la visin tradicional en la cual un programa es una coleccin de subrutinas (funciones o procedimientos), o simplemente una lista de instrucciones para el computador. Cada objeto es capaz de recibir mensajes, procesar datos y enviar mensajes a otros objetos de manera similar a un servicio.

Componentes de una clase


Atributos Determinan una estructura de almacenamiento para cada objeto de la clase (el dominio de las rutinas). Rutinas (Mtodos) Operaciones aplicables a los objetos nico modo de acceder a los atributos

Ejemplo: Clase cuenta bancaria.


Al modelar un banco, encontramos objetos cuenta. Todos los objetos cuenta tienen propiedades comunes:
atributos: saldo, titular, ... operaciones: retiro, depsito,

Definicin de la clase CUENTA. Cuenta titular: String; saldo: float; retiro(valor:float); depsito (valor:float);
Tiempo de ejecucin Atributos Mtodos

Definicin de clase en C++: atributos y mtodos.


// Cuenta.h, definicin del TAD Cuenta class Cuenta { public: Cuenta (Persona *titular=yo, saldo=0, codigo=nuevoCodigo(), ultOper=verUltOper()); void reintegro(int suma); void ingreso(int suma); int verSaldo(); int verUltOper(int n); static int nuevoCodigo(); //devuelve el ultimoCodigo y lo incrementa private: Persona * titular; int saldo; int codigo; int UltOper; static int ultimoCodigo; //variable de clase bool puedoSacar(int suma) {return (saldo >=suma);} };

// cuenta.cpp, Definicin de las funciones de la clase #include cuenta.h // inicializa la variable de clase int Cuenta :: ultimoCodigo = 0; void Cuenta :: retiro (int suma) { if puedoSacar(suma) saldo=saldo-suma; } void Cuenta :: deposito (int suma) { saldo=saldo+suma; } int Cuenta :: verSaldo () { return saldo; } int Cuenta :: verUltOper(int n) { ... } static int Cuenta :: nuevoCodigo() { return (ultimoCodigo++); }

Ocultacin de informacin: especificadores de acceso a miembros de una clase


En una definicin de clase, un especificador de acceso se utiliza para controlar la visibilidad de los miembros de una clase fuera del mbito de la clase (ocultacin de informacin, encapsulamiento o abstraccin). Los miembros de una clase pueden ser pblicos, privados o protegidos. Las palabras reservadas public, private y protected se utilizan para controlar el modo de acceso a la clase. Dentro de una declaracin de clase, cada una de estas palabras se puede utilizar para preceder a una o ms declaraciones de los miembros de una clase: - Acceso protegido. Los miembros protegidos significan que slo se puede acceder a ellos por funciones miembro dentro de la misma clase y por funciones miembro de clases derivadas de esta clase. - Acceso pblico. Los miembros pblicos son accesibles por cualquier parte del programa. - Acceso privado. Los miembros privados slo pueden ser utilizados por las funciones miembro de la clase y las funciones amigas de la clase.

Interfaz de la clase.
Una clase ofrece un conjunto de funciones pblicas a travs de las cuales se puede actuar sobre los datos, que sern privados. Estas funciones o mtodos pblicos constituyen la interfaz de la clase.

Clase amiga
friend <identificador>; Si <identificador> es una funcin, desde esta puede accederse a los miembros privados y protegidos de la clase anfitriona. Ejemplo: class C { friend void foo(C&); int x; // privada por defecto ... }; void foo(C& c) { cout << c.x << endl; } // Ok. Si <identificador> es una clase, los miembros privados y protegidos de la clase anfitriona pueden ser accedidos desde todas las funciones miembro de la invitada. Ejemplo: class C { friend class D; int x; // privada por defecto }; class D { int y; public: void getx(C c) { cout << c.x << endl; } // Ok. D(C& c) { y = c.x; } // Ok. };

Atributos y mtodos de clase (static): Miembros estticos de una clase.


El especificador de tipo de almacenamiento static puede utilizarse en la declaracin de propiedades y mtodos de clases. Tales miembros se denominan estticos y tienen distintas propiedades que el resto.

En cada instancia de la clase (objeto) existe una copia de los miembros no-estticos; por contra, hay una sola de los estticos para todas las instancias (objetos). La singularidad de estas copias conduce a algunas particularidades no permitidas al resto de los miembros. Por ejemplo, pueden ser accedidas sin referencia a ninguna instancia concreta de la clase y deben ser definidas como si fuesen variables estticas normales; adems se permiten algunas singularidades en la notacin de acceso a estos miembros.

Constructor de objetos.
Un constructor es una funcin especial que sirve para construir o inicializar objetos. En C++ la inicializacin de objetos no se puede realizar en el momento en que son declarados; sin embargo, tiene una caracterstica muy importante y es disponer de una funcin llamada constructor que permite inicializar objetos en el momento en que se crean. Un constructor es una funcin que sirve para construir un nuevo objeto y asignar valores a sus miembros dato.

Caractersticas de los constructores


Tienen el mismo nombre de la clase que inicializa Pueden definirse inline o fuera de la declaracin de la clase No devuelven valores Pueden admitir parmetros como cualquier otra funcin Pueden existir ms de un constructor, e incluso no existir
Si no se define ningn constructor de una clase, el compilador generar un constructor por defecto. El constructor por defecto no tiene argumentos y simplemente sita ceros en cada byte de las variables instancia de un objeto. Si se definen constructores para una clase, el constructor por defecto no se genera.

Un constructor del objeto se llama cuando se crea el objeto implcitamente: nunca se llama explcitamente a las funciones constructoras.

Creacin de objetos
Siempre que creamos objetos, invocamos al constructor. Los objetos se crean : i) cuando se declara una variable del tipo clase_del_objeto_instanciado Cuenta micuenta;

ii) con objetos creados dinmicamente con new Cuenta *micuenta; micuenta=new Cuenta() //otra opcin micuenta=new Cuenta(*persona)

Destructores
Un destructor es una funcin miembro con igual nombre que la clase, pero precedido por el carcter ~. Una clase slo tiene una funcin destructor que, no tiene argumentos y no devuelve ningn tipo. Un destructor realiza la operacin opuesta de un constructor, limpiando el almacenamiento asignado a los objetos cuando se crean. C++ permite slo un destructor por clase. El compilador llama automticamente a un destructor del objeto cuando el objeto sale fuera del mbito. Si un destructor no se define en una clase, se crear por defecto un destructor que no hace nada. Normalmente los destructores se declaran public.

Destruccin de objetos.
Los destructores se ejecutan automticamente cada vez que se libera memoria:
Al acabar un procedimiento (variables automticas) Al aplicar el operador delete () (variables dinmicas)

class Complejo { public: ~Complejo () {...}; Complejo(float pr = 0.0; float pi = 0.0); }; delete c1; No tiene argumentos y tampoco regresa un valor

Herencia
Mecanismo que permite definir una clase modificando una o ms clases ya existentes. Estas modificaciones consisten habitualmente en aadir nuevos miembros (variables o funciones), a la clase que se est definiendo, aunque tambin se puede redefinir variables o funciones miembro ya existentes. La clase de la que se parte en este proceso recibe el nombre de clase base, y la nueva clase que se obtiene se denomina clase derivada. sta a su vez puede ser clase base en un nuevo proceso de derivacin, iniciando de esta manera una jerarqua de clases. De ordinario las clases base suelen ser ms generales que las clases derivadas. Esto es as porque a las clases derivadas se les suelen ir aadiendo caractersticas, en definitiva variables y funciones que diferencian concretan y particularizan.

En algunos casos una clase no tiene otra utilidad que la de ser clase base para otras clases que se deriven de ella. A este tipo de clases base, de las que no se declara ningn objeto, se les denomina clases base abstractas (ABC, Abstract Base Class) y su funcin es la de agrupar miembros comunes de otras clases que se derivarn de ellas. La mayor ventaja del uso del mecanismo de la herencia es la posibilidad de reutilizar cdigo sin tener que escribirlo de nuevo. Esto es posible porque todas las clases derivadas pueden utilizar el cdigo de la clase base sin tener que volver a definirlo en cada una de ellas.

Tipos de herencia.
El proceso de herencia puede efectuarse de dos formas distintas: siendo la clase base public o private para la clase derivada.
En el caso de que la clase base sea public para la clase derivada, sta hereda los miembros public y protected de la clase base como miembros public y protected, respectivamente. Por el contrario, si la clase base es private para la clase derivada, sta hereda todos los datos de la clase base como private.

Para indicar que una clase deriva de otra es necesario indicarlo en la definicin de la clase derivada, especificando el modo -public o private- en que deriva de su clase base:
class <Clase_Derivada> : public o private <Clase_Base>

Consideraciones al usar herencia.


Si un miembro heredado se redefine en la clase derivada, el nombre redefinido oculta el nombre heredado que ya queda invisible para los objetos de la clase derivada. Hay algunos elementos de la clase base que no pueden ser heredados: = Constructores = Destructores = Funciones friend = Funciones y datos estticos de la clase = Operador de asignacin (=) sobrecargado

Un objeto de la clase derivada contiene todos los miembros de la clase base y todos esos miembros deben ser inicializados. Por esta razn el constructor de la clase derivada debe llamar al constructor de la clase base. Al definir el constructor de la clase derivada se debe especificar un inicializador base. Este inicilizador base se especifica poniendo, a continuacin de los argumentos del constructor de la clase derivada, el carcter dos puntos (:) y el nombre del constructor de la clase o las clases base, seguido de una lista de argumentos entre parntesis. El inicializador base puede ser omitido en el caso de que la clase base tenga un constructor por defecto. En el caso de que el constructor de la clase base exista, al declarar un objeto de la clase derivada se ejecuta primero el constructor de la clase base.

Polimorfismo
Capacidad de llamar a funciones distintas con un mismo nombre. Estas funciones pueden actuar sobre objetos distintos dentro de una jerarqua de clases, sin tener que especificar el tipo exacto de los objetos.

En todos los niveles de esta jerarqua est contenida una funcin llamada Funcion_1(). Esta funcin no tiene por qu ser igual en todas las clases, aunque es habitual que sea una funcin que efecte una operacin muy parecida sobre distintos tipos de objetos.

polimorfismo
Es importante comprender que el compilador no decide en tiempo de compilacin cul ser la funcin que se debe utilizar en un momento dado del programa. Esa decisin se toma en tiempo de ejecucin. A este proceso de decisin en tiempo de ejecucin se le denomina vinculacin dinmica o tarda, en oposicin a la habitual vinculacin esttica o temprana, consistente en decidir en tiempo de compilacin qu funcin se aplica en cada caso. A este tipo de funciones, incluidas en varios niveles de una jerarqua de clases con el mismo nombre pero con distinta definicin, se les denomina funciones virtuales. El polimorfismo hace posible que un usuario pueda aadir nuevas clases a una jerarqua sin modificar o recompilar el cdigo original. Esto quiere decir que si desea aadir una nueva clase derivada es suficiente con establecer la clase de la que deriva, definir sus nuevas variables y funciones miembro, y compilar esta parte del cdigo, ensamblndolo despus con lo que ya estaba compilado previamente.

Ejemplo
Como ejemplo, se puede pensar en dos tipos de cuentas bancarias que comparten algunas caractersticas y que tambin tienen algunas diferencias. Ambas cuentas tienen un saldo, un inters y el nombre del titular de la cuenta. La cuenta joven es un tipo de cuenta que requiere la edad del propietario, mientras que la cuenta empresarial necesita el nombre de la empresa. El problema podra resolverse estableciendo una clase base llamada C_Cuenta y creando dos tipos de cuenta derivados de dicha clase base.

Uso del polimorfismo


Como ejemplo se puede suponer que la cuenta_joven y la cuenta_empresarial antes descritas tienen una forma distinta de abonar mensualmente el inters al saldo. = En la cuenta_joven, no se abonar el inters pactado si el saldo es inferior a un lmite. = En la cuenta_empresarial se tienen tres cantidades lmite, a las cuales se aplican factores de correccin en el clculo del inters. El clculo de la cantidad abonada debe realizarse de la siguiente forma: 1. Si el saldo es menor que 50000, se aplica el inters establecido previamente. 2. Si el saldo est entre 50000 y 500.000, se aplica 1.1 veces el inters establecido previamente. 3. Si el saldo es mayor a 500.000, se aplica 1.5 veces el inters establecido previamente.

Você também pode gostar