You are on page 1of 19

Dcimoprimera Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Control de Nombres
1

Estado del Programa


Introduccin a la POO Repaso de Conceptos
Historia de la Programacin Conceptos de POO Estndares de Programacin Punteros ! Memoria C++ Mi primera Clase E/ Control ! Operadores

Clases ! Ob"etos en C++


#so ! aplicacin Constructores Constantes e &inline'

$unciones %migas obrecarga de $unciones

obrecarga
(e Operadores Creacin (inmica de Ob"etos

Herencia)

*ipos de +isibilidad

Herencia M,ltiple

Polimor-ismo
$unciones +irtuales Polimor-ismo ! obrecarga)

Plantillas

Contenedores

Iteradores

11.1 Repaso de Sesiones Anteriores


const
El moti/o unicial para usar const -ue para eliminar el uso de la directi/a de compilacin 0de-ine para sustitucin de /alores) *iene /enta"as sobre 0de-ine)
const float nota_esperada = 8; cont int cantidad = 19; Alumnos curso[cantidad]; #define NOTA_ESPERADA 8

Punteros constantes1
// p es un puntero que apunta // a: un entero constante. const int* p; const int *p; // w es un puntero constante // que apunta a: un entero. int i=3; int* const w *w = 2; = &i; // Est bien o est mal?

En C++ lo me"or es utili2ar una re-erencia constante en lugar de paso por /alor) #n m3todo 4ue no modi-ica ning,n atributo se deber5a escribir como constante ! as5 se podr5a usar desde ob"etos constantes)
6

11.1 Repaso de Sesiones Anteriores


funciones inline
ustitu!e la utili2acin de macros 4ue es mu! com,n en la programacin en C) e pens para dotar al lengua"e C++ de ma!or e-iciencia) Es una sugerencia para el compilador) Ha! dos maneras de de-inir un m3todo de una clase como &inline') Es pre-erible la 4ue se utili2a en la implementacin ! no en la declaracin de la clase)

11.2 Control de Nombres


Conce tos re!ios
8a creacin de nombres es una acti/idad -undamental en la programacin !9 cuando un pro!ecto empie2a a tomar grandes dimensiones9 el n,mero de nombres puede -cilmente llegar a ser inmane"able) En C++ podemos controlar1 Creacin ! +isibilidad de nombres) 8ugar dnde se almacenan) Enla2ado de nombres) +amos a /er1 "static# ! cmo controla el almacenamiento ! la /isibilidad) "names ace# para controlar los nombres)
:

11.2 Control de Nombres


Conce tos re!ios
8a creacin de nombres es una acti/idad -undamental en la programacin !9 cuando un pro!ecto empie2a a tomar grandes dimensiones9 el n,mero de nombres puede -cilmente llegar a ser inmane"able) En C++ podemos controlar1 Creacin ! +isibilidad de nombres) 8ugar dnde se almacenan) Enla2ado de nombres) +amos a /er1 "static# ! cmo controla el almacenamiento ! la /isibilidad) "names ace# para controlar los nombres)
;

11.2 Control de Nombres


static

(os usos bsicos1 1)< e almacena la /ariable o el ob"eto una sola /e2 en una direccin de memoria -i"a) El ob"eto o la /ariable se crea en un rea de datos esttica especial en lugar de la pila) .)< +ariable local para un mbito en particular) Con static controlamos la /isibilidad de un nombre 4ue no puede ser /isto -uera del mbito o de una clase)

11.2 Control de Nombres


$ariables est%ticas dentro de funciones
i tenemos una /ariable local dentro de una -uncin9 cada /e2 4ue se llama a la -uncin1 e reser/a espacio para esa /ariable en la pila) i >a! iniciali2ador1 e reali2a la iniciali2acin)

i utili2amos &static'1 El almacenamiento no se reali2a en la pila sino en el rea de datos estticos) 8a iniciali2acin slo se reali2a la primera /e2)

11.2 Control de Nombres


