====== 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());