Cum se convertesc tipuri de date în C++

Cum Se Convertesc Tipuri De Date In C



Procesul de schimbare a tipului de date al unei variabile în alta este cunoscut sub numele de conversie de tip sau turnare de tip în C++. Acest lucru se face pentru a efectua operații matematice asupra variabilelor diferitelor tipuri de date, făcând tipurile de date compatibile între ele. Conversia tipului optimizează codul. De exemplu, atunci când se calculează diferența dintre două variabile, dacă un număr este de tip float și celălalt în tip de date întreg, atunci tipul de date întreg va fi convertit în tip de float pentru a efectua scăderea.

Cum se convertesc tipuri de date în C++

În C++, există două moduri de a schimba tipurile de date:

Conversie implicită de tip

Conform regulilor predefinite de compilatorul de cod C++, conversia implicită a tipului este conversia tipului efectuată de compilator în mod automat, fără a necesita vreun declanșator extern de la utilizator. Acest tip de conversie are loc de obicei într-un program atunci când există mai multe tipuri de date, iar tipul de date al expresiei nu se potrivește cu tipul de date al variabilei implicate în această expresie.







Pentru a evita pierderea datelor în timpul conversiei, compilatorul schimbă implicit tipul de date cu precizie redusă cu tipul de date cu precizie mai mare. De exemplu, va converti un număr întreg într-un float, mai degrabă decât să schimbe float într-un întreg pentru a preveni pierderea datelor. Aceasta se numește promovare. În continuare este diagrama de precedență pentru diferitele tipuri de date.





Comanda pentru conversia tipului

Ordinea corectă pentru conversia tipului este dată astfel:





bool -- > char -- > scurt int -- > int -- > int nesemnat -- > lung -- > nesemnat lung -- > lung lung -- > pluti -- > dublu -- > dublu lung

Variabila de tip de precizie scăzută este convertită în tipul de date de înaltă precizie pentru a preveni pierderea datelor.

Exemplul 1

În acest exemplu, adăugarea este efectuată asupra variabilei diferitelor tipuri de date utilizând conversia implicită a tipului.



#include
folosind spatiu de nume std ;

int principal ( ) {
int număr = 100 ;
char caracter = „C” ;
cout << „100 + „C” = „ << număr + caracter << endl ;

pluti val = număr + 'c' ;
cout << 'float val(100 + 'c') = ' << val << endl ;

int a fost = 7890 ;
lung nu a fost = a fost ;
cout << 'var_int = ' << nu a fost ;
întoarcere 0 ;
}

Aici sunt adăugate un număr întreg și un caracter din tabelul ASCII și un număr flotant și un caracter „c”. Întregul este păstrat în al treilea segment ca tip de date lung, iar tipurile de date sunt modificate de compilator însuși pe baza regulilor sale predefinite.

Suma lui 100 și „C” returnează 167, deoarece „C” echivalează cu 67 în numere, iar 100+’c’ returnează 199, deoarece „c” minuscul este echivalent cu 99. Variabila int este stocată într-un tip de date lung.

Exemplul 2

În acest exemplu, caracterul D este convertit într-un float pentru a efectua operația de împărțire.

#include
folosind spatiu de nume std ;

int principal ( ) {
char X = 'D' ;

pluti float_var ;

float_var = pluti ( X ) / 'c' ;
// Convertirea explicită a unui int într-un float.

cout << 'Valoarea float_var este: ' << float_var << endl ;

întoarcere 0 ;
}

Valoarea de intrare este sub forma caracterului D care este stocat în tipul de date float și împărțit în continuare cu caracterul C. Aceste caractere sunt schimbate în valori numerice și se efectuează o operație de divizare asupra lor, returnând valoarea în float.

Conversie explicită de tip

Utilizatorul trebuie să modifice manual tipul de date cu conversia explicită a tipului C++, adesea cunoscută sub numele de turnare de tip. Acest tip de turnare se face pentru a evita conversia implicită a tipului. Există două metode de a efectua Casting de tip explicit în C++:

  • Conversie folosind Operatorul de atribuire
  • Conversie folosind operatorul Cast

