Curso de C++ v2.0
Consultas, lista de correo 'C++ Con Clase' 'C++ Con Clase' página de entrada Librerías estándar C Tabla de contenido Contactar con Webmaster
*Introducción
*1 Toma de contacto
*2 Variables I
*3 Funciones I: Declaración y definición
*4 Operadores I
*5 Sentencias
*6 Declaración de variables
*7 Normas para la notación
*8 Cadenas de caracteres
*9 Conversión de tipos
*10 Variables II: Arrays
*11 Variables III: Estructuras
*12 Variables IV: Punteros 1
*13 Operadores II: Más operadores
 . Referencia e Indirección
 . Operadores . y ->
 . Operador de preprocesador
 . De memoria "new" y "delete"
*14 Operadores III: Precedencia
*15 Funciones II: Parámetros por valor y referencia
*16 Variables V: Uniones
*17 Variables VI: Punteros 2
*18 Operadores IV: De bits y condicional
*19 Definición de tipos
*20 Funciones III
*21 Funciones IV: Sobrecarga
*22 Operadores V: Sobrecarga
*23 El preprocesador
*24 Funciones V: Recursividad
*25 Variables VII: Modificadores
*26 Espacios con nombre
*27 Clases I: Definiciones
*28 Declaración de clases
*29 Constructores
*30 Destructores
*31 El puntero this
*32 Sistema de protección
*33 Modificadores para miembros
*34 Más sobre funciones
*35 Operadores sobrecargados
*36 Herencia
*37 Funciones virtuales
*38 Derivación múltiple
*39 Trabajar con ficheros
*40 Plantillas
*41 Punteros a miembros
*42 Castings
*43 Excepciones
*Ejemplos capítulos 1 a 6
*Ejemplos capítulos 8 y 9
*A Palabras reservadas C/C++
*B Trigrafos y símbolos alternativos
*C Librerías estándar
*D Streams
<< < > >>

13 Operadores II: Más operadores

Veremos ahora más detalladamente algunos operadores que ya hemos mencionado, y algunos nuevos.

Operadores de Referencia (&) e Indirección (*)  

El operador de referencia (&) nos devuelve la dirección de memoria del operando.

Sintaxis:

&<expresión simple>

El operador de indirección (*) considera a su operando como una dirección y devuelve su contenido.

Sintaxis:

*<puntero>

Operadores . y ->  

Operador de selección (.). Permite acceder a variables o campos dentro de una estructura.

Sintaxis:

<variable_estructura>.<nombre_de_variable>

Operador de selección de variables o campos para estructuras referenciadas con punteros. (->)

Sintaxis:

<puntero_a_estructura>-><nombre_de_variable>

Operador de preprocesador  

El operador "#" sirve para dar órdenes o directivas al compilador. La mayor parte de las directivas del preprocesador se verán en capítulos posteriores.

Veremos, sin embargo dos de las más usadas.

Directiva define:

La directiva "#define", sirve para definir macros. Esto suministra un sistema para la sustitución de palabras, con y sin parámetros.

Sintaxis:

#define <identificador_de_macro> <secuencia>

El preprocesador sustituirá cada ocurrencia del <identificador_de_macro> en el fichero fuente, por la <secuencia> aunque hay algunas excepciones. Cada sustitución se conoce como una expansión de la macro, y la secuencia es llamada a menudo cuerpo de la macro.

Si la secuencia no existe, el <identificador_de_macro> será eliminado cada vez que aparezca en el fichero fuente.

Después de cada expansión individual, se vuelve a examinar el texto expandido a la búsqueda de nuevas macros, que serán expandidas a su vez. Esto permite la posibilidad de hacer macros anidadas. Si la nueva expansión tiene la forma de una directiva de preprocesador, no será reconocida como tal.

Existen otras restricciones a la expansión de macros:

Las ocurrencias de macros dentro de literales, cadenas, constantes alfanuméricas o comentarios no serán expandidas.

Una macro no será expandida durante su propia expansión, así #define A A, no será expandida indefinidamente.

Ejemplo:

#define suma(a,b) (a)+(b) 

Los paréntesis en el cuerpo de la macro son necesarios para que funcione correctamente en todos los casos, lo veremos mucho mejor con otro ejemplo:

#include <iostream> 
using namespace std;
 
#define mult1(a,b) a*b 
#define mult2(a,b) (a)*(b) 
 
int main() { 
   // En este caso ambas macros funcionan bien: 
   cout << mult1(4,5) << endl; 
   cout << mult2(4,5) << endl; 
   // En este caso la primera macro no funciona, ¿por qué?: 
   cout << mult1(2+2,2+3) << endl; 
   cout << mult2(2+2,2+3) << endl; 
   
   cin.get();
   return 0;
}

¿Por qué falla la macro mult1 en el segundo caso?. Veamos cómo trabaja el preprocesador. Cuando el preprocesador encuentra una macro la expande, el código expandido sería:

int main() { 
   // En este caso ambas macros funcionan bien: 
   cout << 4*5 << endl; 
   cout << (4)*(5) << endl; 
   // En este caso la primera macro no funciona, ¿por qué?: 
   cout << 2+2*2+3 << endl; 
   cout << (2+2)*(2+3) << endl;
   
   cin.get();
   return 0;
} 

Al evaluar "2+2*2+3" se asocian los operandos dos a dos de izquierda a derecha, pero la multiplicación tiene prioridad sobre la suma, así que el compilador resuelve 2+4+3 = 9. Al evaluar "(2+2)*(2+3)" los paréntesis rompen la prioridad de la multiplicación, el compilador resuelve 4*5 = 20.

Directiva include:

La directiva "#include", como ya hemos visto, sirve para insertar ficheros externos dentro de nuestro fichero de código fuente. Estos ficheros son conocidos como ficheros incluidos, ficheros de cabecera o "headers".

Sintaxis:

#include <nombre de fichero cabecera>
#include "nombre de fichero de cabecera"
#include identificador_de_macro 

El preprocesador elimina la línea "#include" y la sustituye por el fichero especificado. El tercer caso halla el nombre del fichero como resultado de aplicar la macro.

La diferencia entre escribir el nombre del fichero entre "<>" o """", está en el algoritmo usado para encontrar los ficheros a incluir. En el primer caso el preprocesador buscará en los directorios "include" definidos en el compilador. En el segundo, se buscará primero en el directorio actual, es decir, en el que se encuentre el fichero fuente, si el fichero no existe en ese directorio, se trabajará como el primer caso. Si se proporciona el camino como parte del nombre de fichero, sólo se buscará es ese directorio.

El tercer caso es "raro", no he encontrado ningún ejemplo que lo use, y yo no he recurrido nunca a él. Pero el caso es que se puede usar, por ejemplo:

#define FICHERO "trabajo.h"


#include FICHERO
 
int main()
{
...
}

Es un ejemplo simple, pero en el capítulo 25 veremos más directivas del preprocesado, y verás el modo en que se puede definir FICHERO de forma condicional, de modo que el fichero a incluir puede depender de variables de entorno, de la plataforma, etc.

Por supuesto la macro puede ser una fórmula, y el nombre del fichero puede crearse usando esa fórmula.

<< < > >>
Free Web Hosting