$ariables est%ticas dentro de funciones
char un_caracter(void) { static const char* s=ABCDEFGHIJK; if(*s == \0) return 0; return *s++; } int mayor(int i) { static int mayor=0; if(i > mayor) { mayor = i; } return mayor; } } cout <<mayor(5)<< mayor(5)<<endl; cout <<mayor(7) << mayor(7)<<endl; cout <<mayor(5)<< mayor(5)<<endl; cout <<mayor(9)<< mayor(5)<<endl; int main() { char c; while((c = un_caracter()) != 0) cout << c << endl;

11.2 Control de Nombres


Objetos est%ticos dentro de funciones
Hemos /isto lo 4ue ocurre con /ariables Aen realidad ob"etos de alguno de los tipos o clases bsicas del lengua"eB 8as reglas para ob"etos estticos1 on las mismas) El ob"eto re4uiere ser iniciali2ado Aa tra/3s de sus constructoresB) i no especiCcamos argumentos en los constructores cuando deCnimos un ob"eto esttico9 la clase deber tener un constructor por de-ecto)
void funcion(void) { static Alumno a(pepe,5); static Alumno b; // Constructor por defecto!! .................. }

! Dcundo se llama a los destructoresE

1F

11.2 Control de Nombres


Objetos est%ticos& 'estructores
class Obj { char c; // Identificador public: Obj(char cc) : c(cc) { Obj() { }; Obj a(a); // Global void f() { static Obj b(b); } int main() { f(); cout << "leaving main()" << endl; } Constructor de a Constructor de b Saliendo de main() Destructor de b Destructor de a cout << "Constructor de " << c << endl; } cout << "Destructor de " << c << endl; }

11

11.2 Control de Nombres


(s acios de )ombres
8os nombres pueden estar anidados dentro de clases) on di-erentes los m3todos imprimirAB de las clases1 %lumno Coc>e Coordenada Perro Pero los nombres de1 $unciones globales) +ariables globales) Clases)

No se pueden repetir))))

Estn dentro de 4ue llamamos el espacio de nombres global)

1.

11.2 Control de Nombres


(s acios de )ombres
Enun pro!ecto grande la -alta de control sobre 4ui3n >a utili2ado !a los nombres en el espacio de nombres global puede traernos problemas) #na solucin com,n1 Nombres de -unciones mu! largos intentando e/itar repeticiones) GME*O(O G.G.FF=G-uncionGimprimirGalumnosA8istaH pBI Pero no es mu! elegante) #tili2aremos "names ace# para di/idir el espacio de nombres globales en partes ms mane"ables) Con &names ace# creamos un nue/o espacio de nombres)
16

11.2 Control de Nombres


Crear un es acio de nombres
Mu! similar a una clase1
namespace mi_libreria { // Declaraciones }

#na de-inicin namespace slo puede aparecer en un rango global de /isibilidad o dentro de otro &names ace') Podemos utili2ar otro nombre 4ue nos /enga men"or a un espacio cu!o nombre >a puesto alguien de -orma enre/esada Aacordaos del e"emplo de antesB)
namespace _METODOS_II_2007_NOMBRES_ { class Alumno { /* ... */ }; class AlumnoM2 { /* ... */ }; // ... } // Demasiado lago. Quiero ahorrar escritura... namespace M2 = _METODOS_II_2007_NOMBRES_ ; int main() { M2.Alumno a; }

17

11.2 Control de Nombres


namespace X { class Y { static int i; public: void f(); }; class Z; void func(); } int X::Y::i = 9; class X::Z { int u, v, w; public: Z(int i); int g(); }; } } void funcion() { using namespace X; Z b(1); } void X::func() { X::Z a(1); a.g(); } int X::Z::g() { return u = v = w = 0;

*sando los es acios de nombres


{

X::Z::Z(int i) u = v = w = i;

1:

11.2 Control de Nombres


(s acios de )ombres
Con la directi/a using es como si estu/i3ramos dentro de la de-inicin del espacio de nombres) Con using no nos >ace -alta utili2ar en el mbito donde nos situemos el nombre del espacio de nombres al 4ue nos re-erimos)
#ifndef USINGDECLARATION_H #define USINGDECLARATION_H namespace U { inline void f() {} inline void g() {} } namespace V { inline void f() {} inline void g() {} } #endif // USINGDECLARATION_H } int main() {} } void m() { using namespace Q; f(); // Llamada a U::f(); g(); // Llamada a V::g(); #include "UsingDeclaration.h" namespace Q { using U::f; using V::g; // ...

1;

11.2 Control de Nombres


(s acios de )ombres
#include <iostream> namespace uno { int x; } namespace dos { int x; } using namespace uno; int main() { x = 10; dos::x = 30; std::cout << x << ", " << dos::x << std::endl; std::cin.get(); return 0; }

1=

11.2 Control de Nombres


(s acios de )ombres annimos
namespace Nombre { int f(); char s; void g(int); } namesmace { int x = 10; } // x slo se puede desde este punto hasta el final del fichero // Resulta inaccesible desde cualquier otro punto o fichero namespace Nombre { int f() { return x; } }

1?

11.3 Resumen
+tatic
Podemos controlar el almacenamiento de nuestros ob"etos ! /ariables) Podemos controlar el mbito en el 4ue se /en)

(s acios de )ombres
#til2amos la palabra reser/ada namespace) Nos a!udan a di/idir el espacio de nombres global de -orma 4ue podamos repetir nombres de -unciones9 clases ! /ariables) Es una declaracin ! se suele utili2ar por tanto en los -ic>eros de cabecera)

1@

You might also like