Tastați Conversie folosind Operatorul de atribuire în C++

Conversia tipului folosind Operatorul de atribuire se face cu forță, adică un tip de date este convertit manual în altul. Acest lucru se realizează prin utilizarea operatorului de atribuire „=”, care atribuie valoarea operandului din dreapta variabilei din partea stângă.

Exemplu
Acest program calculează aria cercului folosind tipul turnare.

#include
#include
folosind spatiu de nume std ;
int principal ( )
{
int rază ;
cout <> rază ;
pluti zonă = M_PI * rază * rază ;
cout << 'Aria cercului cu raza' << rază << ' = ' << zonă ;
}

Operatorul de alocare este utilizat pentru a atribui valoarea float zonei, care constă din valoarea razei în tipul de date întreg.

Zona cercului este returnată în tipul de date float, în timp ce raza este introdusă în tipul de date întreg. Astfel, tipul de date al variabilei este modificat prin casting de tip folosind operatorul de atribuire.

Conversie tip folosind operatorul Cast în C++

Conversia tipului se face prin utilizarea unui operator cast, care forțează un tip de date să se schimbe într-un alt tip în funcție de nevoile programului.

Există patru operatori de distribuție diferiți:

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

1: static_cast

static_cast este operatorul de turnare care este folosit pentru a converti explicit elementele mobile și caracterele în numere întregi și așa mai departe. Acesta este cel mai elementar operator de turnare. Poate proiecta tipuri de date care sunt de natură similară. Poate converti pointerii de la o formă la alta, deci poate fi folosit și pentru gestionarea memoriei.

Sintaxă

static_cast ( expresie )

Exemplu
Acest program este construit pentru a converti o variabilă dublă într-un tip de date int folosind static_cast. Va tăia orice parte zecimală din ieșire.

#include
folosind spatiu de nume std ;
int principal ( )
{
// declar o variabilă
dubla p ;
p = 2.905 * 1.235 * 24.675 ;
pluti rezultat ;

cout << ' Înainte de a utiliza distribuția statică:' << endl ;
cout << „Valoarea lui p =” << p << endl ;

// folosiți static_cast pentru a converti tipul de date
rezultat = static_cast ( p ) ;
cout << „După folosirea distribuției statice:” << endl ;
cout << ' Valoarea rezultatului = ' << rezultat << endl ;

întoarcere 0 ;
}

Inițial, o variabilă dublă p este încărcată cu valori care sunt înmulțite între ele și stocate în rezultat. Rezultatul conține rezultatul înainte și după operatorul static_cast:

Înainte de a utiliza operatorul static_cast, rezultatul este afișat în puncte zecimale, în timp ce după utilizarea acestui operator este afișat în tipul de date întreg.

2: const_cast

Operatorul const_cast este folosit pentru a converti o valoare constantă a unui obiect în tipul non-constant. Este folosit în cazul în care este declarat un obiect constant și trebuie să îi schimbăm ocazional valoarea.

Sintaxă

const_cast ( expresie )

Exemplu
În acest exemplu, operatorul const_cast este folosit pentru a elimina temporar calificativul constantă și permite efectuarea de modificări în variabilă în funcție de necesitate:

#include
folosind spatiu de nume std ;
int principal ( ) {
const int X = 70 ;
const int * și = & X ;
cout << „Valoarea veche este” << * și << ' \n ' ;
int * Cu = const_cast ( și ) ;
* Cu = 90 ;
cout << „Valoarea nouă este” << * și ;
întoarcere 0 ;
}

Calificatorul constantă este atribuit unei variabile int x, ceea ce înseamnă că această variabilă nu poate fi modificată direct. După aceea, int *y care este un pointer este folosit pentru a accesa x, dar tot nu poate fi schimbat, iar valoarea sa inițială este afișată folosind cout. Folosind operatorul const_cast, este creat un pointer z care este non-constant, este folosit pentru a accesa valoarea lui x făcându-l editabil. Schimbă valoarea atribuită lui z cu 90 care schimbă indirect valoarea în x.

Inițial, valoarea variabilei constante x este 70, care este modificată prin utilizarea operatorului const_cast, făcându-l 90.

