Uživatelské nástroje

Nástroje pro tento web


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ýraz nebo novy_typ(výraz)
  • kompilátor nenadával, pokud byly typy podobné
  • ukázka
int *a;
char *c;
 
c = (char*)a;
    • 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.1462958270.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki