Вы находитесь на странице: 1из 28

MANUAL DE PROGRAMACION EN C++

INTRODUCCION

La solucin integral de los problemas de ingeniera necesita competencias en diferentes reas del
conocimiento, y en este caso particular, el aprendizaje de herramientas eficientes para el
desarrollo de software especfico, por parte del estudiante, reviste gran importancia. Las
soluciones de software en la actualidad ofrecen gran versatilidad frente a las soluciones fsicas,
dadas sus caractersticas de escalabilidad y evolucin.

La Programacin Orientada a Objetos se hace pertinente para ampliar la visin de los estudiantes,
como programadores, con conceptos de mayor dimensin y abstraccin que les permitan resolver
problemas con mayor grado de complejidad y ms cercanos a la realidad. De esta forma un
estudiante adquiere habilidades para abordar problemas de forma integral y puede aplicar el
desarrollo e implementacin de software en cualquier rea, incluso no relacionada con ingeniera.

El presente documento busca exponer de forma clara los principales conceptos relacionados con
la Programacin Orientada a Objetos y mostrar sus principales aplicaciones, as como ilustrar con
ejemplos aplicados a problemas de ingeniera, sus conocidas ventajas frente a otras tcnicas y
metodologas de programacin.

127

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

OBJETIVOS

General
Presentar los conceptos y aplicaciones de la Programacin Orientada a Objetos (POO), las tcnicas
de implementacin de esta metodologa en lenguaje C++ y sus ventajas en el desarrollo de
software de aplicacin especfica.

Especficos
-

Comprender las nociones de la abstraccin de datos a travs del estudio de los Tipos de Datos
Abstractos (TDA) ms utilizados.

Presentar los conceptos fundamentales de la POO y su implementacin en lenguaje C++.

Presentar la herencia y sus principales caractersticas, como una forma de reutilizacin de


software.

Estudiar la utilizacin de apuntadores, como una de las caractersticas ms poderosas del


lenguaje C++.

Presentar las tcnicas para crear y manipular estructuras dinmicas de datos.

128

MANUAL DE PROGRAMACION EN C++

CONCEPTOS BSICOS DE PROGRAMACIN ORIENTADA A OBJETOS

Introduccin
En la vida diaria los seres humanos piensan en objetos. La Programacin Orientada a Objetos
(POO) es una forma de realizar programas que utiliza, precisamente, los objetos como su
elemento de construccin fundamental. En esta unidad modular se presentan los conceptos
bsicos de la POO y su implementacin en el lenguaje C++.

Objetivo General
Presentar los conceptos fundamentales de la POO y su implementacin en lenguaje C++.

Objetivos especficos

9.1

Conocer los fundamentos de la POO en el lenguaje C++.

Aprender a disear y utilizar clases y objetos en C++.

Conocer las principales caractersticas de la implementacin de clases en el lenguaje C++.

CONCEPTOS FUNDAMENTALES DE POO

Pensar en objetos es pensar como lo hacemos en la vida real. Si usted mira a su alrededor lo que
ve son objetos, personas, animales, libros, computadores, muebles, edificios, etc. La Programacin
Orientada a Objetos (POO) es un estilo de programacin que emplea los objetos como
componentes fundamentales para la construccin de programas. Es decir, realiza un modelado de
objetos reales, sus caractersticas y comportamiento.

Objetos
Un objeto es una representacin detallada, concreta y particular de algo. Corresponden a los
objetos reales del mundo que nos rodea, o a objetos internos del programa. Vistos de esta
manera, son tipos abstractos de datos que estn conformados por atributos y funciones que
actan sobre esos atributos. Es decir, un objeto es una unidad que contiene datos y las funciones
que operan sobre esos datos. A los elementos de un objeto se les conoce como miembros; las
funciones que operan sobre los datos se denominan funciones miembro y los datos se
denominan miembros datos.

129

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Los objetos pueden se cualquier entidad del mundo real:

Objetos fsicos:

Carros

Barcos

Personas

Animales, etc.

Tipos de datos definidos por el usuario

Hora del da

Fraccionarios

En C++ un programa consta de objetos. Los objetos de un programa se comunican entre s


mediante el paso o envo de mensajes (acciones que debe ejecutar el objeto).
Adicionalmente, un objeto tiene una identidad que determina su estado y su comportamiento
particular en un momento dado. Dicha identidad permite diferenciar objetos entre s. Por otro
lado, el estado de un objeto es el conjunto de valores concretos que lo caracterizan en un
momento dado.

Mensajes
Los objetos de un programa se comunican entre s mediante el paso o envo de mensajes. Estos
mensajes producen la ejecucin de las funciones de los objetos. Sin embargo, los objetos se
ocultan informacin entre s, es decir, en general un objeto no sabe cmo est implementado otro
objeto diferente.

Clases
La definicin de objeto nos lleva a una de los conceptos fundamentales de la POO que es el de
clase. Una clase se puede considerar como un patrn para construir objetos, es decir, son tipos de
datos definidos por el programador, quien determina las estructuras de datos y las operaciones
asociadas con ese tipo.
130

MANUAL DE PROGRAMACION EN C++

En C++, un objeto es slo un tipo de variable de una clase determinada. Cada vez que se construye
un objeto de una clase, se crea una instancia de esa clase. As como a una instancia del tipo
predefinido double se le llama variable, una instancia de una clase es el objeto. Por consiguiente,
una clase define las propiedades y comportamiento de un tipo de objeto concreto. La
instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas.

Es importante diferenciar entre objetos y clases, una clase es una coleccin de objetos similares y
un objeto es una instancia de una definicin de una clase. La clase es simplemente una
declaracin, no tiene asociado ningn objeto, de modo que no puede recibir mensajes ni
procesarlos, esto nicamente lo hacen los objetos.

Herencia
La herencia es la propiedad que permite la creacin de clases a partir de clases que ya existen, las
cuales heredan caractersticas y funciones de las clases existentes. En C++ la clase original se llama
clase base; y las clases definidas a partir de dicha clase base se denominan clases derivadas. Las
clases derivadas pueden heredar atributos de la base pero tambin pueden adicionar sus propias
caractersticas y funciones.

La herencia produce relaciones jerrquicas entre las clases, pues existen clases hijas y padres.
Dependiendo del tipo de herencia existen clases que reciben caractersticas de una sola clase
(herencia simple) y otras clases que reciben atributos de ms de una clase base (herencia
mltiple).

Lenguaje Unificado de Modelado (UML)


El UML es un lenguaje grfico utilizado para representar los programas orientados a objetos de
manera visual. Representa las relaciones entre clases bases y clases derivadas as como entre
objetos.

Polimorfismo
Es una caracterstica de la POO que describe el hecho de que una funcin puede tener un
comportamiento diferente dependiendo del tipo de objeto sobre el cual est actuando. Por
131

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

ejemplo, se puede definir la funcin multiplicar como la multiplicacin entre dos nmeros
escalares as como la multiplicacin entre dos matrices.

Programa orientado a objetos


Un programa orientado a objetos se puede ver como un conjunto de clases. Debe tener una
funcin principal que se encarga de la creacin de los objetos y comienza la ejecucin de las
funciones de dichos objetos.

La ejecucin de un programa orientado a objetos consta fundamentalmente de tres pasos:

1. Creacin de los objetos en el momento en el que se necesiten.


2. Envo y recepcin de mensajes entre objetos.
3. Eliminacin de los objetos que ya no son necesarios.

9.2

CLASES

La programacin orientada a objetos encapsula atributos y operaciones en clases. Una clase es un


tipo abstracto de dato definido por el usuario que est conformado por atributos y operaciones.
En C++ los atributos son implementados como datos mientras que las operaciones son funciones.

As como un plano permite la construccin de varias casas, a partir de una clase se pueden crear
varios objetos. Por consiguiente, los objetos son las instancias de las clases, cada que se construye
un objeto de una clase, se est creando una instancia de dicha clase. Por esta razn, se utilizan
indistintamente los trminos objeto e instancia de una clase.

Generalmente, las clases se denominan con sustantivos abstractos, como por ejemplo Animal,
Persona, Factura, entre otros.

Ejemplo:
Podemos tener, por ejemplo, una clase denominada Gato con determinadas propiedades y
comportamientos. Una vez creada dicha clase podemos crear dos instancias una llamada
132

MANUAL DE PROGRAMACION EN C++

"Garfield" y otra llamada Mimi que tendrn ciertas propiedades especficas y los
comportamientos de dicha clase. Los atributos de la clase Gato podran ser: sexo, color, raza y
nivel de cansancio. Por su parte, las operaciones de Gato podran ser: paseo, quieto y muerte.

Algunas de las principales caractersticas de las clases son:

Abstraccin:
La abstraccin de datos permite no preocuparse de los detalles no esenciales. Al tener un conjunto
de objetos con caractersticas similares, su comportamiento e informacin puede abstraerse en
una sola clase abstracta o interfaz para recoger estas semejanzas. La abstraccin desde el punto
de vista de la POO expresa las caractersticas esenciales de un objeto, las cuales lo diferencian de
los dems, y permiten determinar lmites conceptuales entre objetos y entre clases. De esta
manera, la abstraccin minimiza la cantidad de caractersticas que definen a un objeto y evita
repeticin de cdigo.
La abstraccin en POO surge del hecho de que cada clase del programa es un modelo de un
"agente" abstracto que puede realizar funciones, informar y cambiar su estado, y "comunicarse"
con otras clases en el sistema sin revelar cmo se implementan estas caractersticas. Los procesos,
las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de
tcnicas son requeridas para ampliar una abstraccin.

