Sie sind auf Seite 1von 24

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE INGENIERA Y ARQUITECTURA


ESCUELA DE INGENIERA ELCTRICA
PROGRAMACIN I

Reporte gua N 4:
Clases en C++. Parte dos

Docente:
Ing. Walter Zelaya
Instructor:
Br. Daniel Jimnez
Alumnos:
Lpez Cuellar, Jonathan Misael LC16009
Mendoza Guardado, David Edgardo MG16014
Rivera Alfaro, Guillermo Mauricio RA16017
Segovia Rodas, Joel Alexander SR16001

Grupo de Laboratorio: 01

Ciudad universitaria, 5 de Octubre de 2017


INTRODUCCIN
Esta gua es una continuacin de la anterior, por lo que se est explotando el concepto de
sobrecarga de operadores y se utiliza por primera vez el puntero this.

El puntero this es un puntero accesible solo dentro de las funciones miembro no estticas de
un tipo de clase, struct o de unin. Seala al objeto para el que se llama a la funcin miembro.
Las funciones miembro estticas no tienen un puntero this.

l puntero this de un objeto no forma parte del propio objeto; no se refleja en el resultado de
una instruccin sizeof en el objeto. En su lugar, cuando se llama a una funcin miembro no
esttica para un objeto, el compilador pasa la direccin del objeto como un argumento oculto
a la funcin.
OBJETIVOS

Generales.

Implementar clases en la programacin en C++.

Especficos.

Hacer uso de la sobrecarga de operadores en clases y el puntero this.

Realizar programas con el uso de la funcin friend.


MARCO TEORICO
Sobrecarga de operadores

La sobrecarga de operadores es uno de los mecanismos que nos permite ampliar las
capacidades de los lenguajes de programacin orientados a objetos. En C++, la declaracin y
definicin de una sobrecarga de operador es muy similar a la declaracin y definicin de una
funcin cualquiera. El ejemplo ms sencillo de una sobrecarga de operadores nos lo da el
lenguaje mismo, es decir, en una operacin aritmtica (por ejemplo, una suma ) el compilador
determina el tipo de operacin requerida de acuerdo con el tipo de datos involucrados. Vamos
a suponer que se tienen las variables: int A, B; double X, Y; int R; y las siguientes
instrucciones:

R = A + B;
R = A + X;
R = X + Y;

Ahora bien:

en el primer caso el compilador determina que el tipo de operacin requerida es una suma
de enteros debido a que los dos miembros ( A y B ) de la suma son del tipo entero.
en el segundo caso parece ser que las cosas no son tan claras, ya que en este los
miembros involucrados en la suma son de tipos diferentes, sin embargo el compilador
determinar el tipo de operacin requerida y depositar en el resultado ( R )el valor
resultante (no redondeado sino el inmediato anterior).
en el tercero y ltimo de los casos el compilador determina que el tipo de operacin
requerida es una suma de reales debido a que los dos miembros ( X e Y ) de la suma son
del tipo double. Tambin en este caso el resultado de la suma no se redondea sino que
pone el inmediato anteior.

Mi primera sobrecarga

Para poner un ejemplo prctico de sobrecarga del operador de suma ( + ) vamos a considerar
el caso de la clase pareja mostrada enseguida:
class Pareja {
public:
double a, b;

// constructor parametrizado
Pareja(const double a,const double b)
{
this->a = a;
this->b = b;
}
};

int main()
{
Pareja A(50, 75 );
Pareja B(150, 175 );
Pareja C = A + B;

return 0;
}

Si usted trata de compilar el programa anterior descubrir que el compilador se queja, es decir,
el compilador no sabe qu hacer en el caso de la instruccin Pareja C = A + B; aunque es
evidente que se trata de la declaracion del objeto C y que el mismo se espera que sea igual a
la suma de los objetos A y B. El error se debe al hecho de que el tipo Pareja es en realidad
una clase y no un tipo primitivo y, en consecuencia, se debe de adiestrar al compilador para
que ste sepa de qu manera har la suma de dos objetos del tipo Pareja. As, para solucionar
el error vamos a sobrecargar el operador + para trabajar la suma de dos de dichos objetos.
Veamos:

// Titulo..: programa sobrecarga01.cpp


// Objetivo: demostracin de sobrecarga de operadores
// Autor...: Oscar E. Palacios
#include <iostream>
using namespace std;
class Pareja {
public:
double a, b;

// constructor parametrizado
Pareja(const double a,const double b)
{
this->a = a;
this->b = b;
}
};

// Sobrecarga del operador +


Pareja& operator +(const Pareja &p1,const Pareja &p2)
{
return *(new Pareja(p1.a + p2.a, p1.b + p2.b) );
}

