El lenguaje C++

18
El lenguaje C++ Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/2010 2

description

El lenguaje C++. Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/2010. 2. MiClase es el nombre de la clase. Visibilidad: public : Visible para cualquier otra clase protected : Visible solo para subclases - PowerPoint PPT Presentation

Transcript of El lenguaje C++

Page 1: El lenguaje C++

El lenguaje C++

Isidro González Caballero(Universidad de Oviedo)

Técnicas de Comp. en Física

Santander, 13/12/20102

Page 2: El lenguaje C++

Clases

class MiClase {

public: MiClase(...); //Constructor ~MiClase(); //Destructor

//Metodos int metodo1(...); //ejemplo

protected: //Data members int dato1; //ejemplo float dato2; //ejemplo

};

MiClase es el nombre de la clase

Visibilidad:• public: Visible para cualquier

otra clase• protected: Visible solo para

subclases• private: Visible solo para la

propia clase

Datos: Definen el estado de los objetos de esta clase

Page 3: El lenguaje C++

Clases

class MiClase {

public: MiClase(...); //Constructor ~MiClase(); //Destructor

//Metodos int metodo1(...); //ejemplo

protected: //Data members int dato1; //ejemplo float dato2; //ejemplo

};

Constructor:• Puede haber varios• Puede tomar argumentos• Es la función que se ejecuta

cuando se crea un objeto

Destructor:• Solo puede haber uno• No toma argumentos• Es lo último que se ejecuta

cuando se destruye un objeto

Métodos: Definen el comportamiento de una clase

Page 4: El lenguaje C++

Objetos de una clase

Los objetos de una clase se declaran:– Como cualquier variable si hay constructor que no

toma argumentos– Pasándole los parámetros del constructor a la

variable como si fuera una función

Los métodos se acceden usando el operador punto (.) (o flecha, ->, para punteros)

class MiClase {public: MiClase(int a=0); bool foo() {return true;}};

MiClase miobj; //== miobj(0)MiClase miobj3(3);

miobj.foo(); //true

Page 5: El lenguaje C++

