Jak převést datové typy v C++

Jak Prevest Datove Typy V C



Proces změny datového typu jedné proměnné na jinou se v C++ nazývá převod typu nebo přetypování. To se provádí za účelem provádění matematických operací s proměnnými různých datových typů tím, že jejich datové typy jsou vzájemně kompatibilní. Převod typů optimalizuje kód. Například při výpočtu rozdílu mezi dvěma proměnnými, pokud je jedno číslo typu float a druhé celočíselný datový typ, pak bude datový typ integer převeden na typ float, aby se provedlo odečítání.

Jak převést datové typy v C++

V C++ existují dva způsoby, jak změnit datové typy:

Implicitní převod typu

Podle předdefinovaných pravidel kompilátorem kódu C++ je implicitní převod typu převod typu prováděný kompilátorem automaticky bez požadavku na jakýkoli externí spouštěč ze strany uživatele. Tento typ převodu obvykle probíhá v programu, když existuje více než jeden datový typ a datový typ výrazu neodpovídá datovému typu proměnné zahrnuté v tomto výrazu.







Aby se zabránilo ztrátě dat během převodu, kompilátor ve výchozím nastavení změní datový typ s nízkou přesností na datový typ s vyšší přesností. Například převede celé číslo na plovoucí místo namísto změny plovoucího čísla na celé číslo, aby se zabránilo ztrátě dat. Tomu se říká propagace. Následuje diagram přednosti pro různé typy dat.





Objednávka na typovou konverzi

Správné pořadí pro konverzi typu je uvedeno takto:





bool -- > char -- > krátký int -- > int -- > unsigned int -- > dlouho -- > nepodepsané dlouhé -- > dlouho dlouho -- > plovák -- > dvojitý -- > dlouhý dvojitý

Proměnná typu s nízkou přesností je převedena na typ dat s vysokou přesností, aby se zabránilo ztrátě dat.

Příklad 1

V tomto příkladu se sčítání provádí na proměnné různých datových typů pomocí implicitní konverze typu.



#include
použitím jmenný prostor std ;

int hlavní ( ) {
int číslo = 100 ;
char charakter = 'C' ;
cout << '100 + 'C' = ' << číslo + charakter << endl ;

plovák val = číslo + 'C' ;
cout << 'float val(100 + 'c') = ' << val << endl ;

int byl = 7890 ;
dlouho nebyl = byl ;
cout << 'var_int = ' << nebyl ;
vrátit se 0 ;
}

Zde je přidáno celé číslo a znak z tabulky ASCII a číslo s plovoucí čárkou a znak „c“. Celé číslo je uchováváno ve třetím segmentu jako dlouhý datový typ a datové typy jsou měněny samotným kompilátorem na základě svých předdefinovaných pravidel.

Součet 100 a ‚C‘ vrátí 167, protože ‚C‘ se rovná 67 v číslech a 100+‘c‘ vrátí 199 jako malá písmena ‚c‘ se rovná 99. Proměnná int je uložena v datovém typu long.

Příklad 2

V tomto příkladu je znak D převeden na float, aby se provedla operace dělení.

#include
použitím jmenný prostor std ;

int hlavní ( ) {
char X = 'D' ;

plovák float_var ;

float_var = plovák ( X ) / 'C' ;
// Explicitní převod int na float.

cout << 'Hodnota float_var je: ' << float_var << endl ;

vrátit se 0 ;
}

Vstupní hodnota je ve tvaru znaku D, který je uložen v datovém typu float a dále rozdělen znakem C. Tyto znaky se změní na číselné hodnoty a provede se s nimi operace dělení, která vrátí hodnotu v float.

Explicitní převod typu

Uživatel musí ručně změnit datový typ pomocí explicitní konverze typu C++, často známé jako přetypování. Tento typ odlévání se provádí, aby se zabránilo implicitní konverzi typu. Existují dva způsoby, jak provést Explicit Type Casting v C++:

  • Konverze pomocí operátora přiřazení
  • Konverze pomocí operátora Cast

Zadejte převod pomocí operátoru přiřazení v C++