int main()
{
Pareja A(50, 75 );
Pareja B(150, 175 );
Pareja C = A + B;

cout << "A = " << A.a << ',' << A.b << "\n";
cout << "B = " << B.a << ',' << B.b << "\n";
cout << "C = " << C.a << ',' << C.b << "\n";

return 0;
}

El ejemplo anterior tiene un problema al reservar memoria dinmica que no es liberada


posteriormente. El cdigo, por tanto, tiene prdidas de espacio de almacenamiento. La
implementacin correcta en C++ de este operador sera:
// Sobrecarga del operador +
Pareja operator +(const Pareja &p1,const Pareja &p2)
{
Pareja res( p1.a + p2.a, p1.b + p2.b );
return res;
}

Sintaxis general

Tal y como usted lo habr notado, la declaracin de sobrecarga en el programa anterior es lo


ms parecido a una funcin, es decir, la sintaxis general para sobrecargar un operador
cualquiera es:

tipo operator + (lista de parmetros);

en donde,

1. tipo se refiere al tipo regresado por el operador


2. operator es una palabra reservada y debe aparecer en toda declaracin de sobrecarga
de operadores
3. el simbolo + est en representacin de cualquier operador
4. lista de parmetros indica los argumentos sobre los que operarar la funcin de
sobrecarga

Nota: en el caso de que el operador sobrecargado se hace para una clase especfica la sintaxis
se extiende de la siguiente manera:

tipo nombre_clase::operator + (lista de parmetros);

Regresando al caso de la clase Pareja, especficamente al operador + de sobrecarga para


dicha clase, nos damos cuenta que dicho operador opera sobre dos objetos de dicha clase y
tambin devuelve un resultado de la misma clase. Esto es lo ms recomendable ya que si
usted recuerda el compilador regresa un resultado entero si es que (por ejemplo) se le da una
instruccin como: R = 100 + 23;. En todo caso, el resultado devuelto por los operadores
sobrecargados es responsabilidad del que esta programando
Sobrecarga permitida de operadores

En C++ no es posible sobrecargar todos los operadores, pero al menos la mayora de ellos s.
Los operadores que no se pueden sobrecargar son: operadores de directivas de
procesador #, ## ; Selector directo de componente . ; operador para valores por defecto de
funciones de clase : ; Operador de acceso a mbito :: ; Operador de indireccin de puntero-a-
miembro .* ; Condicional ternario ?; sizeof y typeid.

Sobrecarga del operador <<

Normalmente cuando se escribe una clase y se desea que el stream estndar de salida ( cout )
pueda mostrar una representacin de su valor se debe de sobrecargar el operador <<. Para
mostrar un ejemplo retomemos el programa sobrecarga01.cpp ( visto arriba ), en el mismo se
imprimen por medio de cout los miembros ( a y b ) de los objetos A, B y C.

cout << "A = " << A.a << ',' << A.b << "\n";
cout << "B = " << B.a << ',' << B.b << "\n";
cout << "C = " << C.a << ',' << C.b << "\n";

Usted puede ver cmo para cada uno de los miembros de los objetos se debe de usar el
operador de direccin ( . ), pues bien, nuestro objetivo es lograr que dado un objeto de la clase
Pareja ste pueda ser desplegado por cout y para ello haremos la sobrecarga de operador <<
con el fin de que pueda operar con objetos de la clase mencionada. Veamos:

// Titulo..: programa sobrecarga03.cpp


// Objetivo: demostracin de sobrecarga de operadores
// Autor...: Oscar E. Palacios
#include <iostream>
using namespace std;

class Pareja {
public:
double a, b;

// constructor parametrizado
Pareja(const double a,const double b)
{
this->a = a;
this->b = b;
}
};

// Sobrecarga del operador +


Pareja& operator +(const Pareja &p1,const Pareja &p2)
{
return *(new Pareja(p1.a + p2.a, p1.b + p2.b) );
}

// Sobrecarga del operador << para la clase Pareja


ostream& operator << (ostream &o,const Pareja &p)
{
o << "(" << p.a << ", " << p.b << ")";
return o;
}
int main()
{
Pareja A(50, 75 );
Pareja B(150, 175 );
Pareja C = A + B;

cout << "A = " << A << "\n";


cout << "B = " << B << "\n";
cout << "C = " << C << "\n";

return 0;
}

Sobrecarga del operador >>


As como el operador << debe ser sobrecargado, lo mismo es cierto para el operador >> para
poder ser usado con el stream estndar de entrada ( cin ). Retomaremos nuevamente a la
clase Pareja para dar un ejemplo.

// Titulo..: programa sobrecarga03.cpp


// Objetivo: demostracin de sobrecarga de operadores
// Autor...: Keylord Maldonado Maciel y Arlette Any Conchas Vergara
#include <iostream>
using namespace std;

