Otros operadores

Por último vamos a exponer los operadores global y de resolución de ámbito, el operador tamaño de, el operador coma, y los operadores dirección de, contenido de y referencia a.

Operador global y de resolución de ámbito (::)

El operador :: permite acceder a una variable global cuya visibilidad ha sido ocultada por una variable local. El ejemplo siguiente define una variable global v y otra local con el mismo nombre, en la función main. Observamos que para acceder a la variable global se utiliza el operador ::.

 listado_ejercicio9Después de ejecutar este programa el resultado que obtenemos es el siguiente:

salida_ejercicio9

Tambien se usa para especificar a qué clase pertenece un determinado método; por ejemplo, cuando se define fuera del ámbito de la clase, o cuando se invoca si se declaró static, que estudiaremos en el capítulo dedicado a clases de objetos. Por ejemplo, la siguiente línea de código invoca al método max declarado static en la clase numeric_limit<float>:

numeric_limitsOperador sizeof

El tamaño de los objetos en C++ es un múltiplo del tamaño de un char que por definición es de 1 byte. Para obtener este tamaño se utiliza el operador sizeof. Este operador da como resultado el tamaño en bytes de su operando que puede ser el identificador o el tipo de una variable previamente declarada. Por ejemplo:

sizeof_listado

Ejecutando el programa tenemos:

salida_sizeof

Ejercicio:

Haz un programa que nos diga el tamaño de las declaraciones en bytes:

  • int
  • float
  • double
  • char

ejercicio11_ejemplo_salida

Operador coma

Un par de expresiones separadas por una coma se ejecutarán de izquierda a derecha y la expresión de la izquierda se descarta. Por ejemplo:

listado_operador_coma

En la sentencia y = (t = x, x += 1, t), se evalúan las tres expresiones especificadas entre paréntesis en el orden en el que están, y se asigna el valor de la última expresión, esto es, de t, siendo descartadas las otras dos.

 Operador dirección-de (&)

El operador & (dirección-de) permite obtener la dirección de su operando. Por ejemplo:

listado_direccion_de

El resultado de las sentencias puede ser similar a esta:

Operador_&_direccion_de

El resultado desde un punto de vista gráfico podemos verlo en la figura siguiente. Esta representa un segmento de de memoria de n bytes. En este segmento localizamos el entero 7 de cuatro bytes de longitud en la dirección 0xbfea72a8. La variable a representa al valor 7 y la expresión &a es 0xbfea72a8 (&a – dirección de a – es la celda de la memoria en la que localizamos a).

Ejercicio

Haz un programa que asigne datos a 3 variables distintas, y que muestre en pantalla el dato y la dirección de memoria de cada variable asignada.

Operador de indirección (*)

El operador * accede a un valor indirectamente a través de una dirección (un puntero). El resultado es el valor direccionado por el operando (el valor apuntado por el puntero, dicho de otro modo).

Un puntero es una variable capaz de contener una dirección de memoria que indica dónde se localiza un dato de un tipo especificado (por ejemplo, un entero).

La sintaxis para definir un puntero es:

sintaxis_indireccion

donde:

operador_indireccion_1

Veamos el siguiente ejemplo que nos ayudará a clarificarlo más:

listado_indireccion

Cuando ejecutamos observamos:

salida_indireccion

Vemos en el resultado que se ve perfectamente que el contenido de px (*px) es 7. La sentencia y = *px se lee “y igual al contenido de px“. De una forma más clara diríamos “y igual al contenido de la dirección especificada por px“. Podemos representarlo en el siguiente gráfico:

grafico_indireccion2

 Vemos que una vez que px contiene la dirección de x, *px y x hacen referencia al mismo dato, por lo tanto, usar *px o x es indistinto.

Operador referencia a

 Una referencia es un nombre alternativo (un sinónimo) para un objeto. Su uso lo podemos observar en los capítulos siguientes, en el diseño de clases, en el valor retornado por una función para permitir que dicha función se utilice a ambos lados del operador de asignación (la función devuelve una referencia), o para permitir que los argumentos en la llamada pueden cambiar (paso de parámetros por referencia).. La forma general de expresar una referencia es:

operador_referencia_a

El siguiente ejemplo declara una referencia x a una variable y.

operador_referencia_a

Toda referencia, excepto las declaradas como parámetros formales en una función, debe ser siempre iniciada; de lo contrario, el compilador mostrará un error.

Una referencia no es una copia de la variable referenciada, sino que es la misma variable con un nombre diferente. Esto significa, en contra de lo que parece, que un operador no opera sobre la referencia, sino sobre la variable referenciada. Por ejemplo:

listado_conta_con

Ejecutando el programa:

salida conta_con

 Vemos que aunque con++ es correcto, no se incrementa la referencia con, sino que ++ se aplica al objeto referenciado, que resulta ser el entero identificado por conta. Vemos también que ambas sentencias cout tienen el mismo efecto, puesto que los identificadores conta y con hacen referencia al mismo objeto.

Una referencia, a efectos de resultados, puede ser considerada como un puntero que accede al contenido del objeto apuntado sin necesidad de utilizar el operador de indirección (*). Sin embargo, a diferencia de un puntero, una referencia debe ser iniciada y no puede ser desreferenciada utilizando el operador * (contenido de). Por ejemplo, apoyandonos en el ejemplo anterior, la siguiente línea daría lugar a un error:

indireccion_ilegalEl compilador se quejará mostrando el tipo de error:

indireccion_ilegal_salida

Si en una declaración se especifica más de una referencia, cada uno de los identificadores correspondientes debe ser precedido por el operador &. Por ejemploL:

mas_referencias

Este ejemplo define dos referencias, x e y, a m y n, respectivamente, y un entero z, al cual se le ha asignado el valor n.

atras2

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s