Encapsulamiento:
Las clases tienen la propiedad de ocultar informacin a otras clases. El encapsulamiento hace
referencia a que los atributos de un objeto solo pueden ser modificados por otro objeto a travs
de mensajes explcitos enviados por el primero. Es decir, un objeto no puede modificar la
informacin de otro directamente aunque pueden comunicarse entre s a travs de interfaces.

El encapsulamiento consiste en ocultar los detalles de la implementacin de un objeto, a la vez


que se provee una interfaz pblica por medio de sus mtodos permitidos. Tambin se define como
la propiedad de los objetos de permitir acceso a su estado solamente a travs de su interfaz o de
relaciones preestablecidas con otros objetos.

Polimorfismo
Esta propiedad se refiere al hecho de que una misma funcin puede tener comportamientos
133

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

diferentes y estar asociada a objetos distintos.

Herencia:
Las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de
clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las
que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo
a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos
pueden compartir (y extender) su comportamiento sin tener que re-implementar su
comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en
rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de
una clase se dice que hay herencia mltiple.

Persistencia
Hace referencia al tiempo que un objeto es mantenido en memoria y puede ser utilizado por
aplicacin sin ser destruido. Cuando un objeto deja de ser necesario, ste puede ser destruido y la
memoria que utilizaba puede devolverse al sistema para ser utilizado por la misma u otra
aplicacin.

La definicin de una clase consta de dos partes: una declaracin y una implementacin. La
declaracin es la lista de los miembros de la clase. La implementacin o cuerpo define las
funciones de la clase. A continuacin se describen cada uno de estos pasos.

9.2.1

DECLARACIN DE UNA CLASE

Las clases estn conformadas por un conjunto de caractersticas y de funciones, las cuales son
equivalentes a las funciones en los lenguajes estructurados. Se diferencian de ellos en que es
posible acceder a las variables de la clase de forma implcita. A los atributos se les conoce como
miembros dato y son las caractersticas que describen el objeto. Las funciones son conocidas en
C++ como funciones miembro o como mtodos en otros lenguajes de programacin. Dichas
funciones pueden estar relacionadas entre s, modificar el estado del objeto o invocar
funcionalidades de otros objetos, entre otras cosas.

Una clase se puede definir con struct, union o class pero la forma que caracteriza la POO es utilizar
la palabra reservada class. La sintaxis de una clase es:

134

MANUAL DE PROGRAMACION EN C++

//Sintaxis de la declaracin de una clase


class nombre_clase
{
membro_dato1;
miembro_dato2;
...
funcion_miembro1();
funcion_miembro2();
...
};

Como se puede ver una clase es sintcticamente 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
son por defecto pblicos. Suponga que usted va a desarrollar un programa para manejas el
inventario de su empresa. Para esto definiremos una clase de tipo elemento cuyos miembros
datos podran ser: nombre, marca y cantidad; sus funciones podran ser simplemente aumentar
cantidad y disminuir cantidad.
class elemento
{
char nom[20];
char marca[20];
int cantidad;

void aumentar_cantidad(int numero);


void disminuir_cantidad(int numero);
};

Una de las caractersticas fundamentales de una clase es ocultar tanta informacin como sea
posible. Por consiguiente, es necesario imponer ciertas restricciones en el modo en que se puede
manipular una clase y de cmo se pueden utilizar los datos y el cdigo dentro de una clase.
En la declaracin de una clase se utilizan los especificadores de acceso para controlar la visibilidad de
135

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

los miembros de una clase, fuera del mbito de la clase.


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 pblico. Los miembros pblicos son accesibles por cualquier parte del programa.

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 privado. Los miembros privados slo pueden ser utilizados por las funciones
miembro de la clase y las funciones amigas de la clase.

Una clase puede contener partes pblicas y partes privadas. Por defecto, todos los miembros
definidos en la clase son privados. Para hacer las partes de una clase pblicas (esto es, accesibles
desde cualquier parte del programa) deben declararse despus de la palabra reservada public.
Todas las variables o funciones definidas despus de public son accesibles a las restantes funciones
del programa. Dado que una caracterstica clave de la POO es la ocultacin de datos, debe tenerse
presente que aunque se pueden tener variables pblicas, desde un punto de vista conceptual se
debe tratar de limitar o eliminar su uso. En su lugar, deben hacerse todos los datos privados y
controlar el acceso a ellos a travs de funciones pblicas. Considere la clase de tipo artculo que se
declara en el siguiente ejemplo. En ella se tiene dos miembros dato privados y una funcin
miembro pblica.
class articulo
{
private:
float precio;
char nombre[30];

public:
void indicar();
};

