type conversions c
Podívejte se na různé převody typů podporované v C ++.
Doufáme, že byste si měli být vědomi všech datových typů, které jsou k dispozici v C ++ z našich dřívějších kurzů. Občas může vzniknout potřeba, že musíme převést jeden typ na jiný. Tomu se říká převod typu nebo odlévání typu.
V tomto kurzu probereme různé převody typů podporované v C ++.
jaký typ testu se používá k ověření, že všechny programy v aplikaci spolupracují správně
=> Klikněte sem a získejte bezplatný kurz C ++.
Co se naučíte:
Zadejte převody
C ++ podporuje dva typy převodů typů:
- Implicitní převod typu: Implicitní převod typu je automatický. U tohoto typu převodu nedochází k žádnému rušení od uživatele a překladač přímo provádí převod. Převod se obvykle provádí, když ve výrazu existuje více než jeden typ dat. Obecně však u tohoto typu převodu existuje možnost ztráty dat, ztráty známek nebo přetečení dat.
- Explicitní převod typu: Explicitní převod typu je definován uživatelem a obvykle se nazývá „odlévání typu“. Zde uživatel vrhá nebo převádí hodnotu jednoho datového typu na jiný v závislosti na požadavcích. Tyto typy konverzí jsou bezpečnější.
Nyní uvidíme oba typy převodu typů podrobně.
Implicitní převod
V implicitní konverzi kompilátor provádí převody z jednoho datového typu na jiný, kdykoli má výraz více než jeden datový typ. Aby se zabránilo ztrátě dat, všechny proměnné ostatních datových typů se převedou na největší datový typ. Tomu se říká propagace.
Pojďme pochopit implicitní převod pomocí příkladu kódu.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Výstup:
10 + 'A' = 75
float val (10 + ‘a’) = 107
var_int = 1000
Výše uvedený příklad kódu ukazuje implicitní převod. Deklarovali jsme celé číslo a znakovou proměnnou s hodnotami 10 a „A“. Když sečteme tyto dvě proměnné, dojde k implicitnímu převodu.
Protože celé číslo je v tomto výrazu větší typ, hodnota znakové proměnné „A“ se převede na její celočíselný ekvivalent, tj. Na hodnotu 65 (hodnota ASCII). Výsledek výrazu je tedy 75.
V dalším výrazu přidáme celé číslo a znak („a“ -> 97) a výsledek přiřadíme floatu. Výsledek výrazu je tedy implicitně převeden na float kompilátorem.
Ve třetím výrazu se krátká int proměnná implicitně převede na celé číslo.
Poznámka : V případě implicitních převodů, pokud kompilátor zjistí potenciální ztrátu dat, může v tomto smyslu blikat varování.
Explicitní převod
Explicitní převod je také známý jako „typ-casting“, protože „vrháme“ jeden datový typ na jiný datový typ. Zde uživatelé explicitně definují casting, na rozdíl od implicitního převodu, kde překladač interně provádí převod.
Explicitní převod můžeme provést dvěma způsoby:
# 1) Použití operátora přiřazení
Explicitní převod nebo vysílání pomocí operátoru přiřazení způsobem se provádí energicky. Zde vrháme nebo převádíme jeden datový typ na jiný datový typ pomocí operátoru přiřazení.
Obecná syntaxe je:
(data type) expression;
Následující příklad to vysvětluje:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Výstup:
Součet = 5563
Comp = 5563,2
Ukázali jsme explicitní casting pomocí operátoru přiřazení ve výše uvedeném příkladu. Nejprve vrhneme proměnný plat typu double na celočíselný typ. Dále vrhneme celočíselnou proměnnou na dvojitý typ.
Jak je znázorněno na výstupu, typ, na který vrháme, označuje konečný typ výsledku výrazu.
To je výhodné, protože uživatel může změnit typ výrazu podle požadavků.
# 2) Používání Cast Operator
V tomto typu odlévání používáme „operátor cast“, který je unárním operátorem pro přechod z jednoho typu na druhý.
Druhy odlévání
Máme následující typy odlévání v závislosti na operátorovi odlévání, který používáme:
# 1) Statické obsazení
Statické přetypování je nejjednodušší ze všech obsadit pomocí operátoru přetypování . Statický cast je schopen provádět všechny převody, které jsou prováděny implicitně. Rovněž provádí převody mezi ukazateli tříd navzájem souvisejících (upcast -> z odvozeného na základnu nebo downcast -> ze základu na odvozený).
Kromě výše uvedených převodů je statické obsazení také schopné převést libovolný ukazatel na void *.
Statický cast je kompilovaný časový cast. To znamená, že za běhu není provedena kontrola, zda je provedené seslání platné nebo ne. Programátor tedy zůstává odpovědností zajistit, aby byla konverze bezpečná a platná.
Jinými slovy, uživatel musí zajistit, aby byl převedený objekt plný s ohledem na cílový datový typ.
Specifikujeme statické obsazení následovně:
static_cast (expression)
Pojďme pochopit statické obsazení pomocí příkladu.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<Ve výše uvedeném příkladu jsme mírně upravili kód tak, aby obsahoval znakovou proměnnou s hodnotou „A“. Pak deklarujeme celočíselný ukazatel a použijeme statické přetypování k převodu znaku na celočíselný ukazatel.
Když kompilujeme tento program, dostaneme následující výstup.
Ve funkci „int main ()“:
10:35: chyba: neplatný static_cast z typu „char *“ na typ „int *“
Program udává chybu pro statické obsazení provedené, protože je neplatné. Statické přetypování tedy umožňuje pouze platné přetypování typu nebo převody a dává chybu, když se pokoušíme provést nějaké nežádoucí přetypování.
# 2) Dynamické obsazení
Dynamic cast je runtime cast prováděný za účelem kontroly platnosti castu. Dynamické obsazení se provádí pouze na ukazatelích a odkazech na třídy. Výraz vrátí hodnotu NULL, pokud přetypování selže.
jaké jsou dobré webové stránky ke sledování anime
Dynamické obsazení používá mechanismus známý jako RTTI (Runtime Type Identification) . RTTI zpřístupňuje všechny informace o datovém typu objektu za běhu a je k dispozici pouze pro třídy, které mají alespoň jednu virtuální funkci (polymorfní typ). RTTI umožňuje určit typ objektu za běhu nebo v době provedení.
Zkusme jeden příklad pochopit dynamické obsazení.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
V tomto programu jsme definovali dvě třídy, základní s virtuální funkcí a odvozené, které mají základní třídu, základní.
V hlavní funkci vytvoříme odvozený objekt třídy, na který ukazuje ukazatel základní třídy. Pak provedeme dynamic_cast na základním ukazateli ukazujícím na odvozenou třídu, abychom ji přenesli na ukazatel odvozené třídy.
Stejně jako v základní třídě je základna polymorfní (obsahuje virtuální funkci), dynamický_cast je úspěšný.
Poznámka: Pokud odstraníme virtuální funkci z výše uvedené třídy, pak dynamic_cast selže, protože informace RTTI pro objekty nebudou k dispozici.
nejlepší program, jak se zbavit virů
Dynamické obsazení má za běhu režii typové bezpečnosti.
# 3) Přeinterpretujte obsazení
Tento typ castu je nejnebezpečnější, protože funguje na jakémkoli typu objektu, aniž by třídy byly navzájem příbuzné.
Reintepret_cast funguje na jakýchkoli ukazatelích a převádí ukazatel libovolného typu na jakýkoli jiný typ bez ohledu na to, zda jsou ukazatele navzájem související nebo ne. Nekontroluje, zda je ukazatel nebo data, na která ukazatel ukazuje, stejná nebo ne.
Operátor přetypování trvá pouze jeden parametr, zdrojový ukazatel, na který se má převést, a nevrací žádnou hodnotu. Jednoduše převede typ ukazatele.
Neměli bychom používat, pokud to není požadováno. Obvykle přepíšeme zdrojový ukazatel na původní typ.
Většinou používáme práci s bity. Když se použije na logické hodnoty, logické hodnoty se převedou na celočíselné hodnoty, tj. 1 pro true a 0 pro false.
Podívejme se na příklad reinterpretovaného obsazení:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
Výstup:
0x3ef3090
na
97
na
Ve výše uvedeném příkladu jsme deklarovali celočíselný ukazatel ptr ukazující na hodnotu 97. Dále deklarujeme znakový ukazatel ch a vrháme na něj ptr pomocí.
Dále vytiskneme různé hodnoty. První, kterou vytiskneme, je ptr, který ukazuje na celé číslo. Proto vytiskne adresu.
Další hodnota ch obsahuje hodnotu 97, a proto vytiskne „a“, což je ekvivalent ASCII 97. Další hodnota „* ptr“ obsahuje hodnotu 97, zatímco „* ch“ obsahuje ASCII ekvivalent 97, tj. „A“ při použití pomocí reinterpret_cast.
# 4) Const Cast
Operátor přetypování se používá ke změně nebo manipulaci s konstantou zdrojového ukazatele. Manipulací myslíme, že to může být buď nastavení constness na non-const ukazatel nebo odebrání constness z const ukazatele.
Podmínkou úspěšného přetypování operátoru je, že ukazatel a zdroj, který je přetypován, by měly být stejného typu.
Vezměme si příklad, abychom tomu porozuměli.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
V tomto příkladu vidíme, že funkce ‚printVal 'přijímá non-const ukazatel. V hlavní funkci máme proměnnou const „value“ přiřazenou ukazateli const ptr.
Abychom tento ukazatel const předali funkci printVal, vrhli jsme ho aplikací, abychom odstranili constness. Pak předáme ukazatel ptr_cast do funkce, abychom získali požadované výsledky.
Závěr
Tímto způsobem zabalíme toto téma převodu typů v C ++. Viděli jsme vše o implicitních a explicitních převodech, které se používají v C ++.
Měli byste si však být vědomi toho, že aby se předešlo ztrátě dat a dalším podobným obtížím, měly by se konverze nebo obsadit rozumně použít pouze v případě, že situace vyžaduje použití.
=> Zde si všimněte výcvikového průvodce pro začátečníky v C ++.
Doporučené čtení
- Nejlepší ZDARMA C # výukové série: Ultimate C # průvodce pro začátečníky
- Zadejte kvalifikátory a třídy úložiště v C ++
- Typy testování migrace: S testovacími scénáři pro každý typ
- Jak se rozhodnout, jaký typ testování je pro projekt vyžadován? - Ruční nebo Automatizace
- Datové typy C ++
- Testování zátěže s výukovými programy HP LoadRunner
- Proměnné v C ++
- Šablony v C ++ s příklady