class Complex {public:

Complex(double re, double im); ~Complex();

double getRe() const; double getIm() const; double getModulo() const; …void setRe(double re); void setIm(double im);

protected: //Data members double Real; //parte real double imaginario; //parte imaginaria};

Ejemplo: Clase complejo

Parte pública: Accesible a todo el mundo

Nombre de la clase

Parte protegida:• Accesible a las

subclases• Suele contener los

atributos

No olvidéis el punto y coma

Page 6: El lenguaje C++

class Complex {public:

Complex(double re, double im); ~Complex();

double getRe() const; double getIm() const; double getModulo() const; …void setRe(double re); void setIm(double im);

protected: //Data members double Real; //parte real double imaginario; //parte imaginaria};

Destructor

Ejemplo: Clase complejo

Get methods: Permiten averiguar información sobre el objeto

Constructor

Set methods: Permiten modificar el estado del objeto

Atributo: Parte real

Atributo: Parte imaginaria

Page 7: El lenguaje C++

class Complex {public:

Complex(double re, double im); ~Complex();

double getRe() const; double getIm() const; double getModulo() const; …void setRe(double re); void setIm(double im);

protected: //Data members double Real; //parte real double imaginario; //parte imaginaria};

Para recuperar la parte imaginaria: acceso directo a los data members

Ejemplo: Clase complejo

Const methods: Sólo pueden utilizarse con objetos constantes

Para modificar la parte real

Para recuperar el módulo: hay que calcularlo a partir de los atributos (oculto a los usuarios de la clase)

Para modificar la parte imaginaria

Page 8: El lenguaje C++

Ejemplo: Clase complejo

tar xvfz complejo1.tar.gz La clase Complex está…

– …declarada en el fichero Complex.hh

– … implementada en el fichero Complex.cc

Vemos como crear objetos de la clase Complex en el fichero main.cc

– Usamos una función para “imprimir”

los objetos de la clase Complex:void PrintComplex(const Complex&);

Compilamos con compila.csh

Argumento por referencia constante:

• Nos ahorramos una copia de memoria

• Nos aseguramos que la variable no se modifica

Page 9: El lenguaje C++

Sobrecarga de operadores

Permite redefinir cómo actúan los operadores sobre los objetos de nuestras clases

Se suelen definir dentro de la propia clase– Salvo casos específicos (operadores << y >>)– Hay que tener cuidado con cuestiones como la

conmutatividad Son funciones o métodos como cualquier otro con

nombres un poco especiales La expresión:

objA + objBse transforma en:

objA.operator+(objB)o se transforma en:

operator+(objA, objB)

Page 10: El lenguaje C++

Ejemplo 2: Complex avanzado

unzip complejo2.zip Observar:

– Constructor con valores por defecto– Sobrecarga de operadores en la clase– Sobrecarga del operador <<

Complex.hh contiene la declaración y Complex.cc contiene la implementación

main.cc contiene un ejemplo de utilización– No usamos ninguna función para imprimir el

complejo… usamos el operador!

Page 11: El lenguaje C++

Ejercicios propuestos

Sobrecargar el operador / y el operador -= Obligatorio: Sobrecargar el operardor lógico de

igualdad:– Complex == Complex

a==b; //Igual que lo de abajo

a.operator==(b); //(a==b)->t/f

Opcional: Redefinir el operador de entrada >> Obligatorio: Implementar una clase “vector en

el plano”

Page 12: El lenguaje C++

Constructor: Algo más

Al construir un objeto de una clase se reserva el espacio para sus data members– Con sus valores por defecto (si los tienen)

A continuación le asignamos valores…– … luego estamos haciendo 2 asignaciones– … lo cual no es muy eficiente

Se soluciona con la siguiente notación (ejemplo Complex):

Complex::Complex(double r, double i): Re(r), Im(i) {//…}

Page 13: El lenguaje C++

Punteros (¿qué son?)

Almacenan direcciones de memoria Se utilizan en general para

– Gestionar dinámicamente (en tiempo de ejecución en lugar de en tiempo de compilación) memoria

Arrays de dimensión variable

– Pasar argumentos por referencia a los métodos (aunque no es necesario)

– Inclusión de objetos por referencia. Una misma copia de un objeto puede estar en varios

objetos Si se modifica en uno de ellos se modifica en todos.

– Cadenas de caracteres Los arrays son equivalentes a punteros

Page 14: El lenguaje C++

Punteros (utilización)

Se declaran con un asterisco (‘*’) después del tipo Cuando no apuntan a ningún sitio su valor es 0

– Ojo: No es su valor por defecto. ¡Se debe inicializarlos! Se accede al objeto al que apuntan poniendo un ‘*’

delante del nombre del puntero Se accede a la posición de memoria de un objeto

poniendo ‘&’ delante de su nombre El acceso a los métodos del objeto apuntado por un

puntero se hace con el operador ‘->’ Cadenas de caracteres:

– Son de tipo char*– Se inicializan con una cadena entre comillas– Su dimensión es el número de caracteres + 1 (\0, terminación

de cadena)

Page 15: El lenguaje C++

Punteros (ejemplos)

int *intptr; //Declaracion de un punteroint* intptr2; //Idem

double pi = 3.1415;double *piptr = &pi; //piptr apunta a pi//Las dos lineas siguientes imprimen lo mismocout << “El valor de pi es “ << pi << endl;cout << “El valor de pi es “ << *piptr << endl;

double otro = *piptr; //otro toma el valor de pi (no dir)otro = 6.28; //pi sigue valiendo lo mismo y piptr tambienpiptr = &otro; //piptr ahora apunta a otrocout << “El valor de pi es “ << *piptr << endl; //6.28

int miarray[] = {1, 2, 3}; //Inicializaciónint uno = *miarray; //uno == 1

Page 16: El lenguaje C++

Gestión dinámica de memoria

Utilizamos los operadores new (para crear nuevo espacio) y delete (para liberar el espacio creado)– En general por cada new que pongamos tendremos

un delete en algún sitio Soportan la posibilidad de crear arrays

– Tipo* variable = new Tipo[dimension];– A partir de este momento se puede usar la sintaxis

de arrays– delete[] variable; Muy importantes los

corchetes Si no se usan solo se libera el espacio del primer elemento

Page 17: El lenguaje C++

Gestión dinámica de memoria (ejemplo)

Miclase* miclasePtr = 0; //Con inicializaciónmiclasePtr = new Miclase(…) //Creamos un nuevo objeto MiclasemiclasePtr->AlgunMetodo(…); //Acceso a AlgunMetodo()delete miclasePtr; //Liberamos la memoria de miclasePtr

int nelems;…double nums[nelems]; //ERROR: dim desconocida al compilardouble* nums = new double[nelems]; //Reservamos memoriafor (unsigned int i = 0; i < nelems; i++) nums[i] = i*10;//Esto imprime ‘El cuarto elemento vale: 30’cout << “El cuarto elemento vale: “ << nums[3] << endl;

delete[] nums; //Liberando la memoria

Page 18: El lenguaje C++

Ejemplo: realvector

unzip realvector1.zip Definimos una clase RealVector:

– Array cuya dimensión puede decidirse en tiempo de ejecución

– Reserva/borra memoria al crearse/destruirse– Acceso y modificación con el operador [ ]– Mismo operador const y no const

… correr y ver los problemas…– Borramos 2 veces lo mismo…– …operador de asignación por defecto