136

MANUAL DE PROGRAMACION EN C++

Por defecto u omisin todo lo declarado dentro de una clase es privado y slo se puede acceder a
ello con las funciones miembro declaradas en el interior de la clase o con funciones amigas.

Los miembros que se declaran en la seccin protegida de una clase slo pueden ser accedidos por
funciones miembro declaradas dentro de la clase, por funciones amigas o por funciones miembro
de clases derivadas.

A los miembros que se declaran en la regin pblica de una clase se puede acceder a travs de
cualquier objeto de la clase de igual modo que se accede a los miembros de una estructura en
C++.

En el siguiente ejemplo se declara una clase con ms miembros que la clase del ejemplo anterior.
Ntese que hay miembros datos cuyo especificador de acceso est sin definir, por lo cual sern
tomados al compilar como miembros dato privados. De igual forma se declara un miembro dato
pblico. En cuanto a las funciones todas las funciones de la clase son pblicas.
class alfa
{
int x;

//miembros dato privados

float y;
char z;
public:
double k;

//miembro dato pblico

void fijar(int,float,char);

//funciones miembro pblicas

void visualizar();
};

Miembros dato
La lista de miembros dato de una clase puede comprender cualquier tipo vlido en C++. Puede
contener tipos primarios, estructuras e incluso apuntadores a cualquier tipo vlido. Los miembros
dato pueden ser incluso clases. En cualquier caso slo las instancias de clases definidas o
declaradas previamente pueden ser miembros.
137

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Los miembros dato declarados en la clase se deben considerar equivalentes a campos de una
estructura, no a variables. Tal como las estructuras, se debe declarar un objeto de un tipo clase y a
continuacin se inicializan sus miembros dato.

Adems de los especificadores de acceso utilizados para definir los miembros de una clase. Un
miembro dato de una clase se puede declarar esttico (static). Para un miembro dato, la
designacin static significa que existe slo una instancia de ese miembro. Un miembro dato
esttico es compartido por todos los objetos de una clase. A un miembro dato static se le asigna
una zona fija de almacenamiento en tiempo de compilacin, al igual que una variable global, pero
el identificador de la variable est dentro de mbito utilizando solamente el operador (::) con el
nombre de la clase.

Los miembros datos se asignan generalmente con la misma clase de almacenamiento. Para
declarar o inicializar un miembro static se utiliza la misma notacin que una variable global.
class ejemplo
{
public:
static int valor;

//declarar miembro esttico

};

int ejemplo::valor;

//definir miembro esttico

void main()
{
ejemplo e1,e2;
e1.valor=1;
e2.valor=10;
}

A los miembros dato static se puede acceder:


138

MANUAL DE PROGRAMACION EN C++

Utilizando el operador punto

Utilizando el operador flecha, si el lado izquierdo es un apuntador a objeto

Utilizando el identificador de la clase sin referenciar un objeto real: ejemplo::valor=3;

Los miembros datos static no siempre tienen que ser public.


class ejemplo
{
private:
static int valor;

//declarar miembro esttico

};

int ejemplo::valor=5; //definir miembro esttico

void main()
{
ejemplo e1;
e1.valor=1; //error: acceso no vlido
}

Para acceder a un miembro dato private static se necesita utilizar el operador (::). Otros medios
son:
-

A travs de una funcin miembro de la clase

A travs de una funcin declarada amiga de la clase

Funciones miembro
Una operacin de una clase, es un servicio que la clase proporciona a los clientes de la clase. Por lo
general, los objetos no realizan sus operaciones de manera autnoma sino que requieren de la
recepcin de un mensaje que es enviado por un objeto cliente.

139

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Las funciones miembro implementan las operaciones permitidas sobre los tipos de datos de una
clase. Para declarar una funcin miembro hay que situar su prototipo en el cuerpo de la clase. No
hay que definir la funcin dentro de la clase; dicha definicin puede estar fuera de la clase e
incluso en un archivo independiente, aunque tambin pueden ser definidas en lnea dentro de la
clase.

Las funciones miembro son necesarias para acceder a los datos privados. En general, son pblicas;
si no lo fueran, ninguna otra funcin podra llamarlas. Se pueden declarar para devolver valores
con tipos incluyendo objetos de clases, apuntadores o referencias. Pueden ser declaradas tambin
para aceptar cualquier nmero y tipo de argumentos. Los argumentos por defecto estn
permitidos, as como la notacin de puntos suspensivos.

9.2.2

IMPLEMENTACIN DE UNA CLASE

