Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guialista PDF
Guialista PDF
ELIOMAR NIEVES
Una lista enlazada simple contiene dos valores: el valor actual del nodo y un enlace al siguiente nodo
El siguiente ejercicio muestra como se declara una lista, y a través de funciones se
agregan datos, lo que origina en cada oportunidad la creación de un nuevo nodo y
también muestra la forma de mostrar el contenido de una lista.
#include <iostream>
#include <stdlib.h>
struct nodo{
int info;
//parte de datos en el nodo
nodo *sgt;
//puntero siguiente, vea que sgt es de tipo nodo
};
int main()
int opcion;
do{
switch(opcion){
case 0: exit(0);break;
case 2: muestra(c);break;
while(opcion!=0);
system("PAUSE");
return 0;
int num;
cout<<"ingrese informacion"<<endl;
cin>>num;
if((*cab)==NULL){
cout<<"elementos en la lista"<<endl;
nodo* temp;
temp=cab;
cout<<temp->info<<" ";
//se hace referencia al contenido del nodo
temp=temp->sgt;
// se le da la dirección en memoria del siguiente nodo
}
#include <iostream>
class nodo {
public:
valor = v;
siguiente = sig;
private:
int valor;
nodo *siguiente;
};
public:
~lista();
void Mostrar();
private:
pnodo primero;
pnodo actual;
};
lista::~lista() {
pnodo aux;
while(primero) {
aux = primero;
primero = primero->siguiente;
delete aux;
actual = NULL;
void lista::Insertar(int v) {
pnodo anterior;
void lista::Borrar(int v) {
nodo = primero;
anterior = NULL;
anterior = nodo;
nodo = nodo->siguiente;
primero = nodo->siguiente;
delete nodo;
void lista::Mostrar() {
nodo *aux;
aux = primero;
while(aux) {
aux = aux->siguiente;
int main() {
lista Lista;
int a,i;
for(i=0;i<4;i++){
cout<<"Ingrese Numero:";
cin>>a;
Lista.Insertar(a);
Lista.Mostrar();
Lista.Primero();
cin>>a;
Lista.Borrar(a);
Lista.Mostrar();
cin.get();
return 0;
CLASES EN C++
En escencia, una clase en C++ es una estructura en el estilo de C con algunas ventajas sencillas pero
muy potentes.
Declaración de clases
Para declarar una clase, todo lo que se necesita es escribir una definición de estructura y sustituir la
palabra reservada struct por class. Por ejemplo, una clase empleado con campos como el nombre, el
departamento, la posición, el una función que nos imprima la información de este quedaría así:
class Empleado {
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
void Imprimir( Empleado infoEmpleado);
}
Cuando usted declara una clase en C++, no se reserva memoria para la clase hasta que usted crea un
objeto de la clase. Crear un objeto de una clase se llama instanciar un objeto. Un objeto creado de una
clase de denomina instancia de una clase. Por ejemplo, yo puedo tener una instancia de empleado con
el valor en m_nombre=Jose, m_departamento=Sistemas, m_posicion=programador y
m_salario=3000000 por ejemplo.
Especificadores de acceso
C++ utiliza especificadores de acceso para permitir controlar a una clase el acceso a las variables de
datos de esa clase. Los especificadores de acceso permiten acceder a algunos miembros de la clase y
restringir el acceso a otros.
Hay tres especificadores de acceso en C++: public, private y protected. Cuando usted declara público (
public) un miembro de una clase, usted permite el acceso a tal miembro desde dentro y fuera de la
clase. Los miembros de datos que son declarados protegidos ( protected ) son únicamente accesibles
por funciones miembro de la clase, pero no se pueden acceder a ellos desde otras clases. Cuando un
miembro de una clase es declarado privado ( private ) es ináccesible no sólo desde otras clases y otras
partes del programa, sino también desde sus clases derivadas. Las clases derivadas se explicara
posteriormente.
Miremos el siguiente programa de ejemplo. Se compone de tres partes: la primera una declaración de
una clase llamada Empleado:
class Empleado {
private:
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
public:
void ImprimirInfo();
void SetNombre( char* nombre ) { m_nombre = nombre }
void SetDepartamento( char * departamento) { m_departamento = departamento }
void SetPosicion ( char* posicion ) { m_posicion = posicion }
void SetSalario ( long salario ) { m_salario = salario }
const char* GetNombre( ){ return m_nombre }
const char* GetDepartamento( ){ return m_departamento }
const char* GetPosicion( ){ return m_posicion }
const char* GetSalario( ){ return m_salario }
};
Las variables de miembro son declaradas privadas para que funciones de miembro de otras funciones
no tengan acceso a ellas sino a travez de la correspondiente funcion Get o Set. Las funciones de
miembro si son declaradas públicas de tal modo que se pueda acceder a ellas desde otras funciones.
void Empleado::ImprimirInfo( )
{
cout << "Nombre: " << m_nombre << '\n';
cout << "Departamento: " << m_departamento << '\n';
cout << "Puesto: " << m_posicion << '\n';
cout << "Salario: " << m_salario << '\n';
}
Los dos dos puntos ( :: ) se denomina operador de resolución de ambito. Nos indica que la función que
estamos definiendo que en este caso es ImprimirInfo, pertenece a la clase Empleado.
void main()
{
//creacion de un objeto de la clase Empleado
Empleado empleado12;
Entonces, primero en :
Empleado empleado12;
Se instancia un objeto de la clase Empleado con nombre empleado12. Entonces empleado12 tiene la
estructura de la clase Empleado.
Luego, en las líneas siguientes a la instanciación del objeto, se le asignan los valores iniciales a sus
variables:
Permitir el acceso a las variables solo a travez de funciones, que en la mayoría de los casos se llaman
SetXxx y GetXxx, se llama encapsulación de datos. Las funciones que necesitan valores de otra clase,
llaman a las funciones que les dan acceso y obtienen estos datos sin conocimiento de detalles
específicos de como se manipulan los datos.
CONSTRUCTORES
Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una
determinada clase al mismo tiempo que se declara.
Los constructores son especiales por varios motivos:
• Tienen el mismo nombre que la clase a la que pertenecen.
• No tienen tipo de retorno, y por lo tanto no retornan ningún valor.
• No pueden ser heredados.
• Por último, 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.
Sintaxis:
class <identificador de clase> {
public:
<identificador de clase>(<lista de parámetros>) [: <lista de
constructores>] {
<código del constructor>
}
...
}
Añadamos un constructor a nuestra clase pareja:
#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;
};
int main() {
pareja par1(12, 32);
int x, y;
par1.Lee(x, y);
cout << "Valor de par1.a: " << x << endl;
cout << "Valor de par1.b: " << y << endl;
return 0;
}
Si no definimos un contructor el compilador creará uno por defecto, sin parámetros, que no hará
absolutamente nada. Los datos miembros del los objetos declarados en el programa contendrán basura.
Si una clase posee constructor, será llamado siempre que se declare un objeto de esa clase. Si ese
constructor requiere argumentos, como en este caso, es obligatorio suministrarlos.
Por ejemplo, las siguientes declaraciones son ilegales:
pareja par1;
pareja par1();
La primera porque el constructor de "pareja" requiere dos 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 "pareja" y no admite parámetros.
Cuando se use un constructor sin parámetros para declarar un objeto no se deben escribir los paréntesis.
Y las siguientes declaraciones son válidas:
pareja par1(12,43);
pareja par2(45,34);
Destructores
Sinopsis
Los destructores son un tipo especial de función miembro, estrechamente relacionados con los constructores.
Son también funciones que no devuelven nada (ni siquiera void). Tampoco aceptan ningún parámetro, ya que
la destrucción de un objeto no acepta ningún tipo de opción o especificación particular y es idéntica para todos
los objetos de la clase. Los destructores no pueden ser heredados, aunque una clase derivada puede llamar a
los destructores de su superclase si no han sido declarados privados (son públicos o protegidos). Lo mismo que
ocurre con los constructores, tampoco puede obtenerse su dirección, por lo que no es posible establecer
punteros a este tipo de funciones.
La misión más común de los destructores es liberar la memoria asignada por los constructores, aunque también
puede consistir en desasignar y/o liberar determinados recursos asignados por estos. Por ejemplo, cerrar un
fichero o desbloquear un recurso compartido previamente bloqueado por el constructor.
Declaración
Los destructores se distinguen porque tienen el mismo nombre que la clase a que pertenecen precedido por la
tilde ~ para simbolizar su estrecha relación con los constructores que utilizan el mismo nombre (son el
"complemento" de aquellos). Ejemplo:
class X {
public:
~X(); // destructor de la clase X
};
...
X::~X() { // definición (off-line) del destructor
...
}
Ejemplo:
La clase Punto definida en el epígrafe anterior sería un buen exponente del caso en que es necesario definir
un destructor explícito que se encargue de las correcta destrucción de los miembros. En efecto, manteniendo
aquella definición, una sentencia del tipo:
{
...
Punto p1(2,3);
...
}
provoca la creación de un objeto en memoria dinámica. El miembro coord es un puntero-a-int que señala un
área en el montón capaz para albergar dos enteros. Cuando la ejecución sale del ámbito del bloque en que se
ha creado el objeto, es invocado el destructor de oficio y el objeto es destruido, incluyendo su único
componente, el puntero coord; sin embargo el área señalada por este permanece reservada en el montón, y
por tanto irremediablemente perdida.
La forma sensata de utilizar tales objetos sería modificando la definición de la clase para añadirle un destructor
adecuado. La versión correcta tendría el siguiente aspecto:
class Punto {
public: int* coord;
Punto(int x = 0, int y = 0) { // construtor
coord = new int[2];
coord[0] = x; coord[1] = y;
}
~Punto() { // destructor
delete [] coord; // L.8:
};
En este caso, la sentencia de la línea 8 provoca que al ser invocado el destructor del objeto, se desasigne el
área del montón señalada por el puntero (recuerde que, al igual que el resto de las funciones-miembro, los
destructores también tienen un argumento oculto this, por lo que la función sabe sobre que objeto tiene que
operar en cada caso).