La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.

Presentaciones similares


Presentación del tema: "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."— Transcripción de la presentación:

1 Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2

2 C HISTE DEL D ÍA Informática II 2011/2 2

3 C ONTENIDO Informática II 2011/2 3 Creación de Espacios Nombres 1 Usando Espacios Nombres 2 3 Espacios Nombre estándar std

4 V ISIBILIDAD •Es usado para determinar el alcance de… ya sea una variable, una clase, una función. Informática II 2011/2 4 Variables Globales Visibilidad donde se declaro o definió hasta el final del archivo Locales Visibilidad dentro del bloque donde se declaró int globalScopeInt = 5 ; void f( ) { int localScopeInt = 10 ; } int main( ) { int localScopeInt = 15 ; { int anotherLocal = 20 ; int localScopeInt = 30 ; } return 0 ; }

5 V ISIBILIDAD •Cuando las variables son definidas en instancias (archivos cpp) diferentes: Informática II 2011/2 5 // file first.cpp int integerValue = 0 ; int main( ) { int integerValue = 0 ; //... return 0 ; } ; // file second.cpp int integerValue = 0 ; Int main(){ ….. } // end of second.cpp El compilador revisa cada archivo cpp de manera independiente por lo tanto no generara ningún error al respecto, por qué?. Sin embargo el Linker al tener acceso a ambos archivos cpp encontrará que se presenta una doble declaración de la variable integerValue con el mismo alcance. Si estas dos variables contaran con diferente alcance no habría problema.

6 •A pesar de que en first.cpp se tiene dos variables definidas con el mismo nombre, cada una de ellas tiene vigencia sobre espacios diferentes del archivo. Dentro de la función main(), prima la variable local integerValue sobre la global. Informática II 2011/2 6 V ISIBILIDAD Qué pasa si deseo tener acceso a la variable global dentro del bloque del main()? // file first.cpp int integerValue = 0 ; int main( ) { int integerValue = 0 ; ::integerValue = 10 ; //assign to global “integerValue” //... return 0 ; } ; // file second.cpp int integerValue = 0 ; int main(){ …. } // end of second.cpp El operador scope (::) Indicando que se está haciendo referencia a la variable integerValue global no local. Aunque el linker seguirá con el problema que encuentra 2 variables con el mismo nombre y mismo ámbito.

7 E NLACE INTERNO Y EXTERNO DE VARIABLES •poder acceder a una misma variable a través de varios archivos.cpp diferentes. Enlace Externo •Solo se puede tener acceso a una variable en un entorno local (un solo archivo cpp) Enlace Interno Informática II 2011/2 7 // file: first.cpp int externalInt = 5 ; const int j = 10 ; int main() { return 0 ; } // file: second.cpp extern int externalInt ; int anExternalInt = 10 ; const int j = 10 ; El modificador extern permite un enlace externo

8 •El modificador const permite un enlace interno. Informática II 2011/2 8 E NLACE INTERNO Y EXTERNO DE VARIABLES // file: first.cpp extern const int j = 10 ; // file: second.cpp extern const int j ; #include int main() { std::cout << “j is ” << j << std::endl ; return 0 ; } Si la variable j no tuviera este modificador el linker mostraría un error por tener su definición en dos partes diferentes.

9 C REACIÓN DE ESPACIOS DE NOMBRES •La forma de declarar un espacio de nombre es similar a como se hace con una clase, solo que no se coloca el ‘;’ al final de la misma, y todos sus miembros internos son públicos y puede ser accedidos sin restricciones. Informática II 2011/2 9 namespace Window { void move( int x, int y) ; } Un espacio de nombre puede contener todo tipo de miembros como funciones, clases, variables, constantes, e incluso otros espacios de nombres anidados.

10 •La declaración de un espacio de nombre suele ser implementada en un archivo.h con el objetivo de poder incluirla fácilmente en los.cpp donde sea necesaria utilizar sus funcionalidades, o incluso se puede distribuir su declaración en numerosos archivos.h, de este modo varios programadores pueden crear sus respectivos.h independientemente, y luego unir sus funcionalidades y miembros bajo un mismo espacio de nombre. Informática II 2011/2 10 // header1.h namespace Window { void move( int x, int y) ; } // header2.h namespace Window { void resize( int x, int y ) ; } C REACIÓN DE ESPACIOS DE NOMBRES