Konverze typu pomocí operátoru přiřazení se provádí vynuceným způsobem, to znamená, že jeden datový typ je převeden na jiný ručně. Toho se dosáhne pomocí operátoru přiřazení „=“, který přiřadí hodnotu pravého operandu proměnné na její levé straně.

Příklad
Tento program vypočítá plochu kruhu pomocí typového odlitku.

#include
#include
použitím jmenný prostor std ;
int hlavní ( )
{
int poloměr ;
cout <> poloměr ;
plovák plocha = M_PI * poloměr * poloměr ;
cout << 'Oblast kruhu s poloměrem' << poloměr << ' = ' << plocha ;
}

Operátor přiřazení se používá k přiřazení hodnoty float k oblasti, která se skládá z hodnoty poloměru v datovém typu integer.

Oblast kruhu je vrácena v datovém typu float, zatímco poloměr je vložen v datovém typu integer. Datový typ proměnné se tedy změní pomocí přetypování pomocí operátoru přiřazení.

Zadejte převod pomocí operátoru Cast v C++

Konverze typu se provádí pomocí operátoru cast, který nutí jeden datový typ změnit na jiný typ podle potřeb programu.

Existují čtyři různí operátoři Cast:

  • static_cast
  • const_cast
  • dynamické_cast
  • reinterpret_cast

1: static_cast

static_cast je operátor přetypování, který se používá k explicitnímu převodu plovoucích znaků a znaků na celá čísla a tak dále. Toto je nejzákladnější operátor obsazení. Může přetypovat datové typy, které jsou podobné povahy. Umí převádět ukazatele z jedné formy do druhé, takže ji lze použít i pro správu paměti.

Syntax

static_cast ( výraz )

Příklad
Tento program je vytvořen pro převod dvojité proměnné na datový typ int pomocí static_cast. Odřízne jakoukoli desetinnou část ve výstupu.

#include
použitím jmenný prostor std ;
int hlavní ( )
{
// deklarovat proměnnou
dvojnásobek p ;
p = 2,905 * 1,235 * 24,675 ;
plovák výsledek ;

cout << 'Před použitím statického obsazení:' << endl ;
cout << 'Hodnota p =' << p << endl ;

// použijte static_cast k převodu datového typu
výsledek = static_cast ( p ) ;
cout << ' Po použití statického obsazení: ' << endl ;
cout << 'Hodnota výsledku =' << výsledek << endl ;

vrátit se 0 ;
}

Zpočátku je dvojitá proměnná p načtena hodnotami, které se vzájemně vynásobí a uloží do výsledku. Výsledek obsahuje výsledek před a po operátoru static_cast:

Před použitím operátoru static_cast je výsledek zobrazen v desetinných tečkách, zatímco po použití tohoto operátoru je zobrazen v datovém typu integer.

2: const_cast

Operátor const_cast se používá k převodu konstantní hodnoty objektu na nekonstantní typ. Používá se tam, kde je deklarován konstantní objekt a občas potřebujeme změnit jeho hodnotu.

Syntax

const_cast ( výraz )

Příklad
V tomto příkladu se operátor const_cast používá k dočasnému odstranění kvalifikátoru konstanty a umožňuje provádět změny v proměnné podle potřeby:

#include
použitím jmenný prostor std ;
int hlavní ( ) {
konst int X = 70 ;
konst int * a = & X ;
cout << 'Stará hodnota je' << * a << ' \n ' ;
int * S = const_cast ( a ) ;
* S = 90 ;
cout << 'Nová hodnota je' << * a ;
vrátit se 0 ;
}

Kvalifikátor konstanty je přiřazen proměnné int x, což znamená, že tuto proměnnou nelze přímo upravit. Poté se pro přístup k x použije int *y, což je ukazatel, ale stále jej nelze změnit a jeho původní hodnota je zobrazena pomocí cout. Pomocí operátoru const_cast je vytvořen ukazatel z, který je nekonstantní, používá se pro přístup k hodnotě x, takže je upravitelný. Změní hodnotu přiřazenou z s 90, což nepřímo změní hodnotu v x.

Zpočátku je hodnota konstantní proměnné x 70, která je upravena pomocí operátoru const_cast, takže je 90.

