type conversions c
Vyskúšajte rôzne konverzie typov podporované v C ++.
Dúfame, že by ste mali poznať všetky dátové typy, ktoré sú k dispozícii v jazyku C ++ z našich predchádzajúcich tutoriálov. Občas môže vzniknúť potreba, že musíme previesť jeden typ na druhý. Toto sa nazýva typová konverzia alebo casting.
V tomto výučbe sa budeme zaoberať rôznymi typmi konverzií podporovaných v C ++.
webové stránky na pozeranie anime zadarmo v angličtine
=> Kliknutím sem získate bezplatný kurz C ++.
Čo sa dozviete:
Konverzie typu
C ++ podporuje dva typy prevodov typov:
- Implicitná konverzia typu: Implicitná konverzia typu je automatická. Pri tomto type prevodu nedochádza k nijakému rušeniu zo strany používateľa a prekladač priamo uskutočňuje prevod. Konverzia sa zvyčajne vykonáva, keď vo výraze existuje viac ako jeden typ údajov. Všeobecne však pri tomto type konverzie existuje možnosť straty údajov, straty znakov alebo pretečenia údajov.
- Explicitná konverzia typu: Explicitná konverzia typu je definovaná používateľom a zvyčajne sa nazýva „casting typu“. Tu používateľ vrhá alebo prevádza hodnotu jedného dátového typu na druhý v závislosti od požiadaviek. Tieto typy konverzií sú bezpečnejšie.
Teraz uvidíme podrobne oba typy prevodu typov.
Implicitná konverzia
Pri implicitnej konverzii kompilátor vykonáva prevody z jedného dátového typu na druhý, kedykoľvek má výraz viac ako jeden dátový typ. Aby sa zabránilo strate údajov, všetky premenné ostatných dátových typov sa prevádzajú na najväčší dátový typ. Tomu sa hovorí propagácia.
Poďme pochopiť implicitnú konverziu pomocou príkladu kódu.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Výkon:
10 + 'A' = 75
float val (10 + ‘a‘) = 107
var_int = 1 000
Vyššie uvedený príklad kódu demonštruje implicitnú konverziu. Deklarovali sme celé číslo a znakovú premennú s hodnotami 10 a „A“. Keď tieto dve premenné spočítame, dôjde k implicitnej konverzii.
Pretože celé číslo je v tomto výraze väčším typom, hodnota znakovej premennej „A“ sa prevedie na jej celočíselný ekvivalent, t. J. Hodnotu 65 (hodnota ASCII). Výsledkom výrazu je teda 75.
V nasledujúcom výraze pridáme celé číslo a znak („a“ -> 97) a výsledok potom priradíme float. Výsledok výrazu je teda kompilátorom implicitne prevedený na float.
V treťom výraze sa premenná short int implicitne prevedie na celé číslo.
Poznámka : V prípade implicitných prevodov, ak kompilátor zistí potenciálnu stratu údajov, môže na tento účel vydať varovanie.
Explicitná konverzia
Explicitná konverzia sa nazýva aj „casting“, keď „prenášame“ jeden dátový typ do druhého. Tu používatelia výslovne definujú casting, na rozdiel od implicitnej konverzie, keď prevod interne vykonáva kompilátor.
Explicitnú konverziu môžeme vykonať dvoma spôsobmi:
# 1) Používanie operátora priradenia
Explicitná konverzia alebo obsadenie pomocou operátora priradenia spôsobom sa vykonáva dôrazne. Tu pomocou operátora priradenia prenesieme alebo prevedieme jeden údajový typ na iný údajový typ.
Všeobecná syntax je:
(data type) expression;
Nasledujúci príklad to vysvetľuje:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Výkon:
Súčet = 5563
Comp = 5563,2
Vo vyššie uvedenom príklade sme si ukázali explicitné obsadenie pomocou operátora priradenia. Najskôr premeníme variabilný plat typu double na celočíselný typ. Ďalej vrhneme celočíselnú premennú sumu na dvojitý typ.
Ako je znázornené na výstupe, typ, ktorý prenášame, označuje konečný typ výsledku výrazu.
To je výhodné, pretože používateľ môže podľa požiadaviek meniť typ výrazu.
# 2) Používanie Cast Operator
Pri tomto type odlievania používame „cast operator“, čo je unárny operátor na prechod z jedného typu na druhý.
Druhy odlievania
V závislosti od používaného operátora castingu máme nasledujúce typy odlievania:
# 1) Statické obsadenie
Statické obsadenie je najjednoduchšie spomedzi všetkých obsadení pomocou operátora obsadenia . Statické obsadenie je schopné vykonať všetky konverzie, ktoré sa vykonávajú implicitne. Vykonáva tiež konverzie medzi ukazovateľmi tried, ktoré navzájom súvisia (upcast -> z odvodenej na základňu alebo downcast -> zo základne na odvodenú).
Okrem vyššie uvedených konverzií je statické obsadenie tiež schopné previesť akýkoľvek ukazovateľ na void *.
Statické obsadenie je zostavené časové obsadenie. To znamená, že za behu nie je vykonaná žiadna kontrola, či je prevedené obsadenie platné alebo nie. Zostáva teda zodpovednosťou programátora zaistiť, aby bola konverzia bezpečná a platná.
Inými slovami, používateľ musí zabezpečiť, aby bol prevádzaný objekt plný vzhľadom na cieľový dátový typ.
Statické obsadenie určujeme nasledovne:
čo je testovanie integrácie s príkladom
static_cast (expression)
Poďme pochopiť Statické obsadenie pomocou príkladu.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<Vo vyššie uvedenom príklade sme mierne upravili kód tak, aby obsahoval premennú znaku s hodnotou „A“. Potom deklarujeme celočíselný ukazovateľ a pomocou statického obsadenia prevedieme znak na celočíselný ukazovateľ.
Keď zostavíme tento program, dostaneme nasledujúci výstup.
Vo funkcii „int main ()“:
10:35: chyba: neplatný static_cast z typu „char *“ na typ „int *“
Program dáva chybu vykonanému statickému obsadeniu, pretože je neplatný. Statický prenos teda umožňuje iba platné prenášanie alebo konverzie typov a pri pokusoch o nejaké nežiaduce obsadenie typu dáva chybu.
# 2) Dynamické obsadenie
Dynamické obsadenie je prevádzkové obsadenie, ktoré sa vykonáva na kontrolu platnosti obsadenia. Dynamické obsadenie sa vykonáva iba na ukazovateľoch a odkazoch triedy. Ak vracanie zlyhá, výraz vráti hodnotu NULL.
Dynamické obsadenie využíva mechanizmus známy ako RTTI (Runtime Type Identification) . RTTI sprístupňuje všetky informácie o dátovom type objektu za behu a je k dispozícii iba pre triedy, ktoré majú aspoň jednu virtuálnu funkciu (polymorfný typ). RTTI umožňuje určiť typ objektu za behu alebo v čase vykonania.
Vyskúšajme jeden príklad na pochopenie dynamického obsadenia.
#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 programe sme definovali dve triedy, základňu s virtuálnou funkciou a odvodenú so základnou triedou, základňou.
V hlavnej funkcii vytvoríme odvodený objekt triedy, na ktorý ukazuje ukazovateľ základnej triedy. Potom vykonáme dynamic_cast na základnom ukazovateli ukazujúcom na odvodenú triedu, aby sme ju odovzdali ukazovateľovi odvodenej triedy.
Rovnako ako v základnej triede je základ polymorfný (obsahuje virtuálnu funkciu), dynamický_cast je úspešný.
Poznámka: Ak odstránime virtuálnu funkciu z vyššie uvedenej triedy, potom dynamic_cast zlyhá, pretože RTTI informácie o objektoch nebudú k dispozícii.
Dynamické obsadenie má za behu réžiu typovej bezpečnosti.
# 3) Znova interpretujte obsadenie
Tento typ castu je najnebezpečnejší na použitie, pretože funguje na akomkoľvek type objektu bez toho, aby triedy boli navzájom spojené.
Reintepret_cast funguje na ľubovoľných ukazovateľoch a prevádza ukazovateľ ľubovoľného typu na akýkoľvek iný typ bez ohľadu na to, či ukazovatele navzájom súvisia alebo nie. Nekontroluje, či je ukazovateľ alebo údaje, na ktoré ukazovateľ smeruje, rovnaké alebo nie.
Operátor cast má iba jeden parameter, zdrojový ukazovateľ, na ktorý sa má konvertovať, a nevráti žiadnu hodnotu. Jednoducho prevádza typ ukazovateľa.
Nemali by sme používať, pokiaľ to nie je potrebné. Ukazovateľ zdroja zvyčajne prepisujeme na pôvodný typ.
Väčšinou pracujeme s bitmi. Ak sa použije na logické hodnoty, logické hodnoty sa prevedú na celočíselné hodnoty, t. J. 1 pre true a 0 pre false.
Pozrime sa na príklad reinterpretovaného obsadenia:
#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ýkon:
0x3ef3090
do
97
do
Vo vyššie uvedenom príklade sme deklarovali celočíselný ukazovateľ ptr ukazujúci na hodnotu 97. Ďalej deklarujeme znakový ukazovateľ ch a vrháme naň ptr pomocou.
Ďalej tlačíme rôzne hodnoty. Prvý, ktorý tlačíme, je ptr, ktorý ukazuje na celé číslo. Preto vytlačí adresu.
Ďalšia hodnota ch obsahuje hodnotu 97, a teda vytlačí znak „a“, ktorý je ekvivalentom ASCII 97. Ďalšia hodnota „* ptr“ má hodnotu 97, zatiaľ čo „* ch“ obsahuje ekvivalent ASCII 97, tj. reinterpret_cast.
# 4) Const Cast
Operátor cast sa používa na zmenu alebo manipuláciu s konštantou ukazovateľa zdroja. Manipuláciou máme na mysli, že môže ísť buď o nastavenie konštancie na ukazovateľ, ktorý nie je konštantný, alebo o odstránenie konštanty z ukazovateľa konštánt.
Podmienkou úspešného odovzdania operátora je, že ukazovateľ a zdroj, ktorý sa odovzdá, by mali byť rovnakého typu.
Vezmime si príklad, aby sme tomu porozumeli.
#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 príklade vidíme, že funkcia ‘printVal’ prijíma non-const ukazovateľ. V hlavnej funkcii máme konštantnej premennej „value“ priradenej k ukazovateľu const ptr.
Aby sme tento ukazovateľ const odovzdali funkcii printVal, vrhneme ho aplikáciou za účelom odstránenia konštanty. Potom odovzdáme funkcii ukazovateľ ptr_cast, aby sme dosiahli požadované výsledky.
Záver
Týmto zhrnieme túto tému prevodu typov v C ++. Videli sme všetko o implicitných a explicitných prevodoch, ktoré sa používajú v C ++.
Mali by ste si však uvedomiť, že aby sa zabránilo strate údajov a iným podobným ťažkostiam, konverzie alebo obsadenie by sa mali rozumne uplatňovať, iba ak si to situácia vyžaduje.
=> Tu si pozrite pozorne na Sprievodcu školením pre C ++.
najlepší softvér na kopírovanie DVD na pevný disk
Odporúčané čítanie
- Najlepšia výučbová séria C # ZDARMA: Sprievodca C # pre začiatočníkov
- Zadajte kvalifikátory a triedy úložiska v C ++
- Typy testovania migrácie: S testovacími scenármi pre každý typ
- Ako rozhodnúť, ktorý typ testovania sa vyžaduje pre projekt? - Manuálne alebo automatizované
- Dátové typy C ++
- Testovanie záťaže s výukovými programami HP LoadRunner
- Premenné v C ++
- Šablóny v C ++ s príkladmi