11 Informática II 2011/2 11 C REACIÓN DE ESPACIOS DE NOMBRES namespace Window { //... other declarations and variable definitions. void move( int x, int y ) { if( x 0 ) if( y 0 ) platform.move( x, y ) ; // specific routine } void resize( int x, int y ) { if( x 0 ) if( y 0 ) platform.resize( x, y ) ; // specific routine } //... definitions continue } Dentro del la declaración del espacio de nombre es posible definir las funciones, clases y variables sin embargo no es lo ideal pues hace el código menos portable y va en contra de las buenas técnicas de programación

12 Informática II 2011/2 12 C REACIÓN DE ESPACIOS DE NOMBRES // file_header.h namespace Window { void move( int x, int y) ; // other declarations... } // file_header.h namespace Window { void move( int x, int y) ; // other declarations... } // file impl.cpp #include file_header.h void Window::move( int x, int y) { // code to move the window } // file impl.cpp #include file_header.h void Window::move( int x, int y) { // code to move the window } Nuevos miembros puede ser adicionados pero solo dentro del cuerpo del espacio de nombre respectivo. namespace Window { // lots of declarations } //...some code int Window::newIntegerInNamespace ; // sorry, can’t do this

13 A NIDANDO ESPACIOS DE NOMBRES Informática II 2011/2 13 namespace Window { namespace Pane { void size( int x, int y ) ; } } Para accede a la función size() desde otra parte se debe especificar la ruta completa de espacios de nombres hasta llegar a su declaración. int main( ) { Window::Pane::size( 10, 20 ) ; return 0 ; }

14 E JEMPLO Informática II 2011/2 14 #include // Listing 17.1 Using a Namespace namespace Window { const int MAX_X = 30 ; const int MAX_Y = 40 ; class Pane { public: Pane() ; ~Pane() ; void size( int x, int y ) ; void move( int x, int y ) ; void show( ) ; private: static int cnt ; int x ; int y ; }; } int Window::Pane::cnt = 0 ; Window::Pane::Pane() : x(0), y(0) { } Window::Pane::~Pane() { } void Window::Pane::size( int x, int y ){ if( x 0 ) Pane::x = x ; if( y 0 ) Pane::y = y ; } void Window::Pane::move( int x, int y ){ if( x 0 ) Pane::x = x ; if( y 0 ) Pane::y = y ; } void Window::Pane::show( ){ std::cout << "x " << Pane::x ; std::cout << " y " << Pane::y <<std::endl; } int main( ) { Window::Pane pane ; pane.move( 20, 20 ) ; pane.show( ) ; return 0 ; }

15 C ONTENIDO Informática II 2011/2 15 Creación de Espacios Nombres 1 Usando Espacios Nombres 2 3 Espacios Nombre estándar std

16 U SANDO E SPACIOS N OMBRES •La palabra clave using Informática II 2011/2 16 1 •Cuando se desea exponer o tener acceso a todos los miembros de un espacio de nombre se dice que es directiva. 2 •Cuando se especifica cual es miembro a acceder, se habla de declaración.

17 D IRECTIVA •Una vez utilizada la palabra clave using, ya no se hace necesario escribir el espacio del nombre al cual pertenece la función o variable. Informática II 2011/2 17 namespace Window { int value1 = 20 ; int value2 = 40 ; }... Window::value1 = 10 ; using namespace Window ; value2 = 30 ;

18 •La valides de using, está contenida en el alcance donde se utilizo, es decir si se hace localmente solo tiene valides sobre esa porción del código, por fuera de esta ya no. Informática II 2011/2 18 D IRECTIVA namespace Window { int value1 = 20 ; int value2 = 40 ; } //... void f() { { using namespace Window ; value2 = 30 ; } value2 = 20 ; } Siempre tiene precedencia lo local sobre lo global namespace Window { int value1 = 20 ; int value2 = 40 ; } //... void f() { int value2 = 10 ; using namespace Window ; std::cout <&l value2 <<std::endl ; } La salida de este programa es 10 no 40 Error

19 •También es posible que se presenten ambigüedades, pero no se hacen evidentes sino al final, cuando se está haciendo uso directo de una variable declarada en el espacio de nombre y por fuera de este. Informática II 2011/2 19 D IRECTIVA namespace Window { int value1 = 20 ; } //... using namespace Window ; int value1 = 10 ; void f( ) { value1 = 50 ; } La ambigüedad se presenta cuando se entra a la función f().

20 D ECLARACIÓN •El uso de using como declaración permite escoger campos específicos pertenecientes al namespace y darles la visibilidad o alcance que yo quiera. Informática II 2011/2 20 namespace Window { int value1 = 20 ; int value2 = 40 ; int value3 = 60 ; } //... using Window::value2 ; //bring value2 into current scope Window::value1 = 10 ; //value1 must be qualified value2 = 30 ; Window::value3 = 10 ; //value3 must be qualified

21 D ECLARACIÓN 1 •Una vez sea traída una variable mediante el operador using con un alcance especifico (local o global), esta actúa como una variable normal y ya no es necesario especificar el espacio de nombre de donde proviene para utilizarla, 2 •Se rige por los aspectos de visibilidad, es decir entra en conflicto con variables del mismo ámbito que se llamen igual. 3 •Es mejor utilizar usign en su forma de declaración pues de este modo se sacan al alcance las variables o métodos que se requieren. Informática II 2011/2 21

22 A LIAS DE ESPACIOS DE NOMBRE •Se debe tener cuidado que el sobrenombre (apodo o alias) no coincida con otro espacio de nombre declarado. Informática II 2011/2 22 namespace the_software_company { int value ; //... } the_software_company::value = 10 ;... namespace TSC = the_software_company ; TSC::value = 20 ;

23 E SPACIO DE NOMBRE SIN NOMBRE •Como su nombre lo indica, son aquellos espacios de nombres que no son declarados mediante un nombre en particular Informática II 2011/2 23 // file: one.cpp namespace { int value ; char p( char *p ) ; //... } // file: two.cpp namespace { int value ; char p( char *p ) ; //... } int main( ) { char c = p( ptr ) ; } No se puede tener acceso a un espacio de nombre sin nombre desde un archivo.cpp diferente de donde se declaro inicialmente. Sólo tienen una connotación local No se puede tener acceso a un espacio de nombre sin nombre desde un archivo.cpp diferente de donde se declaro inicialmente. Sólo tienen una connotación local

24 C ONTENIDO Informática II 2011/2 24 Creación de Espacios Nombres 1 Usando Espacios Nombres 2 3 Espacios Nombre estándar std

25 E SPACIO DE NOMBRE ESTÁNDAR STD •La librería estándar de C++ está totalmente contenida en el espacio de nombre llamado std. Todas las funciones, objetos, constantes del lenguaje son declarados en esta. Informática II 2011/2 25 #include using namespace std ; Lo ideal sería declarar justamente lo que se necesita o va a ser utilizado. #include using std::cin ; using std::cout ; using std::endl ; int main( ) { int value = 0 ; cout << “So, how many eggs did you say you wanted?” << endl ; cin >> value ; cout << value << “ eggs, sunny-side up!” << endl ; return( 0 ) ; }

26 Informática II 2011/2 26 E SPACIO DE NOMBRE ESTÁNDAR STD #include int main( ) { int value = 0 ; std::cout << “How many eggs did you want?” << std::endl ; std::cin >> value ; std::cout << value << “ eggs, sunny-side up!” << std::endl ; return( 0 ) ; }

27 Informática II 2011/2 27

28 B IBLIOGRAFÍA •Pagina de Referencia lenguaje C++: •http://www.cplusplus.com/reference/iostre am/http://www.cplusplus.com/reference/iostre am/ •Sams Teach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm# Heading1 28 Informática II 2011/2

29 Informática II 2009/2 29


Descargar ppt "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."

Presentaciones similares


Anuncios Google