3: dynamic_cast

s hierarchií dědičnosti, která je také označována jako typově bezpečná downcast. Přetypování dolů je proces převodu odkazu nebo ukazatele na odvozenou třídu z odkazu na základní třídu nebo ukazatele.

Syntax

dynamic_cast ( výraz )

Příklad
V tomto příkladu se operátor dynamic_cast používá ke kontrole typu polymorfní třídy a umožňuje přístup k základním i odvozeným členům třídy.

#include
#include
použitím jmenný prostor std ;
třída TBase
{
veřejnost :
plovák základ_g = 9,81 ;

virtuální prázdnota figurína ( )
{

} ;
} ;

třída TOdvozeno : veřejnost TBase
{
veřejnost :
int místní_g = 9,78 ;
} ;

int hlavní ( )
{

TBase * základna = Nový TOdvozeno ;
TOdvozeno * odvozený ;

odvozený = dynamické_cast ( základna ) ;

cout < základ_g << endl ;
cout < místní_g << endl ;

getchar ( ) ;
vrátit se 0 ;
}

Dvě třídy jsou definovány jako základní a odvozené třídy. Báze ukazatelů typu TBase* je vytvořena a přiřazena dynamicky alokovanému objektu typu TDerived. V tomto případě polymorfismu lze k ukazateli základní třídy přiřadit objekt odvozené třídy. Dynamic_cast zkontroluje, zda ukazatel přistupuje k platnému objektu TDerived, pokud přetypování získá úspěšný výsledek, odvozená třída získá platný výsledek, jinak vrátí hodnotu null.

4: reinterpret_cast

Reinterpret_cast transformuje ukazatel jednoho datového typu na ukazatel jiného datového typu. Nekontroluje, zda jsou datové typy ukazatelů stejné nebo ne. Tento odlévací operátor je třeba používat a zacházet s ním opatrně.

Příklad
Na tomto obrázku je ukazatel jednoho datového typu reinterpretován na ukazatel jiného datového typu pomocí reinterpret_cast:

#include
použitím jmenný prostor std ;

int hlavní ( )
{
int * q = Nový int ( 70 ) ;
char * ch = reinterpret_cast ( q ) ;
cout << * q << endl ;
cout << * ch << endl ;
cout << q << endl ;
cout << ch << endl ;
vrátit se 0 ;
}

Na začátku je přiřazeno celé číslo s hodnotou 70. Ukazatel q ukazuje na toto dynamicky alokované celé číslo. Reinterpret_cast se používá k reinterpretaci ukazatele q jako ukazatele znaku ch, což znamená, že s pamětí původně přiřazenou q se nyní zachází, jako by to byl znak. Pomocí příkazu cout vytiskne hodnotu přiřazenou q a ch. Vzhledem k tomu, že ch je považováno za znakový ukazatel, vrátí hodnotu znaku.

Vypíše hodnotu ukazující na ch pomocí *ch. Protože se však s ch zachází jako se znakovým ukazatelem, bude tento řádek interpretovat paměť jako znak. Vytiskne adresu paměti uloženou v ukazateli ch pomocí ch. Toto je stejná adresa paměti jako q, protože je to pouze reinterpretace stejné paměti.

Zpočátku se celé číslo ukládá 70. Později se s tím manipuluje mezi ukazatelem q a ukazatelem ch. Výstupy 2 a 4 jsou stejné, protože druhá hodnota je reinterpretována pomocí reinterpret_cast.

Poznámka : Doporučuje se nepoužívat tento operátor přehazování, dokud a pokud to není příliš nutné, protože to z objektu dělá nepřenosný produkt

Závěr

Proces změny datového typu jedné proměnné na jinou se v C++ nazývá převod typu nebo přetypování. To se provádí za účelem provádění matematických operací s proměnnými různých datových typů tím, že jejich datové typy jsou vzájemně kompatibilní. Převod typů optimalizuje kód. V C++ existují implicitní a explicitní převody typů. Implicitní převod typu provádí kompilátor sám pomocí předem definované sady pravidel, zatímco explicitní převod typu provádí programátor pomocí operátorů přiřazení a operátorů přetypování.