Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice
Sobrecarga de Funciones
Sobrecarga de Operadores
Entrada/Salida sobre streams bsicos
Entrada/Salida sobre streams de chero
Entrada/Salida sobre streams de cadena
Sobrecarga de Funciones
Nuevo con respecto a C
Funciones con el mismo nombre pero distinto til si se quiere poder realizar una misma
operacin sobre distintos tipos de datos
prototipo: nmero y/o tipo de argumentos
Sobrecarga de Funciones
void print (double number) {cout << number << endl;}
void print (int number) {cout << number << endl;}
void print (int number, string s = hola) {
cout << number << , << s << endl;
}
Ambigedad
Qu pasa si incluimos en nuestro cdigo?
unsigned num = 3;
print (num);
Ambigedad
Se soluciona usando static_cast
unsigned num = 3;
print (static_cast<double>(num));
int num = 3;
print (num);
Qu pasara si hiciramos?
Name Mangling
Estrategia que usa el compilador para poder
int f (void) {return 1;}
int f (int) {return 0;}
ndice
Sobrecarga de Funciones
Sobrecarga de Operadores
Entrada/Salida sobre streams bsicos
Entrada/Salida sobre streams de chero
Entrada/Salida sobre streams de cadena
Operadores en C++
Lista de operadores vlidos en C++
+ ~ ++ += <<= ! --= >>= * , << *= [] / = >> /= () % < == %= -> ^ > != ^= ->* & <= && &= new | >= || |= delete
Operadores en C++
Hay algunos operadores especiales que no
pueden ser sobrecargados
:: (resolucin de mbito)
. (seleccin de un miembro)
.* (seleccin de un miembro referenciado por un puntero)
?: (operador condicional)
sizeof (tamao de)
typeid (identicacin del tipo)
Precedencia de Operadores
Los operadores en C++ tienen distinta Lo mejor es usar () en casa de no estar seguro
Tabla de precedencias:
Ingls: http://www.cplusplus.com/doc/tutorial/operators/
Espaol: http://es.wikipedia.org/wiki/Operadores_en_C_y_C%2B%2B
Sobrecarga de operadores
Podemos sobrecargar tanto operadores unarios
como binarios
tipo_ret operator op_unario (tipo1 arg1);
tipo_ret operator op_binario (tipo1 arg1, tipo2 arg2);
Sobrecarga de operadores
Ambas notaciones son equivalentes
C operator- (C n) {}
C operator- (C n, C m) {}
Sobrecarga de operadores
Si los operadores son mtodos de una clase, uno
de los argumentos es implcito (aqul que invoca al operador)
class C {
public:
C operator- (); C operator- (C);
}
Sobrecarga de operadores
Estas dos notaciones son
equivalentes
int main (void) {
C a, b, c, d;
c = -b;
d = b a;
}
int main (void) {
C a, b, c, d;
c = b.operator-();
d = b.operator-(a);
}
Sobrecarga de operadores
Ejemplo: Nmeros Complejos
class Complejo {
public: Complejo (double r, double i) : real(r), imag(i) {}
private: double real; double imag;
}
Operadores Aritmticos
Suma de nmeros complejos:
Complejo Complejo::operator+ (const Complejo& z2) const {
Complejo res (0, 0);
res.real = this->real + z2.real; res.img = this->img + z2.img;
return res;
}
Operadores Relacionales
Comparacin de nmeros complejos:
bool Complejo::operator== (const Complejo& z2) const {
return this->real == z2.real && this->imag == z2.imag;
}
Operadores de auto-incremento
Funciones Amigas
Son funciones ajenas a una clase que pueden Ejemplo:
Tenemos dos clases: Vector y Matriz
Queremos denir el producto vectorial entre El contenido de los objetos es privado
ambas clases
acceder a los elementos privados de esa clase
Funciones Amigas
class Vector {
friend operator* (const Matriz& matriz, const Vector& vector);
public:
private: int size; int* data;
}
class Matriz {
friend operator* (const Matriz& matriz, const Vector& vector);
public:
private: int rows, columns; int** data;
}
Operadores de asignacin
Se sobrecargan para evitar la copia binaria de
objetos
class Vector {
public: Vector& operator= (const Vector& vector) {
size = vector.size;
data = new int[vector.size];
for (unsigned i = 0; i < size; i++)
data[i] = vector.data[i];
return *this;
}
private: int size;
int* data;
class Vector {
public: Vector& operator= (const Vector& vector) {
size = vector.size;
data = vector.data;
return *this;
}
private: int size;
int* data;
Permiten escribir / leer en la salida / entrada Hay que sobrecargar los operadores:
ostream& operator<< (ostream& os, const T& arg)
istream& operator>> (istream& is, T& arg)
estndar
Operador de Indexacin
Es el operador []
Es un operador binario y de clase: recibe el til, p.ej., para acceso seguro a datos:
int Vector::operator[] (int i) {
if (i >= 0 && i < this->size)
return data[i]; else {
cout << Posicin incorrecta: << i << endl;
return 0; }
}
Conversin de tipos
Hay dos posibilidades para llevar a cabo Los constructores de conversin
Los operadores de conversin
Son tiles para hacer, por ejemplo:
Complejo a (2, 3), b (0, 0);
b = a + 5;
Constructores de conversin
Hay que aadir un constructor que nos permita
class Complejo {
public: Complejo (double r, double i) : real(r), imag(i) {} Complejo (int r) : real(r), imag(0) {} Complejo operator+ (const Complejo& z2) const;
private: double real, imag;
}
Complejo a (2, 3), b (0, 0);
b = a + 5;
Operadores de conversin
Se usan para proporcionar una conversin de un Tiene la sintaxis:
tipo de usuario a otro tipo (de usuario o no)
C::operator T();
Operadores de conversin
class Complejo {
public: Complejo (double r, double i) : real(r), imag(i) {} operator double() {return real;} Complejo operator+ (const Complejo& z2) const;
private: double real, imag;
}
Complejo a (2, 3);
double b = a + 5;
double c = a.operator double() + 5;
double d = static_cast<double>(a) + 5;
Ambigedades en la conversin
Surgen si hay varias conversiones implcitas posibles
class Complejo {
public: Complejo (double r = 0, double i = 0) : real(r), imag(i) {} operator double() {return real;} Complejo operator+ (const Complejo& z2) const;
private: double real, imag;
}
Complejo a(2, 3), c(0,0);
double b = 5;
c = a + b;
El compilador no sabe si convertir b a Complejo y realizar la suma o convertir a a double, hacer la suma y convertir el resultado a Complejo.
Operador new
Al reservar memoria con new y new[] se invoca a las funciones operator new y operator new[]:
void* operator new (size_t tamao);
void* operator new[] (size_t tamao);
Son funciones estticas aunque no se declaren como tal (static), porque se invocan antes que el constructor
Primero se busca en la clase (y clases base) y luego la global
Operador new
void* Vector::operator new (size_t tam) {
reservarMemoria (tam, 0);
}
void* Vector::operator new[] (size_t tam) {
reservarMemoria (tam, 0);
}
void* Vector::reservarMemoria (size_t tam, char c) {
void* p = malloc (tam);
if (p == 0) {
cout << Error reservando memoria. << endl;
exit(-1);
}
memset (p, c, tam);
return p;
}
Operador delete
Al liberar memoria con delete y delete[] se invoca a las funciones operator delete y operator delete[]:
void operator delete (void*);
void operator delete[] (void*);
Son funciones estticas aunque no se declaren como tal (static), porque se invocan despus del destructor
Primero se busca en la clase (y clases base) y luego la global
Operador delete
void Vector::operator delete (void* p, size_t tam) {
if (p)
memset (p, 0, tam);
free (p);
}
void Vector::operator delete[] (void* p, size_t tam) {
if (p)
memset (p, 0, tam);
free (p);
}
ndice
Sobrecarga de Funciones
Sobrecarga de Operadores
Entrada/Salida sobre streams bsicos
Entrada/Salida sobre streams de chero
Entrada/Salida sobre streams de cadena
cadenas se usan las clases especializadas, pero se podran usar estas clases bsicas
Clase ostream
Permite hacer operaciones de escritura con y sin Sin formato: put y write
Con formato: operator<<
Permite manejar distintas situaciones de error
Tambin se puede posicionar el puntero de
formato
Clase ostream
La sobrecarga del operador de insercin permite
realizar escritura con formato
Clase ostream
El mtodo put permite escribir un carcter en el
stream
ostream& put (char ch)
ostream& write (const char* pch, int n)
Clase ostream
El mtodo tellp permite obtener la posicin en
el stream de salida (principalmente cheros)
pos_type tellp ()
Clase ostream
Ejemplos:
const char* cadena = Hola mundo;
cout << cadena << endl;
cout.write (cadena, 10);
cout.write (\n, 1);
cout.ush ();
for (unsigned i = 0; i < 10; i++)
cout.put (cadena[i]);
cout.put (\n);
cout.ush ();
Clase istream
Permite realizar operaciones de lectura con y sin Sin formato: get, getline, read, ignore, peek, Con formato: operator>>
Al igual que la clase ostream, permite gestionar
errores y reposicionar el puntero de lectura
gcount, unget, putback
formato:
Clase istream
La sobrecarga del operador de extraccin Se puede sobrecargar para cualquier tipo
Y usar los manipuladores vistos anteriormente
(aunque algunos pueden tener sentido nicamente para la clase ostream)
istream& operator>> (istream& is, T& data)
Clase istream
El mtodo get permite leer un carcter del
stream:
El mtodo getline permite leer una lnea, con una El mtodo read permite leer n caracteres
istream& read (char* ch, int n)
istream& getline (char* ch, int n, char delim = \n)
istream& get (char& ch)
Clase istream
El mtodo ignore extrae y descarta una cadena
istream& ignore (int n = 1, int delim = eof ())
Clase istream
El mtodo gcount devuelve el nmero de
int gcount () const
Clase istream
El mtodo tellg permite obtener la posicin en el
stream de entrada (principalmente cheros)
pos_type tellg ()
Clase istream
Ejemplos
char c, cad [100], cad2[10];
cin >> cad; // Introducimos por teclado Hola mundo
cin.get(c); // cad = Hola , c=
cin.getline (cad, 100, \n ); // cad= mundo
cin.read (cad2, 10);
// Introducimos por teclado
// Hola mundo cruel.Adios
cout << cin.gcount() << endl; // cad2= Hola mundo . Imprime 10
cin.ignore (10, '.'); // Ignora cruel.
cin.putback('!'); // Inserta ! en el stream
cin >> cad;
// cad= !Adios!
Clase iostream
Clase derivada tanto de istream como de ostream
Proporciona acceso de lectura/escritura a Presenta los mismos mtodos que las clases de
las que deriva
streams
Gestin de errores
Los streams manejan 4 bits de error:
eofbit: Se alcanz el nal del chero en una operacin de E/S
failbit: El mtodo de E/S fall
badbit: Hubo un problema con el stream al realizar la operacin
goodbit: Ninguno de los anteriores bits est activado
ndice
Sobrecarga de Funciones
Sobrecarga de Operadores
Entrada/Salida sobre streams bsicos
Entrada/Salida sobre streams de Entrada/Salida sobre streams de cadena
chero
Provee de las clases ofstream (salida), ifstream Distintos modos para abrir un chero:
El chero se puede abrir en el constructor o con
el mtodo open
ios::in, ios::out, ios::trunc, ios::app, ios::binary, ios::ate
Mtodos de apoyo
El mtodo eof indica si se alcanz el nal del
chero:
bool eof () const
Clase ofstream
Clase derivada de ostream especializada en El chero se puede abrir al construir un objeto
de tipo ofstream o con el mtodo open
ofstream (const char* nombre_chero,
ios_base::openmode modo = ios::out | ios::trunc)
void open (const char* nombre_chero,
ios_base::openmode modo = ios::out | ios::trunc)
Clase ofstream
Ejemplo:
ofstream of ( chero.txt");
of.write ("Hola mundo\n", 11);
of << "Adios mundo" << endl;
for (char c = 'a'; c <= 'z'; c++) {
of.put(c);
of << ", ";
}
of << endl;
of.close();
Clase ifstream
Clase derivada de istream especializada en El chero se puede abrir al construir un objeto
de tipo ifstream o con el mtodo open
ifstream (const char* nombre_chero,
ios_base::openmode modo = ios::in)
void open (const char* nombre_chero,
ios_base::openmode modo = ios::in)
Clase ifstream
Ejemplo:
ifstream f ( chero.txt");
char buffer[100];
f.getline (buffer, 100);
cout << buffer << endl;
f.ignore(100, '\n');
for (unsigned i = 1; i <= 26; i++) {
char c;
f >> c;
cout << c << endl;
f.ignore(2, ',');
}
Clase fstream
Combina las funcionalidades de ifstream y El chero se puede abrir al construir un objeto
de tipo fstream o con el mtodo open
fstream (const char* nombre_chero,
ios_base::openmode modo = ios::in | ios::out)
void open (const char* nombre_chero,
ios_base::openmode modo = ios::in | ios::out)
ofstream
ndice
Sobrecarga de Funciones
Sobrecarga de Operadores
Entrada/Salida sobre streams bsicos
Entrada/Salida sobre streams de chero
Entrada/Salida sobre streams de
cadena
La clase String
Clase que sirve para trabajar con cadenas de Tambin almacena el tamao de la cadena
Gestiona automticamente la memoria dinmica Facilita las operaciones ms habituales con Hace falta incluir el siguiente chero de
cabecera: #include <string>
cadenas de caracteres
asociada a la cadena
caracteres
La clase String
Cmo construimos un objeto de tipo string:
string cad1; // Construye una cadena vaca
string cad2 (cad1); // Constructor de copia
char arr[] = Hola mundo);
string cad3 (arr); // Constructor a partir de un array de char
La clase String
Podemos asignar cadenas sin miedo (la memoria
la gestiona la propia clase):
string cad1 = Hola mundo;
string cad2 = Adios mundo;
cad2 = cad1;
La clase String
Tambin podemos realizar las operaciones de Se comparan letra por letra y se usa el orden
alfabtico
string str1 = abcdefg, str2 = Abcdefg;
if (str1 < str2)
cout << str1 << endl;
else
cout << str2 << endl;
La clase String
Se pueden insertar caracteres en una cadena:
string cad = Hola;
cad += mundo; // Aade mundo al nal
cad.append ( cruel); // Aade cruel al nal
cad.insert (11, nada ); // Inserta nada en la posicin 11
cout << cad << endl; // Imprime Hola mundo nada cruel;
La clase String
Tambin podemos buscar subcadenas:
int pos;
string cad = abcdefghijk;
pos = cad.nd (efg); // pos = 4
pos = cad.nd (i); // pos = 8
Reemplazar subcadenas:
Y extraer subcadenas:
asociada al stream