cpp_is_not_c
Toto je starší verze dokumentu!
Co nepatří do C++
- není správné mixovat C s C++
- všechny základní funkce C jsou nativně v C++ a měli by se používat přednostně
přetypování
- V C se psalo jako
(novy_typ)výraznebonovy_typ(výraz) - kompilátor nenadával, pokud byly typy podobné
- ukázka
int *a; char *c; c = (char*)a;
- V C++ se používá
- dynamic_cast - pouze pro ukazatele na třídy nebo void*
- dynamicky (za běhu) - navíc kontrola při runtime
- upcast - přetypování potomka na rodičovskou třídu
- downcast - přetypování rodičovské na potomka (jen pokud základní třída umí vše co potomek - virtuální metody)
- static_cast - pro ukazatele, enum, číselné typy, ..
- staticky (během kompilace) - může způsobit runtime error, správnost je na programátorovi
- u tříd umožňuje upcast, downcast (základní třída zde nemusí mít vše co potomek)
- nelze ale přetypovat ukazatel na dvě úplně odlišné třídy
- reinterpret_cast - jakýkoliv ukazatel na jakýkoliv, převod čísla na ukazatel, ..
- neprovadí se kontroly, hodnota se prostě zkopíruje
- const_cast - přetypování const na ne-const typ
- například pokud víme, že budeme jen číst, ale proměnnou nemáme const
- navíc ještě pomocný
typeid, pro porovnávání typů
buffer a struktury
- v C se na řetězce používaly pole znaků, C++ má pohodlný
string - jak ale v C++ udělat buffer, do kterého bychom mohli namapovat například strukturu?
- místo pole znaků by se měl používat
vector<char>
struct record { int age; int height; } vector<char> buffer(sizeof(struct record)); struct record *r = reinterpret_cast<struct record*>(buffer.data());
cpp_is_not_c.1462958226.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
