Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.9.9b El operador static_cast

§1  Sinopsis

Este es el operador de modelado que se recomienda para todas aquellas situaciones en que está perfectamente definido el tipo de conversión deseado. Se recomienda incluso para aquellos casos en que técnicamente no es necesario un modelado explícito porque el compilador lo realiza automáticamente.

§2  Sintaxis

static_cast<T> (arg)

Ejemplo

int x = 10;
float f = static_cast<float> (x);

§4  Descripción

  <T> es el tipo al que se convertirá (resultado del modelado); puede ser cualquiera de los siguientes: puntero ( 4.2); referencia ( 4.2.3); tipo aritmético ( 2.2.1) o enumeración ( 4.7). Este operando se denomina tipo del modelado.

  arg es el objeto cuyo tipo se desea convertir; debe ser asimilable al tipo de T (aquí no se pueden pedir imposibles); este operando se denomina argumentodel modelado. Ambos operandos, el argumento y el tipo (arg y T), deben estar totalmente definidos en tiempo de compilación.


§5  Si un tipo puede ser convertido en otro mediante algún sistema proporcionado automáticamente por el lenguaje, utilizar la promoción explícita mediante este operador conduce exactamente al mismo resultado. Por ejemplo:

int x = 10;
float f1 = x;                // promoción facilitada por el compilador
float f2 = static_cast<float> (x);  // promición explícita (preferible)


§6  Los enteros (int) pueden ser convertidos a enumeraciones (enum), pero tenga muy presente que cualquier intento de promover el argumento a un valor que no sea un elemento de la enumeración (enumerando), proporciona un resultado indefinido. Considere las dos salidas del ejemplo compilado con C++Builder:

#include <iostream.h>

int main() {
  enum COLOR { ROJO, VERDE, AZUL};
  COLOR c1 = VERDE;
  cout << "C1 es color " << c1 << endl;
  int x = 2;
  // c1 = x;        !! Aviso de asignación anómala: int a COLOR
  c1 = static_cast<COLOR> (x);  // Ok. promoción correcta
  cout << "C1 es color " << c1 << endl;
  COLOR c2;
  int y = 5;
  c2 = static_cast<COLOR> (y);  // Resultado indefinido (y > AZUL)
  cout << "C2 es color " << c2 << endl;
}

Salida:

C1 es color 1
C1 es color 2
C2 es color 5

Observe que en este último caso, el compilador hace adoptar a c2 un valor 5 que es teóricamente imposible para el tipo COLOR, lo que podría dar lugar a errores importantes.

§7  Conversión de punteros

El puntero nulo ( 4.2.1) es convertido a sí mismo.

El puntero a un objeto tipoX puede ser promovido a puntero a cualquier otro tipoY, pero tenga en cuenta que la mera promoción entre tipos de punteros puede ser motivo de problemas si los tipos equivalentes no están alineados de forma similar.

El resultado de la conversión estática de un puntero es otra referencia al objeto original.

Es posible convertir explícitamente, mediante una conversión estática, un puntero a clase-X a puntero a una clase-Y, si se dan las siguientes condiciones:

  • X es una clase base para Y.
  • Existe una conversión sin ambigüedades de Y a X
  • X no es una clase-base virtual


Un objeto puede ser convertido explícitamente a referencia-a-tipoX si un puntero a tal objeto puede ser explícitamente convertido a puntero-a-tipoX (tipoX*). El resultado de la conversión es un Lvalue.  No son invocados constructores o funciones de conversión como resultado de un modelado a una referencia.

Un objeto o un valor puede ser convertido a un objeto clase, solo en el caso de que se hayan declarado en la clase un constructor o un operador de conversión adecuados.

Un puntero a miembro (de clase) puede ser convertido explícitamente en puntero a otro tipo de miembro solo si ambos tipos son punteros a miembros de la misma clase, o punteros a miembros de dos clases, una de las cuales es derivada sin ambigüedades de la otra.

§8  Convertir a referencia

Cuando el tipo T es una referencia, el resultado del modelado estático es un Lvalue y se refiere a la expresión original, aunque este tipo de transformaciones puede resultar peligroso ( 4.2.3).