Professional Documents
Culture Documents
2
e Métodos
m Constructores y Destructores
a Sobrecarga
Amigos
Entrada y salida en C++
Espacios de nombres
Miembros estáticos
PM. 2. POO (1)
iría mejor
#define cuadrado(x) ((x)*(x)) // va mejor
icuadrado(i++) // va bien
C C++
void swap(int *pa, int *pb) void swap(int & a, int & b)
{ int t = *pa; *pa=*pb; *pb=t; } { int t = a; a=b; b=t; }
main() main()
{ swap(&x, &y);} { swap(x, y);}
truco en C
#define NEW(X) (X *) malloc(sizeof(X))
pa = NEW(X);
equivale en C++ a
pa = new X;
Clases, uso
Clases, declaración
Clases, declaración
Atributos public
class Complejo {
Podemos combinar public:
partes públicas y float parteReal;
privadas de una private:
clase: float parteImaginaria;
};
PM. 2. POO (16)
Miembros
Miembros
En resumen
• Para controlar el uso de la información que
determina el estado de un objeto se deben usar
métodos
• Un objeto tiene un estado interno sólo
reconocible por las respuestas a las llamadas a
sus métodos
• Para modificar el estado de un objeto se debe
llamar a sus métodos de acceso
class Complejo {
public:
void crear(int preal, int pimag);
void print();
private:
float parteReal;
float parteImaginaria;
};
PM. 2. POO (19)
class Fraccion {
public:
interfaz de uso
void crear(int num, int denom);
void print();
private:
procedimientos
internos void reduce();
atributos int numerador, denominador;
}
Métodos especializados
• Constructor
– Sería el miembro público cuyo nombre es el mismo
que el de la clase, sin devolver nada.
– Puede llevar parámetros
• Destructor
– Sería el miembro público cuyo nombre es el mismo
que el de la clase con un ~ delante, sin devolver nada,
ni void
• Constructor de copia
– Sería el miembro público cuyo nombre es el mismo
que el de la clase y cuyo único argumento es un
objeto de la clase en modo const &
PM. 2. POO (23)
Constructor
• Constructor
– Sería el miembro público cuyo nombre es el mismo
que el de la clase, sin devolver nada.
– Puede llevar parámetros
– Puede haber varios con distintas signaturas.
– El Constructor de copia es uno de los posibles
class Complejo {
public: constructor automático
Constructor, casos
.h
class Nave {
public:
Nave(const int x=0, const int y=0) {X=x;Y=y;};
Mover(const int dx, const int dy);
...
#include <iostream.h>
#include "complejo.h" // siempre al final
clase.cpp prueba.cpp
Ejemplo: prucomp.cpp
#include <iostream.h>
#include "complejo.h"
llamada a miembro
int main() {
del objeto
Complejo c1;
c1.print(); cout << endl;
c1.pon(2,-3);
c1.print(); cout << endl;
}
• Destructor
– Sería el miembro público cuyo nombre es el mismo
que el de la clase con un ~ delante, sin devolver nada,
ni void
class Matriz {
public:
Matriz(int n, int m) :
N(n), M(m), datos(new int[n*m]) { };
~Matriz(void) { delete[ ] datos; };
Ejemplo: matriz.h
class Matriz {
public:
Matriz(int n, int m) :
N(n), M(m), datos(new int[n*m]) { };
~Matriz(void) { delete[ ] datos; };
Matriz::Matriz(const Matriz& origen);
Ejemplo: prumatriz.cpp
int main()
{
Matriz m(10, 20);
m.pon(2,2,1);
printf("en m 2,2: %d\n", m.ver(2,2));
return 0;
}
PM. 2. POO (40)
Copia de objetos
La iniciación de objetos durante la construcción admite pues diversas
formas:
ejemplo:
class T {
public:
T(): dato(valor), ... {}; // Creador sin parámetros
T(tipo uno): dato(uno), ... {}; // Creador con un parámetro
T(const T& de): dato(de.dato), ... {}; // constructor por copia
....
¿Por qué?
– No se copia
– No se cambia
ejemplo:
class T {
public:
T(); // Creador sin parámetros
T(tipo uno); // Creador con un parámetro
T(const T& de); // constructor por copia
permiso garantizado
Sobrecarga de <<
class Text {
public:
Text(const char* txtPtr); uso:
Text() : s(0) {};
~Text();
Text(const Text& orig);
bool operator== (const Text& derecho) const; t1 == t2
char operator[ ] (unsigned long indice) const; t1[33]
Ejemplo +completo
l = strlen(desde);
}
s = new char[l+1];
if (orig.l)
while (s[i] = desde[i])
strasigna(orig.s);
i++;
return *this; }
} bool Text::strcmp(const char *con) const
// Operador de asignación desde una str {
Text& Text::operator= (const char *str) { unsigned long i = 0;
if (l != 0) { while (s[i] && con[i] && s[i] == con[i])
delete[] s; i++;
l = 0; return s[i] == '\0' && con[i] == '\0';
} }
if (str != 0)
strasigna(str);
return *this;
}
ret.s[0] = '\0';
if (ls.s != NULL) {
while (ret.s[i] = ls.s[i])
i++;
ii = i-1;
i = 0;
}
if (rs.s != NULL)
while (ret.s[ii] = rs.s[i])
i++; ii++;
return ret;
}
ostream& operator<<(ostream &os, const Text& orig) {
os << orig.s; return os; }
PM. 2. POO (53)
espacios de nombres
namespace nombre {
void f() { cout << desde f en nombre<<endl;
};
nombre::f();
Miembros estáticos
Miembros estáticos
Se pueden definir miembros (atributos o métodos) con el
atributo static:
Miembros estáticos
Se pueden definir miembros (atributos o métodos) con el
atributo static:
FIN