Redefinição e Conversão de Tipos
Teoria
Introdução
Eae, tudo beleza? Hoje nós vamos aprender a como redefinir um tipo de variável, de forma a facilitar o nosso trabalho com elas, e a como converter tipos usando uma função própria do C++.
Redefinindo uma variável
Imagine a seguinte situação: você é contratado por uma empresa para desenvolver um software que possa atualizar automaticamente os dados de todos os funcionários dessa empresa. Para isso, você dividiu o seu programa em várias pequenas partes e, numa delas, você irá trabalhar apenas com o ID de cada funcionário. Para isso, você iria ficar definindo variáveis do tipo int para armazenar e ajustar os ID’s:
Com o intuito de tornar a leitura desse código algo mais intuitivo, você resolve redefinir as variáveis do tipo como um . Dessa forma, teríamos algo assim:
Com o uso do comando typedef podemos nos referir ao tipo inteiro por meio do termo escolhido (como um apelido) que, nesse caso, foi .
Ou seja, ao escrever no código daqui pra frente, o computador sabe que você tá falando de uma variável inteira e te poupa o esforço de sempre indicar isso!
Esse processo de redefinição de tipo pode ser aplicado para qualquer tipo de variável, não apenas o tipo inteiro, e a forma de ser feito segue o seguinte padrão:
Além disso, ainda é possível usar a referência original dos tipos e manter o criado apenas quando for preciso. Como aqui, onde temos um que não é :
Conversão de tipos
Uma conversão de tipo ocorre quando precisamos trabalhar com um tipo diferente daquele que uma expressão é definida inicialmente.
Um exemplo disso seria uma variável que é declarada como um float e, devido a alguma operação, precisamos trabalhar com ela como um tipo inteiro.
Para isso usamos a função static_cast. A forma de usá-la é:
Vamos ver um exemplo:
Nesse caso, usamos a função para converter um valor real num inteiro. Como um inteiro não possui parte decimal, haverá o arrendondamento do número. Com isso, ficamos com a saída:
Algo que precisamos ficar atentos quanto ao uso da função é a quantidade que cada variável pode armazenar. O que aconteceria caso tivéssemos uma variável do tipo com um valor que excedesse o máximo de uma variável e ainda assim quiséssemos fazer a conversão para o tipo inteiro?
Nesse código, nós armazenamos o valor 4 bilhões numa variável do tipo double, o que é válido, pois ela admite esse valor. Em seguida, nós fizemos um para e armazenamos esse valor numa variável do tipo inteiro, que não suporta esse valor.
Nesse caso, o programa dá erro? Vamos verificar a saída desse programa:
Ele não deu erro. Isso ocorre porque a função static_cast, de forma a não causar um erro quando o programa é iniciado, reinicia a contagem e retorna o menor valor que a variável pode assumir.
Como uma variável do tipo admite como valor mínimo , o static_cast nos retorna esse valor.
Logo, não é recomendado usar o cast para valores muito grandes que podem exceder o limite aceitável para a variável que será usada.
Com os conhecimentos adquiridos sobre a redefinição e a conversão de tipos, vamos fazer alguns exercícios de fixação!
Conversão de tipos
Exercícios Resolvidos
Exercício Resolvido #1
Elaboração Própria
Explique o que é a conversão de tipo e como usar a função static_cast do C++.
Passo 1
Uma conversão de tipo é quando se faz uma determinada expressão retornar um tipo de variável escolhida.
Mas o que isso significa?
Bem, suponha que você possua uma variável chamada numero do tipo int. Esse dado irá somente representar valores inteiros, mas e se precisarmos que o valor que está armazenado nessa variável fosse um número real? Nesse caso, podemos utilizar uma conversão de tipo para que o valor armazenado em numero retorne um dado do tipo float, por exemplo.
No C++, esse processo é realizado por meio da função static_cast, que possui como sintaxe:
Resposta
É forçar uma expressão a retornar determinado tipo de dado.
Exercício Resolvido #2
Elaboração Própria
Explique como ocorre uma redefinição de tipo no C++.
Passo 1
No C++, uma redefinição de tipo é quando nós definimos um nome (apelido) a se usar para referenciar um determinado tipo de variável. Em outras palavras, criamos uma nova referência. Fazemos a redefinição de tipo utilizando o comando typedef e a sua sintaxe é:
Como exemplo, caso quiséssemos mudar do tipo de variável para, escreveríamos:
Após esse comando, poderíamos declarar variáveis do tipo como
Nesse caso, declaramos uma variável de nome e de tipo .
Resposta
Por meio do comando , onde fornecemos o tipo de variável a ser redefinida e o seu apelido.
Exercício Resolvido #3
Elaboração Própria
Um programador fez um código em C++ no qual há um cast de uma variável do tipo double para uma variável a do tipo int. Durante a execução do seu código, houve um problema, pois, ao imprimir a variável a, o programa passou a imprimir o valor , que não havia sido atribuído a ela.
Com os seus conhecimentos da função static_cast, descreva um possível motivo para esse problema.
Passo 1
Uma variável do tipo tem uma maior capacidade de armazenamento que uma variável do tipo . Dessa forma, ao se utilizar o comando para fazer uma conversão do tipo para o tipo , existe a possibilidade do tipo , nesse momento, estar guardando um valor maior do que aquele suportado por uma variável .
Nessa situação, o comando retorna o menor valor possível para a variável do tipo .
Resposta
A variável do tipo está armazenando um valor maior que o máximo possível de ser suportado por uma variável do tipo .
Exercício Resolvido #4
Elaboração Própria
Suponha que você é contratado para elaborar um programa que melhore o cadastro dos preços de produtos no banco de dados de uma rede de supermercados.
Nesse programa, o valor de cada preço será armazenado numa variável do tipo float.
Para que o seu programa fique de melhor entendimento para os funcionários da rede de supermercados, você opta por apelidar o tipo float com o nome “preco”. Faça a implementação dessa redefinição e mostre como ela fica para os produtos usados no código acima.
Passo 1
Fala aí, pessoal! Nesse exercício, o enunciado já disse o que quer da gente né, que é apelidar o tipo de variável com o nome . Isso significa fazer uma redefinição de tipo, porque vamos redefinir o tipo como . E pra fazer redefinição de tipo, usamos o comando typedef:
Depois disso, basta refazer o código anterior, utilizando no lugar do .
Resposta
Exercício Resolvido #5
Elaboração Própria
Faça um programa que use a função static_cast para converter um número real que o usuário passa para o programa em valor inteiro. Ao fim, imprima o valor inteiro após a seguinte mensagem “A parte inteira do numero digitado e “.
Passo 1
Primeiramente, vamos incluir a biblioteca (linha 01), inicializar a função main e declarar as duas variáveis a serem utilizadas: aquela que vai guardar o valor real passado pelo usuário e aquela que vai armazenar a parte inteira (linhas 8 e 9).
Vamos adotar como nome para a primeira variável e como nome para a segunda.
Após isso, vamos printar uma mensagem para indicar que o usuário deve digitar um número real (linha 11) e, logo em seguida, vamos fazer a leitura desse número e atribuí-lo a variável (linha 12).
Passo 2
Agora, vamos implementar o comando para que a variável receba o valor passado ao programa como um . Fazemos isso na linha 14.
Agora, basta imprimir na tela a mensagem que está no enunciado, com o comando cout (linhas 16 a 18).
Resposta
Exercício Resolvido #6
Elaboração Própria
O programa acima foi escrito com a intenção de apresentar a seguinte saída:
5 dividido por 2 e igual a 2.5
No entanto, no lugar de , o código está imprimindo . Corrija o código para que ele apresente a saída correta.
Passo 1
Eai, tudo beleza?
Inicialmente, vamos analisar o código que foi dado. Ele inicia a função declarando duas variáveis, e , sendo a primeira do tipo inteiro e com valor inicial e a segunda do tipo e assume como valor iniciar a variável dividida por . Logo em seguida, é feita a impressão na tela da mensagem de saída do código.
O problema aqui está em como foi passado o valor para a variável . Quando fazemos , como é um inteiro, essa operação vai resultar num inteiro também, ou seja, vai resultar na parte inteira da divisão, que seria .
Passo 2
Para corrigirmos esse erro, devemos utilizar o para fazer com que o valor de ao ser passado para seja do tipo :
Dessa forma, a operação de divisão vai nos retornar o valor .
Resposta
Exercício Resolvido #7
Elaboração Própria
Suponha que você foi contratado para desenvolver um programa que auxilia o cadastro de pacientes num programa de nutrição.
Para realizar o cadastro de um paciente, são necessárias as informações sobre o ID, o peso e a altura do paciente. Como o seu programa vai ser utilizado por pessoas leigas em programação, você acreditou ser uma boa ideia redefinir os tipos de dados para facilitar o uso.
Sabendo que o ID é representado por um número inteiro, o peso e a altura são números reais, redefina os tipos como e como e .
Passo 1
Eai, tudo beleza?
Nessa questão, precisamos fazer a redefinição de alguns tipos para facilitar o uso do nosso programa, o que é na prática, dar um apelido para um tipo de dado.
Para isso, vamos utilizar o comando para fazer as redefinições pedidas, seguindo a seguinte estrutura:
Aplicando ao nosso problema, temos:
Passo 2
Para finalizar, vamos fazer um exemplo de cadastro de paciente.
Vamos declarar um ID, um peso e uma altura, sem precisar indicar os respectivos tipos:
Resposta
Exercício Resolvido #8
Elaboração Própria
Um engenheiro eletrônico está programando um firmware e precisa separar diferentes tipos de dados de acordo com a quantidade de bytes que eles ocupam na memória. Com os seus conhecimentos em redefinição de tipo, você resolve ajudar o engenheiro redefinindo os tipos , , e para a quantidade de bytes que eles ocupam na memória ram do computador. Desenvolta essa redefinição em C++.
Passo 1
Eai, tudo beleza?
Nessa questão, temos que fazer apelidar alguns tipos de dados com base na quantidade de memória que eles ocupam. Para isso, vamos fazer uma tabela com a quantidade de memória que cada tipo de dado que foi dito para redefinir ocupa:
Passo 2
Agora, basta utilizarmos o comando para apelidar cada tipo de dado de acordo com a tabela: