Kombinace C++ a.net jak a proč
|
|
- Jozef Černý
- před 7 lety
- Počet zobrazení:
Transkript
1 Kombinace C++ a.net jak a proč Aleš Keprt Katedra informatiky, Přírodovědecká fakulta, Univerzita Palackého Tomkova 40, Olomouc, Česká Republika Ales.Keprt@upol.cz Abstrakt. Před příchodem platformy.net bylo ve Windows primárním programovacím jazykem C++, v rámci.netu se však používá především nový jazyk C#. Cílem tohoto příspěvku je vysvětlení, jak lze programovat v jazyku C++ na platformě.net a také diskuze o tom, k čemu je vlastně dobré, když naučíme starého psa novým kouskům. Příspěvek se zaměřuje na variantu jazyka zvanou C++/CLI, která je nyní preferovaná pro programování v C++ v rámci.netu. Klíčová slova: C++,.NET, programování, Windows 1 Úvod do C++/CLI Úvodem se krátce zastavme u samotného názvu jazyka. C++/CLI označuje úpravu jazyka C++ pro použití v rámci Microsoft.NET Frameworku. Samotný.NET Framework je přitom pouze jednou z implementací obecného standardu Common Language Infrastructure, odtud tedy pochází ona tří písmena CLI v názvu jazyka. Přitom, ačkoliv jazyk je pojmenován obecně, jeho v současnosti zřejmě jedinou implementací je Microsoft Visual C Základem jazyka je standardní C++, odpovídající zhruba ISO standardu, doplněné o celou řadu sémantických i syntaktických prvků sloužících k překlenutí sémantické mezery mezi programovým modelem CLI a nativními programy. Nejviditelnějším a také nejčastěji jmenovaným rozdílem je automatická správa paměti v rámci CLI zatímco v C++ bývá zvykem uvolňovat paměť operátory delete a delete[], CLI zajišťuje správu paměti automaticky. Ještě podstatnější rozdíly však najdeme při hlubším prozkoumání. Základem CLI je CTS (Common Type System společný typový systém) definující společné základní datové typy, CLS (Common Language Specification) definující pravidla, která musí dodržet vnější rozhraní kódu v každém jazyku, aby mohl být kombinován s kódem napsaným v jiném jazyku, a běhové prostředí CLR (Common Language Runtime), které se stará o vlastní vykonávání kódu. Zatímco C++ překládá kód (obvykle přes Assembler) do nativního kódu pro určitý mikroprocesor, C++/CLI se překládá do mezijazyka CIL (Common Intermediate Language, také známo jako MSIL Microsoft Intermediate Language nebo jen zkráceně IL), ze kterého se nativní kód vytváří až po spuštění daného programu. Kód v mezijazyku má tu výhodu, že může být přeložen do
2 různých nativních tvarů, podle použitého počítače; CLI přitom klade velký důraz hlavně na bezpečnost, proto taky ani není možno programy přímo překládat do nativního tvaru. Naopak, kód v mezijazyku může být podroben verifikaci ověření bezpečnosti. Z hlediska typové bezpečnosti je u C++ principiální problém pointery. CLI umožňuje označit kód jako bezpečný nebo nebezpečný. Zatímco se C#, Visual Basic.NET nebo jiné moderní jazyky orientují především na bezpečný kód a nebezpečný kód v nich lze psát jen s pomocí speciálních konstrukcí, nebo vůbec, v C++/CLI máme z principu otevřené možnosti kombinovat klasický programovací styl C++ (s pointery) a bezpečné programování ve stylu CLI (čili.netu). Co zbylo z ISO C++ Co nám zde tedy zbylo z ISO C++? Základem C++/CLI je kompletní funkcionalita jazyka C++ na úrovni překladače Microsoftu (Visual C++), je možno vkládat dokonce i inline Assembler. Překladač jazyka podporuje bezpečný, nebezpečný i nativní kód. Z toho důvodu je C++/CLI také vhodným jazykem pro situace, kdy chceme převést existující projekt na.net, ale přitom vlastně nechceme přepisovat existující zdrojové kódy. To je obvyklé u větších projektů obsahujících jistou hloubku kódu, kde do.netu převedeme jen povrchové části kódu. (Hloubka kódu je rozsah výpočetních částí programu, které jsou napsány přímo v C++ bez použití nějakých knihoven pro spolupráci s vnějším prostředím. Například informační systémy mají obvykle naprosto minimální hloubku, naopak software pro vědeckotechnické výpočty má hloubku velkou. Termín povrchová část kódu označuje jeho vnější rozhraní, čili uživatelské rozhraní, rozhraní pro práci s databází apod.) Oblasti nasazení C++/CLI Ačkoliv je C++/CLI na první pohled jakými zbytečným jazykem, který jen dubluje jazyk C#, existuje několik oblastí, kde má C++/CLI oproti svému protějšku jednoznačně navrch. Hodí se především tam, kde potřebujeme rozsáhlou součinnost mezi řízeným a nativním kódem. Také je vhodný pro převod existujícího kódu z C++ do C#, neboť umožňuje používat mnoho konstrukcí C++, které v jazyku C# nemají svůj ekvivalent. Dále je samozřejmě vhodný pro programátory, kteří umějí velmi dobře C++ a jazyk C# se ani nechtějí učit. Jazyk C++/CLI zároveň nahrazuje dřívější Managed C++ jazyk vzniklý za stejným účelem, ovšem s mnohem menším úspěchem. V neposlední řadě je C++/CLI doporučován také pro tvorbu systémových služeb, což zde jde daleko snáze než s pomocí C++ a knihovny ATL. 2 Nové prvky jazyka C++/CLI Jazyk C++/CLI rozhodně nepatří k nejjednodušším, spíše naopak. K jeho pochopení je nutno rozumět samotnému C++, platformě.net a také implementaci 2
3 C++ do CLI. Nejlepším výchozím bodem pro studium C++/CLI je znalost a praxe s ISO C++ a programování na platformě.net v jazyce C#. Z tohoto bodu také vychází následující text, tj. předpokládáme znalost jak jazyka C++, tak platformy.net s jazykem C#. Výklad C++/CLI pak lze provést formou popisu změn oproti C++ a C#. Hello World Na úvod je vhodné ukázat Hello World aplikaci pro srovnání nejprve v jazyku C#: using System; class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); a nyní v jazyku C++/CLI: using namespace System; int main(array<string^> ^args) { Console::WriteLine("Hello World"); return 0; Na tomto příkladu vidíme několik základních rozdílů mezi těmito dvěma jazyky: C++/CLI používá nový operátor ^ k označení řízených referencí (namísto běžných pointerů *), operátor :: k přístupu do složek tříd a prostorů jmen (namísto tečky v C#) a poněkud složitější syntaxi řízených polí (neboť [] je vyhrazeno pro klasická neřízená pole). Funkce main() také standardně vrací typ int, zatímco v jazyku C# toto není. Kontextová klíčová slova Autoři C++/CLI přišli se zajímavým řešením, jak rozšířit jazyk o nová klíčová slova a zároveň neomezit použití těchto slov pro identifikátory (názvy proměnných apod.). Nová klíčová slova jsou tedy kontextově závislá, čili jsou platná jen v určitém kontextu, navíc jsou vesměs řešena jako doplňující slova k stávajícím klíčovým slovům (která slouží právě k identifikaci kontextu platnosti nových klíčových slov). Například value class jsou dvě klíčová slova, pokud stojí vedle sebe, přitom lze zakládat i proměnné (nebo jiné entity) jménem value. Tuto vlastnost oceníme především při převodu staršího kódu, který může některá nyní klíčová slova používat jako identifikátory (například právě slovo value se v názvech vyskytuje běžně). Obecně se tedy nová klíčová slova zapisují před nebo za stávající, nebo do jiných míst v kódu, která lze kontextově jednoznačně identifikovat. Konkrétní případy budou popsány dále v textu. 3
4 Práce s řízenými typy C++/CLI umožňuje používat klasické datové typy se vším všudy, ty označujeme jako nativní či neřízené, a dále řízené typy v rámci CLI, které mají automatickou správu paměti a sadu zvláštních klíčových slov a operátorů, které s nimi pracují. Všechny typy je možno v kódu libovolně kombinovat. Kód používající nativními typy může někdy běžet rychleji, záleží však na konkrétním algoritmu a nevýhodou je zde nebezpečí paměťových chyb, které je často obtížné odhalit. Příkladem řízeného typu je String (System::String). C++/CLI automaticky typuje textové literály (jako Hello World ) jako const char*, const wchar t* nebo String. Používá přitom typovou inferenci, čili podle toho, kam se literál přiřazuje, takový má typ. Explicitně lze typ ovlivnit použitím prefixu L jako v C++ (wchar t*) nebo prefixem (String^). V obou případech, ačkoliv ten druhý syntakticky odpovídá přetypování, je přímo vytvořen literál daného typu, ke zbytečným přetypování tedy nedochází. Vytvoření a použití vlastních typů vysvětlíme nejlépe na příkladě: ref class RefTyp { public: int i; ; value class ValTyp { public: int i; ; enum class Typ3 { Jaro, Léto, Podzim, Zima, ; int main(array<string^> ^args) { RefTyp ^a = gcnew RefTyp; ValTyp b; ValTyp ^c = gcnew ValTyp; a->i = 1; b.i = 2; c->i = 3; Console::WriteLine(Typ3::Jaro); return 0; Na konci deklarace typu se píše středník. Místo class lze psát také struct, výchozí přístup pak bude public. Hodnoty řízených výčtových typů jsou kontextové, čili narozdíl od C++ zde nejde o globální konstanty (viz příklad použití na konci programu). 4
5 Deklarace řízených referenčních a hodnotových typů se provádí přidáním prefixu ref nebo value. Jak je vidět v ukázce použití, instance referenčních typů se vytvářejí operátorem gcnew (proměnná a), zatímco hodnotové typy jsou deklarovány přímo (proměnná b je na zásobníku v rámci funkce). Proměnná c zde vyjadřuje referenci na hodnotový typ, což je vnitřně implementováno boxováním na řízené haldě je tedy boxovaná hodnota a při každé změně je třeba vytvořit novou instanci a boxovat ji, proto je tento způsob používání řízených hodnotových typů značně neefektivní. Namísto klasických pointerových hvězdiček se u řízených referenčních typů používá nová značka (operátor) ^ a místo o pointerech hovoříme o handlech (anglicky handle česky držátko/rukojeť, obvykle ale nazýváno lidovým označením handl ). Pro přístup k součástem tříd, nutno dodat bohužel, musíme použít operátor -> a u statických součástí, opět bohužel, ::. A aby to nebylo tak jednoduché, u řízených hodnotových typů na zásobníku je nutno používat operátor tečka. Při záměně těchto operátorů nás překladač na chybu upozorní (což ovšem také dokazuje, že by stačil jeden operátor nejlépe klasická tečka, neboť z kontextu vždy lze jasně poznat význam). V tomto směru tedy C++/CLI kráčí ve šlépějích C++ a vlastně úplně zbytečně ještě přidává na jeho syntaktické nesrozumitelnosti. (Operátory :: a -> by zde mohly být nahrazeny tečkou.) Řízené typy mají oproti nativním ještě dvě důležitá omezení: Nelze z nich zakládat globální proměnné, ani pomocí handlů, a není podporována vícenásobná dědičnost. Důvod prvního omezení je poněkud nejasný, zvláště když nativní C++ globální proměnné podporuje. Druhé omezení pramení ze standardu CLI, který vícenásobnou dědičnost nepodporuje. Null a boxování Zatímco jazyk C nevhodně definoval bezkontextovou konstantu NULL, i když umožňoval přiřazovat číslo 0 do pointerových proměnných, a jazyk C++ používá pro tento účel přímo číslo 0 (i když mnozí programátoři stále nevhodně používají NULL z jazyka C), v C++/CLI jsme nuceni rozlišovat null u řízených a nativních typů. Zatímco u nativních typů je vše jako v C++, do řízených typů nelze přiřazovat číslo 0. Namísto toho musíme použít klíčové slovo nullptr. Přiřazení čísla 0 je zvlášť nebezpečné v následujícím případě: object ^o = 0; Tento kód totiž do proměnné o přiřadí boxované číslo 0 typu Int32. Důvodem je to, že C++/CLI podporuje implicitní boxování hodnotových proměnných. Zpětný unboxing je explicitní, takže obojí se chová stejně jako v C#. Rozdíl oproti jazyku C# je ale v tom, že C++/CLI umožňuje kromě boxování pomocí proměnné typu object^ vytvářet také silně typované boxované proměnné, viz proměnnou c výše. Tuto konstrukci jazyk C# nezná. Předávání parametrů hodnotou a odkazem CTS podporuje dva typy předávání parametrů metodám: hodnotou (kopií) a odkazem (referencí). C++/CLI se v tomto směru chová stejně jako C#: Výchozí 5
6 je předávání parametrů hodnotou a chceme-li nějaký předat odkazem, explicitně jej označíme. C++/CLI k tomu používá nový unární operátor %, jehož použití je principiálně stejné jako u nativního operátoru & (který také slouží k předávání parametrů odkazem), operátor % však slouží pro řízené typy, v jazyku C# mu odpovídá prefix ref. Narozdíl od C# zde však při volání metody nemusíme znovu označovat předávané argumenty, překladač sám ví, že je má předávat odkazem. Čili zde je syntaxe C++/CLI oproti C# poněkud příjemnější. Aby nedošlo k omylu, ještě připomeňme, že je velký rozdíl mezi referenční proměnnou předanou hodnotou a odkazem. V obou případech používáme stejný termín reference neboli odkaz, jenže zatímco v prvním případě je řeč o proměnné typu reference na objekt a předáváme hodnotou jen onu referenci (zatímco objekt nepředáváme), ve druhém případě předáváme referenci na onu proměnnou. U referenční proměnné tedy můžeme předat onu proměnnou, tedy referenci, nebo odkaz na onu proměnnou, tedy referenci na referenci. Podobně při předávání hodnotové proměnné hodnotou se předává (kopíruje) celý objekt a při předávání hodnotové proměnné referencí se předává odkaz na původní hodnotovou proměnnou. Jelikož referenční parametry a referenční proměnné nejsou tímtéž, C++/CLI pro jejich rozlišení používá dva různé operátory % a ^. Modifikátory přístupu Kromě základních modifikátorů public/protected/private, které jsou syntakticky i sémanticky stejné jako v C++, můžeme použít ještě další modifikátory k nastavení viditelnosti mezi různými seskupeními (assembly) v rámci CLI. Seznam modifikátorů a jejich vysvětlení je v tabulce 1. modifikátor Tabulka 1. Modifikátory přístupu přístup uvnitř assembly mimo assembly public public public private private private protected protected protected internal public private protected public public protected private protected protected private Při dědění v rámci řízených typů se za dvojtečku již nepíše modifikátor přístupu, narozdíl od C++ je zde automaticky přístup public a nelze jej změnit. Toto chování odpovídá jak standardu CLI, tak i obvyklému postupu při psaní kódu v C++, kde public ve většině případů stejně ručně dopisujeme. 6
7 Sémantika destrukce objektů Nativní typy jsou ukončovány stejně jako v C++, tedy operátorem delete nebo delete[]. Doba života řízených typů je automaticky řízena systémem. Toto se však týká pouze paměti, zatímco při používání systémových zdrojů nebo jakýchkoliv jiných neřízených součástí je třeba zajistit správné uvolnění všech prostředků. Zde se sémantika C++/CLI liší jak od C++, tak od C#. Deklarujeme-li klasický vlnovkový destruktor v řízené třídě, tento je nativně přeložen do metody Dispose(), přitom je automaticky implementováno rozhraní System::IDisposable. Tento destruktor můžeme explicitně volat pomocí klasické konstrukce ~Typ(). Dealokační scénář by měl odpovídat doporučením CLI, čili je třeba deklarovat také finalizer (což mimochodem odpovídá destruktoru v jazyce C#). Finalizer je deklarován podobně jako destruktor, ale s uvedením vykřičníku místo vlnovky před názvem typu. Následuje ukázka doporučeného řešení. ref class FinClass { //destruktor - ukončuje řízené zdroje a volá finalizer ~FinClass() {... this->!finclass(); //finalizer - ukončuje neřízené zdroje!finclass() {... ; Na konci destruktoru tedy voláme vlastní finalizer (Pozor! Je nutno jej volat odkazem přes this.), překladač sám doplní kód zajišťující, aby se po zavolání destruktoru finalizer již nevolal (toto ošetření v C# musíme udělat ručně). Na tomto místě je vidět, že C++/CLI je novější než C# a jeho autoři se poučili z chyb v návrhu jazyka C#. Koncept destrukce objektů v C++/CLI je totiž jednoznačně lepší a jako takový by se jistě hodil i do příští verze jazyka C#. Základní koncepční rozdíl lze popsat takto: C# vznikl v době kdy mezi odborníky převládalo přesvědčení, že správný princip zní garbage collector místo destruktoru. O několik let novější jazyk C++/CLI již funguje na principu garbage collector a destruktor a praxe ukazuje, že tento model správy paměti je lepší. S modelem destrukce souvisí i možnost používat hodnotové proměnné řízených referenčních typů, které můžeme vytvořit jak v rámci metody, tak v rámci jiné třídy. Příklad následuje. ref class A {... ; ref class B { 7
8 ... A a; //lokální instance typu A ; void Metoda() { A a; //lokální instance typu A B b; //lokální instance typu B C++/CLI u těchto proměnných zajišťuje automatické volání destruktorů v okamžiku ukončení nadřazeného bloku kódu či objektu. I tento prvek jde za hranice C#, C++/CLI je zřejmě dokonce prvním jazykem umožňujícím tento pohodlný způsob instanciace a řízené destrukce objektů referenčních typů. V jazyku C# lze toto pouze částečně nahradit blokovým příkazem using. Míchání typů Nativní a řízené typy lze míchat jen velmi omezeně, nativní typ totiž nemůže obsahovat řízenou referenci (handl) a naopak řízený typ nemůže obsahovat nativní instanci. Řízené typy mohou obsahovat pouze pointery na neřízené typy; vytvoření a ukončení nativních objektů pak musíme pečlivě ošetřit v konstruktoru, destruktoru a finalizeru řízené třídy. Hodnotové řízené typy, které neobsahují žádné řízené reference, sémanticky splývají s nativními typy, proto je lze umístit uvnitř neřízeného typu i kdekoliv jinde v neřízené oblasti paměti. Příkladem takového typu je výše uvedený Val- Typ. Naopak následující příklad ukazuje řízený hodnotový typ, který do neřízené paměti umístit nelze. value class ValTyp2 { public: int i; RefTyp ^r; ; Vestavěné datové typy Podobně jako C#, také C++/CLI umožňuje kombinovat vlastní typy (int, char, apod.) a typy CTS (System::Int32, System::Char, apod.). Stejně jako u řetězcových literálů, také číselné literály je možno volně přiřazovat do nativních i řízených číselných typů s využitím typové inference. Zde je pouze třeba pamatovat na to, že některé typy se mapují na typy jiných názvů, vybrané odlišnosti ukazuje tabulka 2. Modifikátory proměnných Kromě modifikátorů přístupu (neboli viditelnosti) lze u proměnných řízených typů použít ještě některé další modifikátory. 8
9 Tabulka 2. Mapování vybraných datových typů Nativní typ Řízený typ int Int32 char SByte short Int16 long Int32 long long Int64 wchar t Char float Single double Double const označuje proměnnou, jež nelze měnit. Při použití u parametrů metod se chová se stejně jako v C++, čili jde o omezení, které pouze vynucuje překladač. Je-li například vstupní parametr funkce označen jako const, lze jej po vhodném přetypování změnit (za předpokladu, že argumentem je proměnná). Tento modifikátor v C# neexistuje. (C# označení const jazyka C++/CLI nezná, takže jej ignoruje.) literal označuje literál, tedy konstantu vkládanou přímo na místa použití. Literály jsou uloženy pouze v metadatech a nezvětšují velikost objektů dané třídy. Odpovídá označení const v C# a v některých případech také const v C++ (tam, kde C++ vytváří literály). initonly označuje proměnnou, kterou je možno nastavit jen v konstruktoru a dále je jen pro čtení. Toto odpovídá modifikátoru readonly v jazyce C#. unsigned označuje neznaménkovou proměnnou. Chová se stejně jako v C++. Z popisu je vidět, že označení const, literal a initonly všechny znamenají přibližně totéž a připomínají označení const v jazyce C++. Modifikátory literal a initonly definují jasnější a typově bezpečný způsob chování proměnných, zatímco const je anachronizmus z jazyka C++. Modifikátory tříd U řízených i nativních tříd lze kromě modifikátorů přístupu použít ještě tyto další modifikátory: abstract označuje abstraktní třídu. sealed označuje třídu, kterou nelze dědit. Zvláštností je, že tyto modifikátory se píší za název třídy (nikoli před něj, jak bychom mohli čekat jedná se o speciální kontextová klíčová slova). Výjimky Narozdíl od C++, kde bylo z principu nemožné využívat výjimky ke zcela čistému a bezpečnému zachycení a ošetření chyb, C++/CLI nabízí stejnou funkcionalitu jako C#. Výjimky tedy mohou být nativních i řízených typů a nově je možno používat i blok finally, který je významově stejný jako v C#. 9
10 Statický konstruktor Řízené třídy mohou mít statický konstruktor. Ten je zavolán vždy až těsně před prvním použitím třídy, takže je například možné volat z něj Console::WriteLine() apod. Toto je jistě zajímavý nový prvek oproti C++. U nativních tříd statický konstruktor podporován není. Příkaz for each Nově máme k dispozici příkaz for each (vznikl doplněním kontextového klíčového slova each za klíčové slovo for). Až na mezeru v názvu je použití syntakticky i sémanticky podobné jako v jazyku C#. Příkaz for each je přitom použitelný nejen na řízené objekty implementující rozhraní IEnumerable, ale také na nativní kolekce STL. To je jistě zajímavá novinka. Šablony a generiky C++/CLI umožňuje používat jak generiky z CLI, tak klasické šablony z C++. Klasické šablony přitom lze používat i pro řízené typy, kvůli odlišným operátorům pro nativní a řízenou referenci (* a %) je však někdy třeba napsat dvě úplně stejné deklarace šablony, jednou s operátorem * a podruhé s operátorem %. I přes tuto nepříjemnost je to však další místo, kde C++/CLI předčí jazyk C#. Pro příklad uveďme šablonu funkce na záměnu hodnot dvou proměnných první verze funguje pro nativní typy a také pro řízené hodnotové typy: template <typename T> void swap(t &a, T &b) { T c = a; a = b; b = c; Druhá verze funguje pro všechny nativní i řízené typy; u řízených referenčních typů je ale nutno mít definované příslušné operátory (copy konstruktor a přiřazovací operátor): template <typename T> void swap(t %a, T %b) { T c = a; a = b; b = c; Podobně můžeme definovat i generiku, kterou navíc můžeme poskytovat jako veřejnou součást seskupení (generiky však fungují jen pro řízené typy): 10
11 generic <typename T> void swap(t %a, T %b) { T c = a; a = b; b = c; Rozdíly mezi šablonami a generikami jsou následující: Generiky jsou instanciovány až při běhu programu, šablony již při překladu. Odtud také pochází většina ostatních rozdílů. Generiky jsou nativně podporovány CLI. Můžeme tedy napsat například generickou třídu pro kolekci v C++ a později ji instanciovat v jiném jazyku doplněním třídy, která v době psaní naší generické třídy nebyla vůbec známa. Generika instanciovaná nad stejným typem ve dvou různých seskupeních je rozpoznána jako stejný typ. Šablona instanciovaná nad stejným typem ve dvou různých seskupeních je považována za dva různé (stejně se chovající) typy. Každá generika má jedinou instanci kódu společnou pro všechny referenční typy dosazené jako parametr, šablony mají samostatnou instanci kódu pro každý typ dosazený jako parametr. Generiky neumožňují beztypový parametr (ve stylu template <int i>). Generiky neumožňují explicitní specializaci ani úplnou, ani částečnou. Generiky neumožňují, aby typový parametr byl zároveň bázovou třídou generické třídy. Generiky neumožňují výchozí hodnoty typových parametrů. Parametrem šablony může být jiná šablona, generiky ani toto neumožňují. První bod seznamu také vysvětluje, proč v programu nelze generiky a šablony libovolně kombinovat. Jelikož šablona musí být instanciována již při překladu programu, nelze ji umístit jako vnitřní složku generiky, ani nelze v generice použít šablonu tak, že parametr generiky by zároveň byl parametrem šablony. Obráceně to však možné je: Šablona může svůj typový parametr použít jako typový parametr generiky. Pole Pole v C++ jsou jen za sebou v paměti umístěné proměnné stejného typu. Způsob práce s poli je velmi podobný práci s pointery, takže i pole patří k nejčastějším zdrojům chyb v programech. V rámci CTS jsou pole řízené referenční třídy, díky čemuž je zajištěno, že při práci s položkami pole jsou vždy z principu kontrolovány meze (přístup před první nebo za poslední prvek pole je vždy spolehlivě odhalen), příjemné je také to, že máme vždy k dispozici informaci o velikosti pole (a díky CTS také o typu každého objektu do pole vloženého). C++/CLI zachovává původní syntaxi pro nativní pole, zatímco řízená pole mají nový způsob deklarace a teprve při používání je možno psát kód běžným 11
12 způsobem s hranatými závorkami. K deklaraci řízeného pole použijeme následující deklaraci: array<string^> ^pole = gcnew array<string^>(10); array<double,2> ^matice = gcnew array<double,2>(3,3); Syntaxe je tedy podobná jako u generik. Za úvodní slovo array uvedeme do lomených závorek typ prvků v poli a nepovinně dimenzi pole (výchozí je 1). Konstrukci objektu pole provedeme opět uvedením téže konstrukce se slovem array a jako parametry konstruktoru uvedeme požadovanou velikost pole v jednotlivých dimenzích. Na řízených polích můžeme provádět operace definované ve třídě System::Array. Pro přístup k jednotlivým položkám pole použijeme hranaté závorky, u vícerozměrných polí uzávorkujeme všechny indexy dohromady. Viz následující příklad. matice[0,2] = 2; Array::Sort(pole); Pole mají v CTS zvláštní podporu, takže i přes poněkud složitější syntaxi je metoda Sort v tomto příkladu vykonána přímo na našem poli, nejde o kód, který by byl nějak zpomalován dodatečným zjišťováním typu pole až za běhu programu apod. Inicializaci pole lze provést též dosazením hodnot za volání konstruktoru nebo přímým uvedením seznamu hodnot namísto gcnew. Následující dva řádky jsou tedy ekvivalentní: array<int> ^pole = gcnew array<int>(3) {1,2,3; array<int> ^pole = {1,2,3; Dodejme ještě, že array není klíčovým slovem. Jedná se o speciální konstrukt patřící do prostoru jmen cli, v programu tedy můžeme mít třeba proměnnou jménem array a pole pak deklarujeme pomocí cli::array. Funkce volatelné s proměnlivým počtem parametrů U metod s proměnlivým počtem parametrů se rozlišuje řízený a nativní kód. Použijeme-li klasickou deklaraci s výpustkou (...), překladač ji označí varováním (warning) a přeloží metodu do nativního kódu, neboť v rámci řízeného kódu jazyk C++/CLI proměnlivý počet parametrů nepodporuje. Stejně jako C# však můžeme deklarovat za poslední parametr metody speciálně označené pole a tuto metodu pak lze volat syntakticky stejně jako metodu s proměnlivým počtem parametrů. Pro tyto účely se doplní výpustka před deklaraci parametru typu pole, jak ukazuje následující příklad. void test(... array<system::string ^> ^args) { //kód metody 12
13 Takto deklarovanou metodu můžeme volat s libovolným počtem parametrů, uvnitř ní pak máme všechny tyto parametry k dispozici v poli jménem args (a pomocí pole je to i fyzicky implementováno, přestože CLI podporuje i proměnlivý počet parametrů.) Přetěžování operátorů u řízených typů Přetěžování operátorů funguje u nativních tříd jako v C++, zatímco u řízených tříd funguje stejně jako v C#. Důvodem podobnosti s jazykem C# je zřejmě přímé mapování tohoto konstruktu do CTS. Operátory tedy definujeme jako statické metody, to se týká i operátorů pro přetypování (kde opět stejně jako v C# máme k dispozici klíčová slova implicit a explicit). Narozdíl od C#, jazyk C++/CLI umožňuje definovat i další operátory formou (nestatických) členských metod. Například lze definovat operátor přiřazení = jako metodu jménem operator= nebo i operátor čárka, chování je zde tedy stejné jako v C++. Tyto operátory se nemapují přímo do CTS a jsou platné pro instance typů, u kterých jsou definovány, nikoli pro handly (toto odpovídá chování C++, ale programátory zvyklé na C# by to mohlo zmást). Property Kromě metod a proměnných (fieldů) může řízená třída obsahovat také property (čili česky vlastnosti, ačkoliv tento překlad je značně zavádějící). Ačkoliv se jedná jen o syntaktický cukr, který ani CTS přímo nepodporuje, v nativních typech je možno deklarovat property pouze ve stylu dřívějších verzí Visual C++ (čili pomocí declspec(property)). Property v C++/CLI mají podobný význam jako v C#, ale nabízejí poněkud širší možnosti. Syntaxe je patrná z následujícího příkladu. class PropTest { int vnitrni; property int Hodnota { int get() { return vnitrni; void set(int value) { vnitrni = value; ; Deklarace property je uvozena kontextovým klíčovým slovem property, pak následuje typ a jméno. V následujícím bloku jsou uzavřeny dvě metody nazývané akcesory get slouží ke čtení a set k zápisu hodnoty do property. Smyslem property je syntakticky zpřístupnit vnitřní proměnnou, aniž by tato musela být přímo veřejná (public). Narozdíl od výše uvedeného jednoduchého příkladu, v praxi do kódu akcesorů můžeme napsat libovolný kód, který se vykoná při pokusu o čtení nebo zápis (a při zápisu nás to zajímá především) proměnné. Další vlastnosti property (zde je vidět nevhodnost překladu property jako vlastnost jistě nebudeme říkat vlastnosti vlastností uvádí následující seznam: 13
14 Jméno property nesmí být stejné jako jméno třídy, ve které je obsaženo. Jednotlivé akcesory mohou být označeny virtual nezávisle na sobě. Je-li property označeno jako statické, musí být statické oba akcesory. Můžeme definovat také indexované property, což sémanticky odpovídá překrytí operátoru přístupu do pole [ ]. Property přitom mohou být i přetížené, čímž definujeme přístup jakoby to vícerozměrných polí o různých dimenzí. Pojmenujeme-li property default, jedná se o výchozí property, které umožňuje použít operátor [ ] přímo na řízený handl. Tento konstrukt tedy odpovídá indexeru v jazyce C#. Syntaxi indexovaných property ukazuje následující příklad, kde položky vektory x,y,z zpřístupníme také ve formě pole. ref class Vektor { public: int x,y,z; ; property int default[int] { int get(int i) { if(i==0) return x; if(i==1) return y; if(i==2) return z; throw gcnew Exception(); Traity void set(int i, int v) { if(i==0) x=v; else if(i==1) y=v; else if(i==2) z=v; else throw gcnew Exception(); Traity jsou dalším typem vlastností (anglicky trait, česky opět vlastnost a opět s jiným významem než atribut nebo property). Se sémantikou traitů se můžeme setkat v STL kolekcích jazyka C++, používají se především z důvodu absence metadat u základních datových typů. (Bez traitu například nelze zjistit minimální platnou hodnotu vyjádřitelnou typem int.) C++/CLI nabízí několik speciálních konstruktů umožňujících nám zjistit informace, které překladač při překladu zná, ale nemají syntaktickou podporu přímo v C++. Tyto konstrukty, nazývané také traity, shrnuje tabulka 3. Zjištění typu Ke zjištění typu můžeme použít konstrukt typ::typeid (pro daný typ), který vrací instanci System::Type pro daný řízený typ. 14
15 Tabulka 3. Traity Trait Vrací true jestliže... has assign Typ definuje přiřazovací operátor. has copy Typ definuje kopírovací konstruktor. has finalizer Typ definuje finalizer. has nothrow assign Kopírovací přiřazovací operátor typu je definován s prázdnou specifikací výjimek (deklarovanou pomocí throw() před tělem metody operátoru). has nothrow constructor Výchozí konstruktor typu je definován s prázdnou specifikací výjimek. has nothrow copy Kopírovací konstruktor typu je definován s prázdnou specifikací výjimek. has trivial assign Typ má triviální přiřazovací operátor (automaticky generovaný překladačem). has trivial constructor Typ má triviální výchozí konstruktor (automaticky generovaný překladačem). has trivial copy Typ má triviální kopírovací konstruktor. has trivial destructor Typ má triviální destruktor. has user destructor Typ má uživatelem definovaný destruktor. has virtual destructor Typ má virtuální destruktor. (Destruktory řízených typů jsou vždy virtuální.) is abstract Typ je abstraktní. is base of První typ je předkem druhého. is class Typ je nativní třída nebo struktura. is convertible to První typ lze převést (zkonvertovat) na druhý. is delegate Typ je delegát. is empty Typ nemá žádné instanční datové členy. is enum Typ je nativní výčtový typ (enum). is interface class Typ je řízené rozhraní (interface class). is pod Typ je třída nebo unie bez konstruktoru a privátních či protected nestatických členů, nic nedědí, nemá virtuální funkce. False pro všechny fundamentální typy. is polymorphic Typ má polymorfní metody. is ref array Typ je řízené pole. is ref class Typ je referenční třída. is sealed Typ je řízená či nativní zapečetěná třída. is simple value class Typ je hodnotová třída bez referencí na referenční typy. is union Typ je unie. is value class Typ je hodnotová třída (value class). Pro nativní typy můžeme použít operátor typeid, funguje stejně jako v C++. Interop (součinnost s nativním kódem) Termínem Interop (z anglického interoperability součinnost) je v souvislosti s.net Frameworkem označována spolupráce řízeného a neřízeného kódu, přitom musíme rozlišit součinnost na úrovni COM komponent a součinnost na úrovni 15
16 DLL souborů. Překladače jednotlivých jazyků musí explicitně řešit pouze druhý případ součinnost s DLL knihovnami. Schopnosti jazyka C++/CLI jsou v tomto směru na velmi dobré úrovni. Na výběr máme dvě možnosti, jak součinnost realizovat: PInvoke a IJW. PInvoke (z anglického Platform Invoke) funguje stejně jako v jazyku C#. Deklarujeme tedy mapování funkce z DLL knihovny do řízeného kódu, CLR zajistí správné předání parametrů. IJW (z anglického It Just Works) je zvláštností jazyka C++/CLI. Jak sám název napovídá, C++/CLI umožňuje přímo volat nativní kód z řízeného, stačí inkludovat příslušný hlavičkový soubor a linkovat s příslušnou knihovnou. Narozdíl od PInvoke zde nedochází k žádnému zpracování předávaných argumentů, ty tedy musejí odpovídat deklaraci. Například při práci se stringy to znamená, že musíme ručně převést řetězec z objektu typu String na obvyklý tvar char*. Příklad následuje. char *t = (char*)marshal::stringtohglobalansi("text").topointer(); puts(t); FreeHGlobal(t); Pracujeme-li tedy s řetězci nebo jinými řízenými proměnnými, IJW vyžaduje poněkud složitější kód z důvodu ručního převodu parametrů. Obyčejné hodnoty (například Int32) můžeme samozřejmě použít přímo, navíc v případech, kdy nativní kód voláme častěji se stejnými parametry mohou efektivně udělané ruční převody zrychlit běh programu. IJW je také výhodné pro programy, které používají málo řízených proměnných a většinou pracují s nativními. V tom případě je používání IJW jak efektivní, tak i pohodlné. Se součinností souvisí také několik dalších prvků. Prostor jmen System::Runtime ::InteropServices obsahuje podpůrné prostředky, včetně výše použité třídy Marshal. Klíčové slovo pin ptr umožňuje získat pinning pointer, tedy pointer na řízený objekt, kde CLI zaručuje, že nedojde k přesunu cílového objektu během života tohoto speciálního pointeru. Zamykání objektů Jazyk C# má zajímavou konstrukci pro zamykání objektů na principu monitorů, slouží k tomu konstrukt lock. V jazyku C++/CLI je k dispozici třída lock deklarovaná v souboru <msclr/lock.h>, která poskytuje stejnou funkcionalitu. Reference 1. Sivakumar N. C++/CLI in Action. Manning, ISBN: Visual Studio 2005 C++ Language Reference. Annotation: How s and Why s of Combining C++ and.net Platform The paper describes C++/CLI, a language which aims to connect C++ and.net platform. We cover both how s and why s topics, the elements of language are described based on the reader s knowledge of C++ and C#. 16
Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní
Základy jazyka C# doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Architektura.NET Historie Vlastnosti
VíceZápis programu v jazyce C#
Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač
VícePREPROCESOR POKRAČOVÁNÍ
PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,
VíceÚvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39
Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy
VíceGenerické programování
Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =
VíceOsnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)
Osnova přednášky Programové prostředky řízení Úvod do C# II. Členy (Members) Jmenné prostory (Namespaces) Třídy (Classes) Struktury (Structs) Pavel Balda Západočeská univerzita v Plzni, FAV, KKY 2 Členy
VíceTŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);
TŘÍDY POKRAČOVÁNÍ Události pokračování public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); class Bod private int x; private int y; public event ZmenaSouradnicEventHandler ZmenaSouradnic;
VíceJazyk C# (seminář 6)
Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí
VíceProgramování v C++ 2, 4. cvičení
Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva
VíceMichal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
VícePŘETĚŽOVÁNÍ OPERÁTORŮ
PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako
VíceÚvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
VíceÚvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25
Programování v C# Úvodní slovo 1 / 25 Obsah přednášky Seznámení s předmětem Co je.net Vlastnosti.NET 2 / 25 Kdo je kdo Petr Vaněček vanecek@pf.jcu.cz J 502 Václav Novák vacnovak@pf.jcu.cz?? Při komunikaci
VíceJakub Čermák <jakub@jcermak.cz> http://www.jcermak.cz. Microsoft Student Partner
Jakub Čermák http://www.jcermak.cz Microsoft Student Partner Úvod, příklady použití, trocha teorie Struktura aplikace Typy obecně, primitivní typy, speciální typy Podmínky, cykly, namespaces
Více24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1
24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE
VícePlatforma.NET 4. hodina dnes to bude ideologické
Platforma.NET 4. hodina dnes to bude ideologické Aleš Keprt Ales.Keprt@upol.cz říjen 2006 Doporučená literatura 1. Duffy J. Professional.NET Framework 2.0. Wrox Press, 2006. 2. Wikipedia.NET Framework
Více14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.
Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání
Více8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním
VíceVýčtový typ strana 67
Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce
VíceProgramování v C++ 1, 5. cvičení
Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené
Vícetypová konverze typová inference
Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie
VícePB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
VícePB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
VícePokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné
VíceÚvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
VícePB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
Více7. Datové typy v Javě
7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů
VíceJakub Čermák <jakub@jcermak.cz> http://www.jcermak.cz. Microsoft Student Partner
Jakub Čermák http://www.jcermak.cz Microsoft Student Partner Úvod, příklady použití, trocha teorie Struktura aplikace Typy obecně, primitivní typy, speciální typy Podmínky, cykly, namespaces
Více1. Programování proti rozhraní
1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní
Vícepřetížení operátorů (o)
přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního
VíceObsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
Více7 Formátovaný výstup, třídy, objekty, pole, chyby v programech
7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,
VíceJazyk C++ I. Šablony 2
Jazyk C++ I Šablony 2 AR 2013/2014 Jazyk C++ I Třídy template class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor()
VíceIAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);
Pole (array) Motivace Častá úloha práce s větším množstvím dat stejného typu o Př.: průměrná teplota za týden a odchylka od průměru v jednotlivých dnech Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine());
VíceTeoretické minimum z PJV
Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov
VíceIRAE 07/08 Přednáška č. 1
Úvod do předmětu OOP Objekt Proč OOP? Literatura, osnova předmětu viz. cvičení Základní prvek OOP sw inženýrství = model reálných objektů (věcí) člověk, auto, okno (ve windows), slovník, = model abstraktní
VíceMichal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
Více2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
VíceMichal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
VíceProgramovací jazyk Úvod do programování v C#
Programovací jazyk C# Úvod do programování v C# Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz .NET Framework Dramaticky zjednodušit
VíceVíce o konstruktorech a destruktorech
Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení
VíceJazyk C++ II. Šablony a implementace
Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy
VícePokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom
Poznámky k virtuálním metodám aneb co když zkoušíme překladač zlobit... Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom chtěli). Pokud neuvedeme
VíceNPRG031 Programování II 1 / :25:46
NPRG031 Programování II 1 / 26 28. 2. 2018 11:25:46 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat jiné objekty
VícePB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky
VíceMichal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
VíceObjektově orientované programování
10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh
Více1. Dědičnost a polymorfismus
1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář
VíceProgramovací jazyk C# Úvod do programování v C#
Programovací jazyk C# Úvod do programování v C# Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz.net Framework Dramaticky zjednodušit
VícePočítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006
Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem
VíceProgramování v C++ 1, 6. cvičení
Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené
VíceJazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem
Jazyk C++ 1 Blok 3 Objektové typy jazyka C++ Studijní cíl Ve třetím bloku bude představen a rozebrán nejdůležitější objektový typ jazyka C++ a to sice třída. Po absolvování bloku bude student schopen navrhovat
VíceNMIN201 Objektově orientované programování 1 / :36:09
NMIN201 Objektově orientované programování 1 / 26 8.10.2013 15:36:09 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat
VíceTento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.
13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny
VíceNPRG031 Programování II --- 2/2 Z, Zk
NPRG031 Programování II --- 2/2 Z, Zk paralelka Y St 14:00-15:30 v S3 Pavel Töpfer Kabinet software a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer
VícePB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting
VíceAssembler - 5.část. poslední změna této stránky: Zpět
1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají
VícePolymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března
Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.
VíceProgramovací jazyk C# Úvod do programování v C#
Programovací jazyk C# Úvod do programování v C# Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz.net Framework Dramaticky zjednodušit
VíceDědění, polymorfismus
Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá
Vícekonstruktory a destruktory (o)
konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň
VíceÚvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií
1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední
Více7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd
7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená
VícePB161 Programování v jazyce C++ Přednáška 10
.. PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 23. listopadu 2015 PB161 přednáška 10: šablony 23. listopadu 2015 1 / 29 K zamyšlení Jaký je rozdíl mezi new int[10] a new int[10]()?
VíceVÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu
VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632
VíceJazyk C++ I. Polymorfismus
Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?
VíceČtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
VíceProgramování v C++ 3, 3. cvičení
Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového
Více4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ
4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ OBJEKT Program v Javě je staticky strukturován na třídy, jejichž instance (objekty) za běhu dynamicky programu vznikají a zanikají. Objekt je nejprve
VíceObjektové programování
Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k
VíceDefinice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky
JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance
VíceMělká a hluboká kopie
Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta
VíceJazyk C++ I. Šablony
Jazyk C++ I Šablony AR 2013/2014 Jazyk C++ I Úvod Zatím známe programovací styly: Strukturované programování, Objektově orientované programovaní. AR 2013/2014 Jazyk C++ I 2 Příklady void Print(const int&
VíceSeminář Java II p.1/43
Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii
VíceDatové typy v Javě. Tomáš Pitner, upravil Marek Šabo
Datové typy v Javě Tomáš Pitner, upravil Marek Šabo Úvod k datovým typům v Javě Existují dvě základní kategorie datových typů: primitivní a objektové Primitivní v proměnné je uložena přímo hodnota např.
VíceObjekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.
Objekty v PHP 5.x This is an object-oriented system. If we change anything, the users object. Objektové PHP Objekty se poprvé objevili v PHP ve verzi 4. Nepříliš zdařilý pokus. Programátoři získali nedůvěru
Více1 - Úvod do platformy.net. IW5 - Programování v.net a C#
1 - Úvod do platformy.net IW5 - Programování v.net a C# Strana 1 Obsah přednášky Objektově orientované paradigma.net Framework Základní rysy jazyka C# Strana 2 Objektová orientace C# implementuje základní
VíceAlgoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
Víceint ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N
Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze
VíceIRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33
Objekt jako proměnná Objekty a metody Objekt = proměnná referenčního typu vznik pomocí new, chování viz pole jako referenční proměnná minulý semestr Stack Heap objekt ref this 10 20 atr1 atr2 jinyobjekt
VícePřetěžování operátorů
Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat
VíceChování konstruktorů a destruktorů při dědění
Dědičnost V objektově orientovaném programování je dědičnost způsob, jak vytvořit novou třídu použitím již existujících definic jiných tříd. Takto vytvořené třídy přebírají vlastnosti a metody svého předka
VíceKomponenty v.net. Obsah přednášky
doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Rozdíl mezi COM a.net Distribuce komponent Programování
VícePředmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20
Obsah 5 Obsah Předmluva k aktuálnímu vydání 15 1 Úvod k prvnímu vydání z roku 2000 16 Typografické a syntaktické konvence................ 20 2 Základní pojmy 21 2.1 Trocha historie nikoho nezabije................
VíceC++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19
C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,
VíceUkazka knihy z internetoveho knihkupectvi www.kosmas.cz
Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena
VíceProgramování v jazyce C a C++
Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace
VíceProgramování II. Polymorfismus
Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění
VíceStřední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace
Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Předmět: Vývoj aplikací Téma: Visual Studio Vyučující: Ing. Milan Káža Třída: EK3 Hodina: 19,2 Číslo: V/5 Programování
VíceProgramování v Javě I. Únor 2009
Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Únor 2009 Radek Kočí Seminář Java Programování v Javě (1) 1/ 44 Téma přednášky Datové typy Deklarace třídy Modifikátory
VíceDědičnost (inheritance)
Dědičnost (inheritance) Úvod Umožňuje objektům převzít (zdědit) členy jiných objektů a pouze je rozšířit o Auto: lze odvodit Vztah je osobní auto, cisterna jsou auta Základní pojmy Bázová třída (rodič)
VíceViditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo
Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo Viditelnost Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat. Přístupem se rozumí jakékoli použití dané třídy, prvku
VíceKonstruktory a destruktory
Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,
VíceProgramování v Javě I. Leden 2008
Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Leden 2008 Radek Kočí Seminář Java Programování v Javě (1) 1/ 45 Téma přednášky Datové typy Deklarace třídy Modifikátory
VícePokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody
Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro
VíceBridge. Známý jako. Účel. Použitelnost. Handle/Body
Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době
Více11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9
Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií
VíceProgramovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
VíceSeznámení s prostředím dot.net Framework
Základy programování v jazyce C# Seznámení s prostředím dot.net Framework PL-Prostředí dot.net - NET Framework Je základním stavebním prvkem, na kterém lze vytvářet software. Jeho součásti a jádro je založené
VíceDefinice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky
JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance
Více