Una vez se ha declarado la clase es necesario definir cada una de las funciones miembro que sta
contiene. La definicin de funciones miembro es muy similar a la definicin ordinaria de funcin.
Tienen una cabecera y un cuerpo y pueden tener tipos y argumentos. Una de las principales
caractersticas de las funciones miembro es que stas por pertenecer a la clase pueden tener
acceso a las componentes privadas de la clase.

Existen dos opciones para llevar a cabo la implementacin de las funciones miembro de las clases.

En la primera opcin la funcin de define en lnea (inline). Por cada llamada a esta funcin,
el compilador genera (vuelve a copiar) las diferentes instrucciones de la funcin, por
consiguiente, no existe una nica copia de la funcin dentro del cdigo sino que cada vez
que se realiza una llamada a la funcin se crea una copia de ella en lugar de invocarla. La
ventaja de este tipo de funciones es que el programa se ejecuta ms rpidamente, el
inconveniente es que se requiere mayor espacio en memoria para su ejecucin.
Hay dos formas de implementar la declaracin en lnea. La primera es implementando la
funcin inmediatamente sta es declarada y la segunda es haciendo uso de la palabra
reservada inline. En esta ltima se utiliza el operador de resolucin de mbito (::) para
identificar la clase a la cual pertenece la funcin
En la siguiente tabla se presenta un ejemplo de las dos formas de implementaciones de
140

MANUAL DE PROGRAMACION EN C++

funciones en lnea. En la primera celda implementando la funcin dentro de la declaracin


y en la segunda utilizando la palabra reservada inline.
class ejemplo

class ejemplo

{
int x,y;

int x,y;

public:

public:

void f()

void f();

};
cout<<"x= "<<x<<" y= "<<y<<endl;

inline void ejemplo::f()


{

};

cout<<"x= "<<x<<" y= "<<y<<endl;


}

En la segunda opcin la funcin f se llamar con una llamada verdadera de funcin. En


