type conversions c
Consulte las diversas conversiones de tipos compatibles con C ++.
Esperamos que conozca todos los tipos de datos que están disponibles en C ++ en nuestros tutoriales anteriores. A veces, puede surgir una necesidad tal que necesitemos convertir un tipo en otro. Esto se llama conversión de tipos o fundición de tipos.
En este tutorial, discutiremos las diversas conversiones de tipos compatibles con C ++.
qa o ba cual es mejor
=> Haga clic aquí para obtener el curso gratuito de C ++.
Lo que vas a aprender:
- Conversiones de tipo
- Conversión implícita
- Conversión explícita
- Tipos de casting
- Conclusión
- Lectura recomendada
Conversiones de tipo
C ++ admite dos tipos de conversiones de tipos:
- Conversión de tipo implícita: La conversión de tipo implícita es automática. No hay interferencia del usuario en este tipo de conversión y el compilador realiza directamente la conversión. La conversión generalmente se realiza cuando en la expresión hay más de un tipo de datos. Pero generalmente, en este tipo de conversión, existe la posibilidad de pérdida de datos, pérdida de signos o desbordamiento de datos.
- Conversión de tipo explícito: La conversión de tipos explícita la define el usuario y normalmente se denomina 'conversión de tipos'. Aquí el usuario transmite o convierte un valor de un tipo de datos a otro según los requisitos. Este tipo de conversiones son más seguras.
Ahora veremos ambos tipos de conversión de tipos en detalle.
Conversión implícita
En la conversión implícita, el compilador realiza las conversiones de un tipo de datos a otro siempre que una expresión tenga más de un tipo de datos. Para evitar la pérdida de datos, todas las variables de los otros tipos de datos se convierten al tipo de datos más grande. A esto se le llama promoción.
Entendamos la conversión implícita usando un ejemplo de código.
|_+_|Producción:
10 + ‘A’ = 75
float val (10 + 'a') = 107
var_int = 1000
El ejemplo de código anterior demuestra la conversión implícita. Hemos declarado una variable de tipo entero y de carácter con valores 10 y 'A' respectivamente. Cuando sumamos estas dos variables, se produce una conversión implícita.
Como el entero es el tipo más grande en esta expresión, el valor de la variable de carácter 'A' se convierte en su equivalente entero, es decir, el valor 65 (valor ASCII). Por tanto, el resultado de la expresión es 75.
En la siguiente expresión, agregamos un número entero y un carácter ('a' -> 97) y luego asignamos el resultado a flotante. Por lo tanto, el compilador convierte implícitamente el resultado de la expresión en flotante.
En la tercera expresión, una variable int corta se convierte implícitamente en un entero.
Nota : En caso de conversiones implícitas, si el compilador detecta una posible pérdida de datos, es posible que muestre una advertencia a tal efecto.
Conversión explícita
La conversión explícita también se conoce como 'conversión de tipos', ya que 'transmitimos' un tipo de datos a otro tipo de datos. Aquí, los usuarios definen explícitamente la conversión, a diferencia de la conversión implícita, donde el compilador lleva a cabo la conversión internamente.
Podemos realizar la conversión explícita de dos formas:
# 1) Usando el operador de asignación
La conversión explícita o el encasillado usando el operador de asignación de alguna manera se realiza con fuerza. Aquí emitimos o convertimos un tipo de datos en otro tipo de datos utilizando el operador de asignación.
La sintaxis general es:
|_+_|El siguiente ejemplo explica esto:
|_+_|Producción:
Suma = 5563
Comp = 5563,2
Hemos mostrado la conversión explícita usando el operador de asignación en el ejemplo anterior. Primero, convertimos el salario variable de tipo double a un tipo entero. A continuación, convertimos la suma de la variable entera a un tipo doble.
Como se muestra en la salida, el tipo al que emitimos indica el tipo final del resultado de la expresión.
Esto es ventajoso ya que el usuario puede cambiar el tipo de expresión según los requisitos.
# 2) Uso de Cast Operator
En este tipo de fundición, utilizamos un 'operador de fundición' que es un operador unario para cambiar de un tipo a otro.
Tipos de casting
Tenemos los siguientes tipos de fundición según el operador de fundición que utilicemos:
# 1) Reparto estático
El reparto estático es el más simple entre todos los encasillamientos que utilizan el operador de reparto. . El elenco estático es capaz de realizar todas las conversiones que se llevan a cabo implícitamente. También realiza conversiones entre punteros de clases relacionadas entre sí (upcast -> de derivado a base o downcast -> de base a derivado).
Además de las conversiones mencionadas anteriormente, la transmisión estática también puede convertir cualquier puntero en void *.
El reparto estático es el reparto de tiempo compilado. Esto significa que no se realiza ninguna comprobación en tiempo de ejecución para ver si el reparto realizado es válido o no. Por lo tanto, sigue siendo responsabilidad del programador asegurarse de que la conversión sea segura y válida.
¿Cuál es la diferencia entre garantía de calidad y control de calidad?
En otras palabras, el usuario debe asegurarse de que el objeto convertido esté lleno con respecto al tipo de datos de destino.
Especificamos un reparto estático de la siguiente manera:
|_+_|Entendamos el reparto estático usando un ejemplo.
|_+_|Producción:
Antes de lanzar: gl = 42,875
Después de static_cast: total = 42
Así, en el ejemplo anterior, hemos calculado el valor del tipo double. Luego aplicamos un static_cast a este valor para convertirlo en un tipo entero. En la salida, vemos que el valor se trunca después de convertirlo en int.
Ahora modifiquemos el código anterior de la siguiente manera:
|_+_|En el ejemplo anterior, hemos modificado ligeramente el código para incluir una variable de carácter con valor 'A'. Luego declaramos un puntero entero y aplicamos una conversión estática para convertir un carácter en un puntero entero.
Cuando compilamos este programa obtenemos el siguiente resultado.
En la función 'int main ()':
10:35: error: static_cast no válido del tipo 'char *' al tipo 'int *'
El programa da un error para el lanzamiento estático realizado, ya que no es válido. Por lo tanto, static cast solo permite conversiones o conversiones de tipos válidos y da un error cuando intentamos realizar alguna conversión indeseable.
# 2) Reparto dinámico
El reparto dinámico es un reparto en tiempo de ejecución que se realiza para comprobar la validez del reparto. La conversión dinámica se realiza solo en referencias y punteros de clase. La expresión devuelve un valor NULL si falla la conversión.
El reparto dinámico utiliza un mecanismo conocido como RTTI (identificación del tipo de tiempo de ejecución) . RTTI hace que toda la información sobre el tipo de datos del objeto esté disponible en tiempo de ejecución y solo está disponible para las clases que tienen al menos una función virtual (tipo polimórfico). RTTI permite determinar el tipo de objeto en tiempo de ejecución o en el momento de ejecución.
Probemos un ejemplo para entender el reparto dinámico.
|_+_|En este programa, hemos definido dos clases, base con una función virtual y derivada que tiene una clase base, base.
En la función principal, creamos un objeto de clase derivada apuntado por el puntero de clase base. Luego, realizamos dynamic_cast en el puntero base que apunta a una clase derivada para convertirlo en un puntero de clase derivada.
Como en la clase base, la base es polimórfica (contiene la función virtual), el dynamic_cast es exitoso.
Nota: Si eliminamos la función virtual de la clase anterior, dynamic_cast fallará ya que la información RTTI para los objetos no estará disponible.
El reparto dinámico tiene una sobrecarga de seguridad de tipo en tiempo de ejecución.
# 3) Reinterpretar el reparto
Este tipo de conversión es más peligroso de usar, ya que funciona en cualquier tipo de objeto sin que las clases estén relacionadas entre sí.
Reintepret_cast funciona en cualquier puntero y convierte un puntero de cualquier tipo en cualquier otro tipo, independientemente de si los punteros están relacionados entre sí o no. No comprueba si el puntero o los datos apuntados por el puntero son iguales o no.
El operador de conversión toma solo un parámetro, el puntero de origen para convertir y no devuelve ningún valor. Simplemente convierte el tipo de puntero.
No debemos usar a menos que sea necesario. Por lo general, encasillamos el puntero de origen a su tipo original.
Usamos principalmente para trabajar con bits. Cuando se usa en valores booleanos, los valores booleanos se convierten en valores enteros, es decir, 1 para verdadero y 0 para falso.
Veamos un ejemplo de Reinterpret cast:
|_+_|Producción:
0x3ef3090
a
97
a
En el ejemplo anterior, hemos declarado un puntero entero ptr que apunta al valor 97. A continuación, declaramos un puntero de carácter ch y le enviamos ptr usando.
A continuación, imprimimos varios valores. El primero que imprimimos es ptr que apunta a una ubicación entera. Por tanto, imprime una dirección.
El siguiente valor ch contiene el valor 97 y, por lo tanto, imprime 'a' que es ASCII equivalente a 97. El siguiente valor '* ptr' tiene el valor 97 mientras que '* ch' contiene ASCII equivalente a 97, es decir, 'a' cuando se lanza usando el reinterpret_cast.
# 4) Reparto constante
El operador de conversión se utiliza para cambiar o manipular la consistencia del puntero de origen. Por manipulación, queremos decir que puede ser para establecer la constness en un puntero no constante o eliminar la constness de un puntero constante.
La condición para lanzar correctamente el operador es que el puntero y la fuente que se transmite deben ser del mismo tipo.
Tomemos un ejemplo para entender esto.
|_+_|En este ejemplo, vemos que la función 'printVal' acepta un puntero no constante. En la función principal, tenemos una variable constante 'valor' asignada al puntero constante ptr.
Para pasar este puntero const a la función printVal, lo convertimos aplicándolo para eliminar la constness. Luego pasamos el puntero ptr_cast a la función para obtener los resultados deseados.
Conclusión
Con esto, concluiremos este tema de conversión de tipos en C ++. Hemos visto todo sobre conversiones implícitas y explícitas que se utilizan en C ++.
Sin embargo, uno debe ser consciente de que para evitar la pérdida de datos y otras dificultades similares, las conversiones o encasillamientos deben aplicarse con prudencia solo si la situación requiere el uso.
preguntas y respuestas de la entrevista css3 pdf
=> Tenga cuidado con la guía de formación para principiantes de C ++ aquí.
Lectura recomendada
- La mejor serie de tutoriales de C # GRATIS: la guía definitiva de C # para principiantes
- Calificadores de tipo y clases de almacenamiento en C ++
- Tipos de pruebas de migración: con escenarios de prueba para cada tipo
- ¿Cómo decidir qué tipo de prueba se requiere para un proyecto? - Manual o Automatización
- Tipos de datos C ++
- Pruebas de carga con tutoriales de HP LoadRunner
- Variables en C ++
- Plantillas en C ++ con ejemplos