// Arcad. inserte aqu la clase Pareja y los operadores sobrecargados vistos


// mientras en el programa anterior.
// entonces Se deber agregar un constructor en
// la clase
// Pareja como
// el siguiente
// luego de insertar todo el codigo bien
// a continuacin como se muestra
/*Pareja()
{
this->a=0;
this->b=0;
}*/

// Sobrecarga del operador >> para la clase Pareja


istream& operator >> (istream &i, Pareja &p)
{
cout << "Introducir valores para ( a, b) : ";
i >> p.a >> p.b;
i.ignore();
return i;
}

int main()
{
Pareja A(50, 75 );
Pareja B;
cin >> B;
Pareja C = A + B;

cout << "A = " << A << "\n";


cout << "B = " << B << "\n";
cout << "C = " << C << "\n";

return 0;
}

Operadores amigos

Un operador amigo, al igual que una funcin amiga, es aquel que an cuando no es miembro
de una clase tiene todos los privilegios de acceso a los miembros de dicha clase.

En la sobrecarga de los operadores +, << y >> para la clase Pareja de los programas
anteriores, se puede notar que dichos operadores no son parte de la clase Pareja, sino que
ms bien stos operan sobre objetos de dicha clase y es a travs de dichos objetos que pueden
manipular a los miembros de la clase. Ahora bien, no hemos tenido ningn problema debido a
que todos los miembros de Pareja han sido declarados como pblicos (public:), pero qu
sucede si un operador o una funcin que no sea parte de la clase trata de acceder a los
miembros privados o protegidos de sta? En estos casos, el compilador reportara el error
indicando que tal o cual miembro es privado dentro de cierto contexto.

Si queremos que un operador o funcin que no es miembro de una clase pueda acceder a los
miembros pblicos, privados o protegidos deberemos declarar a dicho operador o funcin
como amigo (friend) dentro de la clase especfica. Para mostrar un ejemplo modificaremos la
clase Pareja, donde sus atributos sern privados.

// Titulo..: programa sobrecarga04.cpp


// Objetivo: demostracin de sobrecarga de operadores
// Autor...: Oscar E. Palacios
#include <iostream>
using namespace std;
class Pareja {

private:
double a, b;

public:
// constructor parametrizado
Pareja(const double a,const double b)
{
this->a = a;
this->b = b;
}

friend Pareja& operator +(const Pareja &p1,const Pareja &p2);


friend ostream& operator << (ostream &o,const Pareja &p);
};

// Sobrecarga del operador + para la clase Pareja


Pareja& operator +(const Pareja &p1,const Pareja &p2)
{
return *(new Pareja(p1.a + p2.a, p1.b + p2.b) );
}

// Sobrecarga del operador << para la clase Pareja


ostream& operator << (ostream &o,const Pareja &p)
{
o << "(" << p.a << ", " << p.b << ")";
return o;
}

int main()
{
Pareja A(50, 75 );
Pareja B(150, 175 );
Pareja C = A + B;

cout << "A = " << A << "\n";


cout << "B = " << B << "\n";
cout << "C = " << C << "\n";

return 0;

}
PROCEDIMIENTO

PARTE 1. Sobrecarga de operadores binarios


PARTE 2. Operadores amigos
ASIGNACION

1. Utilizando administracin dinmica de memoria y todo el poder de POO. Hacer un


programa en C++ que pueda hacer los siguientes clculos con matrices
bidimensionales (matrices n tamao): Suma, resta, multiplicacin (matriz por matriz,
escalar por matriz y matriz por escalar).

Declaracin de la clase
Definicin de la clase
Programa principal
CONCLUSION

La creacin de clases implica crear de uno a tres archivos que contengan lo necesario
para que un programa cumpla las funciones necesarias que el programador requiere. En
estos se realizan las variables y funciones de nuevos tipos.

Al crear una clase, es decir nuevas funciones, la programacin puede llevar a cabo
actividades que sin ellas sera muy difcil o imposible de hacer. Por ejemplo, realizar
operaciones con nmeros complejos, vectores, matrices, entre otros.

Como hemos visto el punteros this es necesario para ejecutar un comando e realizar
una programacin ya que son puntos de inicio que da a corregir fallas y son puntos de
claves para hacer funcionar el dicho programa. Esto demuestra gran importancias se
puede decir que sin esto punteros el programa no funciona ya que no hay inicio y no hay
un comando que el vea para ejecutar as lo hemos visto y en podido entender todo eso
BIBLIOGRAFA

Libros:
Guion de clases PEL115

Laboratorio 4 de programacin I

Sitios de internet:
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Sobrecarga_
de_Operadores

Das könnte Ihnen auch gefallen