este caso la funcin se implanta por fuera de la declaracin de la clase. En este caso
tambin se hace uso del operador de resolucin de mbito (::) para identificar la clase a la
cual pertenece la funcin. En el siguiente ejemplo se presenta la misma clase llamada
ejemplo del ejemplo anterior pero ahora la funcin f est implementada fuera de la
declaracin.
//Declaracin de una clase y definicin de funcin miembro fuera de la clase
class ejemplo
{
int x,y;
public:
void f();
};
void ejemplo::f()
{
cout<<"x= "<<x<<" y= "<<y<<endl;

141

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Esta declaracin significa que la funcin f es miembro de la clase ejemplo. El nombre de la clase a
la cual est asociada la funcin miembro se aade como prefijo al nombre de la funcin. El
operador (::) separa el nombre de la clase del nombre de la funcin. Diferentes clases pueden
tener funciones del mismo nombre y la sintaxis indica la clase asociada con la definicin de la
funcin.

9.3

OBJETOS

Un objeto es un elemento declarado de un tipo clase. Se conoce tambin como una instancia de
una clase. Los objetos se pueden tratar como cualquier variable C++. La principal diferencia es que
se puede llamar a cualquiera de las funciones que pertenecen a un objeto, esto es, se puede
enviar un mensaje a ella.

La comunicacin con el objeto se realiza a travs del paso de mensajes. El envo a una instancia de
una clase produce la ejecucin de una funcin miembro. El paso de mensajes es el trmino
utilizado para referirnos a la invocacin o llamada de una funcin miembro de un objeto.

Retomando el primer ejemplo de la seccin 2.2.1 en donde se tena la declaracin de una clase de
tipo elemento para manejar un inventario un objeto de esta clase se definira como todas las
variables en C++, de la siguiente manera:
elemento tornillos, tuercas;

De igual forma, haciendo uso del tercer ejemplo de la seccin 2.2.1, se defini una clase de tipo
alfa. Una vez definida esta clase, sta puede ser usada dentro del main() como se presenta en el
siguiente ejemplo. Ntese que en primer lugar se define un objeto del tipo alfa. Posteriormente se
hace uso de las funciones miembros, las cuales se definieron como pblicas y no se produce
ningn error. Sin embargo, no se puede acceder a los miembros privados.
int main()
{
alfa obj;

//declaracin de un objeto

142

MANUAL DE PROGRAMACION EN C++

obj.fijar(3,2.1,'a'); //invocar a una funcin miembro


obj.visualizar();

obj.x=4;

//invocar a una funcin miembro

//error: no se puede acceder a datos privados

obj.k=3.2; //vlido: k est en la regin pblica


return 0;
}

9.3.1

ASIGNACIN DINMICA DE MEMORIA

Los operadores new y delete se pueden utilizar para crear y destruir objetos de una clase, as
como dentro de funciones constructoras y destructoras.
Un objeto de una determinada clase se crea cuando la ejecucin del programa entra en el mbito
en que est definida y se destruye cuando se llega al final del mbito. Esto es vlido tanto para
objetos globales como locales, ya que los objetos globales se crean al comenzar el programa y se
destruyen al salir de l. Sin embargo, se puede crear un objeto tambin mediante el operador
new, que asigna la memoria necesaria para alojar el objeto y devuelve su direccin, en forma de
puntero, al objeto en cuestin.
Los constructores normalmente implican la aplicacin de new.
p =new int(9) //p es un puntero a int inicializado a 9
cadena cad1("hola");
cadena *cad2=new cadena;

Un objeto creado con new no tiene mbito, es decir, no se destruye automticamente al salir
fuera del mbito, sino que existe hasta que se destruye explcitamente mediante el operador
delete.
class cadena
{
char *datos;
public:cadena(int);
~cadena();

143

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

};
cadena::cadena(int lon)
{
datos=new char[lon];
}
cadena::~cadena()
{
delete datos;
}

9.3.2

CONSTRUCTORES

El objetivo de un constructor es el de inicializar un objeto cuando ste es creado. Asignaremos los


valores iniciales as como los procesos que sta clase deba realizar.

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. Se caracteriza por:
- Tener el mismo nombre de la clase que inicializa
- Puede definirse inline o fuera de la declaracin de la clase
- No devuelve valores
- Puede admitir parmetros como cualquier otra funcin
- Puede 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
144

MANUAL DE PROGRAMACION EN C++

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. Esto significa que se llama cuando se ejecuta la
declaracin del objeto. Tambin, para objetos locales, el constructor se llama cada vez que la
declaracin del objeto se encuentra. En objetos globales, el constructor se llama cuando se
arranca el programa.

El constructor por defecto es un constructor que no acepta argumentos. Se llama cuando se define
una instancia pero no se especifica un valor inicial.

Se pueden declarar en una clase constructores mltiples, mientras tomen parte diferentes tipos o
nmero de argumentos. El compilador es entonces capaz de determinar automticamente a qu
constructor llamar en cada caso, examinando los argumentos. Los argumentos por defecto se
pueden especificar en la declaracin del constructor. Los miembros dato se inicializarn a esos
valores por defecto, si ningn otro se especifica.

Ejemplo
class prueba
{
tipo1 d1;
tipo2 d2;
tipo3 d3;
public:
prueba(tipo1 p1, tipo2 p2, tipo3 p3):d1(p1),d2(p2),d3(p3)
{ }
};

Un constructor que crea un nuevo objeto a partir de uno existente se llama constructor copiador o
de copia. El constructor de copias tiene slo un argumento: una referencia constante a un objeto
de la misma clase. Un constructor copiador de una clase complejo es:
145

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

complejo::complejo(const complejo &fuente)


{
real=fuente.real;
imag=fuente.imag;
}

Si no se incluye un constructor de copia, el compilador crear un constructor de copia por defecto.


Este sistema funciona de un modo correcto en la mayora de los casos, aunque en ocasiones
puede producir dificultades. El constructor de copia por defecto inicializa cada elemento de datos
del objeto a la izquierda del operador = al valor del elemento dato equivalente del objeto de la
derecha del operador =.

9.3.3

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.

Considere el siguiente ejemplo en el cual se crea la clase cadena con su constructor y destructor
correspondiente.
class cadena {
public:
cadena();

// Constructor por defecto

~cadena();

// Destructor

void Asignar(char *dest);


char *Leer(char *c);
private:

146

MANUAL DE PROGRAMACION EN C++

char *cad;

// Puntero a char: cadena de caracteres

};

cadena::cadena() : cad(NULL) {}

cadena::~cadena() {
delete[] cad;

// Libera la memoria reservada a cad

void cadena::Asignar(char *dest) {


// Eliminamos la cadena actual:
delete[] cad;
// Reservamos memoria para la nueva y la almacenamos
cad = new char[strlen(dest)+1];
// Reserva memoria para la cadena
strcpy(cad, dest);

// Almacena la cadena

char *cadena::Leer(char *c) {


strcpy(c, cad);
return c;
}

9.3.4

SOBRECARGA DE FUNCIONES Y OPERADORES

C++ proporciona las herramientas necesarias que permiten definir funciones y operadores que
utilizan el mismo nombre o smbolo que una funcin u operador incorporado. Esto se conoce
como sobrecarga de funciones o sobrecarga de operadores. Estas funciones y operadores se dicen
que estn sobrecargados y se pueden utilizar para redefinir una funcin u operador definido.

Sobrecarga de funciones
147

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Dos funciones pueden tener el mismo nombre pero tener una implementacin y argumentos de
entrada y variables de retorno diferentes. Esta caracterstica se conoce como sobrecarga de
funciones. Por consiguiente, cuando se habla de una funcin sobrecargada se hace referencia a
una funcin que tiene ms de una definicin.
Las funciones sobrecargadas suelen diferenciarse por el nmero y tipo de argumentos, aunque
tambin hay funciones sobrecargadas que devuelven tipos distintos.
En la programacin orientada a objetos las funciones sobrecargadas suelen utilizarse para las
funciones miembro y constructora de la clase. Cuando ms de una funcin miembro con igual
nombre se declara en una clase, se dice que el nombre de la funcin est sobrecargado en esa
clase.

Considere el mismo ejemplo del numeral anterior. Ahora vamos a sobrecargar la funcin
constructora de la clase cadena.
class cadena {
public:
cadena();

// Constructor por defecto

cadena(char *c); // Constructor desde cadena c


cadena(int n); // Constructor de cadena de n caracteres
cadena(const cadena &); // Constructor copia
~cadena();

// Destructor

void Asignar(char *dest);


char *Leer(char *c);
private:
char *cad;

// Puntero a char: cadena de caracteres

};

cadena::cadena() : cad(NULL) {}

cadena::cadena(char *c) {

148

MANUAL DE PROGRAMACION EN C++

cad = new char[strlen(c)+1];// Reserva memoria para cadena


strcpy(cad, c);

// Almacena la cadena

cadena::cadena(int n) {
cad = new char[n+1]; // Reserva memoria para n caracteres
cad[0] = 0;

// Cadena vaca

cadena::cadena(const cadena &Cad) {


// Reservamos memoria para la nueva y la almacenamos
cad = new char[strlen(Cad.cad)+1];
// Reserva memoria para cadena
strcpy(cad, Cad.cad);

// Almacena la cadena

cadena::~cadena() {
delete[] cad;

// Libera la memoria reservada a cad

void cadena::Asignar(char *dest) {


// Eliminamos la cadena actual:
delete[] cad;
// Reservamos memoria para la nueva y la almacenamos
cad = new char[strlen(dest)+1];
// Reserva memoria para la cadena
strcpy(cad, dest);

// Almacena la cadena

149

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

char *cadena::Leer(char *c) {


strcpy(c, cad);
return c;
}

Sobrecarga de operadores
De modo anlogo a la sobrecarga de funciones, la sobrecarga de operadores permite al
programador dar nuevos significados a los smbolos de los operadores existentes en C++.
C++ permite a los programadores sobrecargar a los operadores para tipos abstractos de datos.
Operadores que se pueden sobrecargar: +, -, *, /, %, ^, &, |, _, ', =, <, >, <=, >=, ++, --, <<, >>, ==, 0,
%%, ||, +=, -=, *=, /=, %=, &=, |=, <<=, >>=, [ ], ( ), ->, ->*, new, delete
Si un operador tiene formatos unitarios y binarios (tales como + y &) ambos formatos pueden ser
sobrecargados. Un operador unitario tiene un parmetro, mientras que un operador binario tiene
dos. El nico operador ternario, ?:, no se puede sobrecargar.
Existen una serie de operadores que no se pueden sobrecargar: ., ::, ?:, sizeof
La sobrecarga de operadores en C++ tiene una serie de restricciones que es necesario tener
presente a la hora de manejar operadores sobrecargados:
* Se pueden sobrecargar slo los operadores definidos en C++
* La sobrecarga de operadores funciona slo cuando se aplica a objetos de una clase
* No se puede cambiar la preferencia o asociatividad de los operadores en C++
* No se puede cambiar un operador binario para funcionar con un nico objeto
* No se puede cambiar un operador unitario para funcionar con dos objetos
* No se puede sobrecargar un operador que funcione exclusivamente con punteros
La clave para la sobrecarga de un operador es una funcin incorporada a C++ que permite al
programador sustituir una funcin definida por el usuario para uno de los operadores existentes.
Para sobrecargar un operador, se debe definir lo que significa la operacin relativa a la clase a la
cual se aplica. Para hacer esta operacin, se crea una funcin operador, que define su accin. El
formato general de una funcin operador es el siguiente: tipo nombre_clase::operator op
(lista_argumentos) {...} , en donde tipo es el tipo del valor devuelto por la operacin especificada.
Los operadores sobrecargados, con frecuencia tienen un valor de retorno que es del mismo tipo
que la clase para la cual el operador se sobrecarga.
Las funciones operador deben ser miembro o amigas de la clase que se est utilizando.
Las funciones operador tienen la misma sintaxis que cualquier otra, excepto que el nombre de la
150

MANUAL DE PROGRAMACION EN C++

funcin es operator op, donde op es el operador que se sobrecarga.

9.4

FUNCIONES AMIGA

Una funcin amiga es una funcin no miembro de una clase que puede tener acceso a las partes
privadas de una clase; se debe declarar como amiga de la clase mediante la palabra reservada
friend.

Las funciones amigas se declaran situando su prototipo de funcin en la clase de la que son amiga
precedindola con la palabra reservada friend. Por ejemplo:
class cosa
{
int datos;
public:
friend void cargar (cosa& t, int x);
};

void cargar(cosa& t, int x)


{
t.datos=x;
}

Como la funcin cargar se declara amiga de la clase cosa puede acceder al miembro privado datos.

Las razones fundamentales para utilizar funciones amigas es que algunas funciones necesitan
acceso privilegiado a ms de una clase. Una segunda razn es que las funciones amigas pasan
todos sus argumentos a travs de la lista de argumentos y cada valor de argumento se somete a la
conversin de asignacin.

Por ltimo, consideremos el siguiente ejemplo en el cual se hace uso de las funciones amiga. Se
puede ver que la clase miclase tiene una funcin amiga llamada factor que tiene acceso inmediato
151

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

a los datos miembro privados de la clase n y d. Ah radica la importancia de definiciones de las


funciones amiga.
#include <iostream>
using namespace std;
class miclase{
int n,d;
public:
miclase(int i, int j){n=i;d=j;}
friend int factor(miclase ob);
};
int factor(miclase ob)
{
if (!(ob.n%ob.d))
return 1;
else
return 0;
}
void main()
{
miclase obj1(10,2), obj2(3,2);
if(factor(obj1))
cout << "es factor";
else
cout << "no es factor";
}

9.4.1

CLASES AMIGAS

No slo puede ser una funcin, amiga de una clase, tambin una clase completa puede ser amiga
de otra clase. En este caso todas las funciones de la clase amiga pueden acceder a las partes
privadas de la otra clase.
152

MANUAL DE PROGRAMACION EN C++

Una clase amiga puede ser declarada antes de que pueda ser designada como amiga.
class animales;

class hombre
{
public:
friend class animales;
};

class animales
{//..

};

Cada funcin miembro de animales es amiga de la clase hombre. La designacin de un amigo


puede estar en una seccin private o public de una clase.

Resumen
Las clases permiten al programador modelar objetos con atributos y comportamientos. Se puede
utilizar el nombre de una clase como el nombre de un tipo de dato para declarar instancias de
dicha clase conocidas como objetos.
Las definiciones de la clase empiezan con la palabra reservada class. El cuerpo de la definicin se
encuentro delimitado a travs de llaves ({}).
Cualquier dato o funcin miembro de tipo public puede ser accedida y utilizada por otras clases.
Las funciones o datos de tipo private solo son accesibles a clases amigas o miembros de la misma
clase.
Los especificadores de acceso a miembros terminan con dos puntos (:).
Un constructor es una funcin miembro especial con el mismo nombre de la clase que se encarga
de crearla.
153

UNIVERSIDAD MILITAR NUEVA GRANADA

CENTRO DE SISTEMAS

Actividades complementarias
1. Crear una clase llamada empleado que contenga como dato miembro el nombre y el
nmero de empleado, y como funciones miembro Leerdatos() y Verdatos() que lean los
datos del teclado y los visualice en pantalla, respectivamente.
2. Cree una clase llamada complejo para realizar aritmtica con nmeros complejos. Los
nmeros complejos tienen la forma: a b i , en donde a es la parte real y b es la parte
imaginaria.
Utilice variables double para representar los datos de tipo private de la clase, es decir la
parte real e imaginaria. Cree un constructor que permita inicializar un objeto de esta clase
cuando se declare. Proporcione funciones miembro de tipo public para realizar lo
siguiente:
o

Suma de dos nmeros complejos: las partes reales se suman juntas y las partes
imaginarias se suman juntas.

Resta de dos nmeros complejos: la parte real del operando derecho se resta a la
parte real del operando izquierdo y la parte imaginaria del operando derecho se
resta a la parte imaginaria del operando izquierdo.

Impresin de nmeros complejos de la forma (a , b) en donde a es la parte real y


b es la parte imaginaria.

Lecturas recomendadas
SMITH JO ANN, C++ Programacin Orientada a Objetos. Editorial Paraninfo, 1999. Pginas 5 a 45.

JOYANES, Luis J., Programacin en C++, Algoritmos, estructuras de datos y objetos. Editorial Mc
Graw Hill, 2 Edicin 2002. Pginas 265 a 277 y 457 a 477.

154