====== 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ýraz'' nebo ''novy_typ(výraz)'' * kompilátor nenadával, pokud byly typy podobné * ukázka int *a; char *c; c = (char*)a; * V C++ [[http://www.cplusplus.com/doc/tutorial/typecasting/|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'' struct record { int age; int height; } vector buffer(sizeof(struct record)); struct record *r = reinterpret_cast(buffer.data());