3: dynamic_cast

cu ierarhia moștenirii, care este denumită și tip-safe downcast. Down casting este procesul de conversie a unei referințe sau pointer într-o clasă derivată dintr-o referință sau pointer de clasă de bază.

Sintaxă

dynamic_cast ( expresie )

Exemplu
În acest exemplu, operatorul dynamic_cast este folosit pentru a verifica tipul clasei polimorfe și permite accesul atât la membrii clasei de bază, cât și la cei derivati.

#include
#include
folosind spatiu de nume std ;
clasă TBase
{
public :
pluti baza_g = 9,81 ;

virtual gol manechin ( )
{

} ;
} ;

clasă TDerivat : public TBase
{
public :
int local_g = 9,78 ;
} ;

int principal ( )
{

TBase * baza = nou TDerivat ;
TDerivat * derivat ;

derivat = dynamic_cast ( baza ) ;

cout < baza_g << endl ;
cout < local_g << endl ;

getchar ( ) ;
întoarcere 0 ;
}

Două clase sunt definite ca clase de bază și derivate. O bază de pointer de tip TBase* este creată și atribuită unui obiect alocat dinamic de tip TDerived. Un obiect de clasă derivată poate fi atribuit unui pointer de clasă de bază în acest caz de polimorfism. dynamic_cast verifică dacă pointerul accesează obiectul valid al lui TDerived, dacă castul obține un rezultat de succes, clasa derivată va obține un rezultat valid, altfel va returna o valoare nulă.

4: reinterpret_cast

Reinterpret_cast transformă un pointer de un tip de date într-un pointer de alt tip de date. Nu verifică dacă tipurile de date de pointeri sunt aceleași sau nu. Acest operator de turnare trebuie utilizat și manipulat cu atenție.

Exemplu
În această ilustrație, pointerul unui tip de date este reinterpretat într-un pointer al altui tip de date folosind reinterpret_cast:

#include
folosind spatiu de nume std ;

int principal ( )
{
int * q = nou int ( 70 ) ;
char * cap = reinterpret_cast ( q ) ;
cout << * q << endl ;
cout << * cap << endl ;
cout << q << endl ;
cout << cap << endl ;
întoarcere 0 ;
}

Inițial, un număr întreg este alocat cu valoarea 70. Pointerul q indică acest număr întreg alocat dinamic. Reinterpret_cast este folosit pentru a reinterpreta indicatorul q ca indicator de caracter ch, ceea ce înseamnă că memoria alocată inițial lui q este acum tratată ca și cum ar fi un caracter. Folosind comanda cout, imprimă valoarea atribuită lui q și ch. Deoarece ch este tratat ca un indicator de caracter, va returna o valoare de caracter.

Tipărește valoarea îndreptată către ch folosind *ch. Cu toate acestea, deoarece ch este tratat ca un indicator de caracter, această linie va interpreta memoria ca un caracter. Tipărește adresa de memorie stocată în indicatorul ch folosind ch. Aceasta este aceeași adresă de memorie ca și q, deoarece este doar o reinterpretare a aceleiași memorie.

Inițial, întregul stochează 70. Mai târziu, acesta este manipulat între indicatorul q și indicatorul ch. Ieșirile 2 și 4 sunt aceleași deoarece a doua valoare este reinterpretată folosind reinterpret_cast.

Notă : Se recomandă să nu utilizați acest operator de turnare până când și dacă nu este foarte necesar, deoarece face obiectul un produs neportabil

Concluzie

Procesul de schimbare a tipului de date al unei variabile în alta este cunoscut sub numele de conversie de tip sau turnare de tip în C++. Acest lucru se face pentru a efectua operații matematice asupra variabilelor diferitelor tipuri de date, făcând tipurile de date compatibile între ele. Conversia tipului optimizează codul. Există conversii implicite și explicite de tip în C++. Conversia implicită a tipului este efectuată de compilator însuși folosind un set predefinit de reguli, în timp ce conversia explicită a tipului este efectuată de programator folosind operatori de atribuire și operatori de distribuție.