Programování v C++ NPRG041 Programování v C /2015 David Bednárek
|
|
- Radek Bařtipán
- před 9 lety
- Počet zobrazení:
Transkript
1 Programování v C++ NPRG041 Programování v C /2015 David Bednárek 1
2 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období pokusy v dubnu 2-3 hodiny v laboratoři, společně pro všechny skupiny Vypracování zápočtového programu Dohoda o tématu - do listopadu Předvedení cvičícímu do Doladění a odevzdání do Další podmínky udělení zápočtu určuje cvičící Cvičící může podmínky individuálně upravit, pokud se s ním student na začátku semestru dohodne Přiměřená účast na cvičeních Úspěšné odevzdání domácího úkolu NPRG041 Programování v C /2015 David Bednárek 2
3 Zkouška Zkouška bude provedena formou abc-testu Vlastnosti a pravidla jazyka C++ Používání knihoven C++ (kontejnery, algoritmy) Typické konstrukce objektového programování Generické programování Run-time/static polymorphism... Termíny Ve zkouškovém období ZS Během výuky v LS
4 Pravidla pro budoucí neúspěšné Zkouška Pokud letos složíte zkoušku se známkou výborně nebo velmi dobře a nedostanete zápočet, bude vám příští rok uznána Tento mechanismus je implementován zkoušejícími, nikoliv studijním oddělěním Zápočet Pokud nedostanete zápočet, budete příští rok opakovat ty části, které jste letos nesplnili Podmínky splněné letos se automaticky uznávají V příštím roce se musíte na začátku semestru přihlásit v SISu k některému z cvičících a dohodnout se s ním na konkrétních podmínkách
5 Course credits Conditions Exams abc-tests January to February - registration in SIS Passing practical programming tests in lab, approx. 3 hours, common sessions for all groups - registration in SIS 1st attempts - 2nd half of January 2nd attempts - 1st half of February 3rd attempts - April Creating an individual project Agreement on project assignment - until end of November Beta version until March 31, 2015 Final version including documentation until May 20, 2015 Reasonable participation in labs Homework assignments Conditions may be individually adjusted: contact your lab teacher during October Erasmus students may need dates and deadlines sooner NPRG041 Programování v C /2015 David Bednárek 5
6 Historie C++
7 Historie C++ inspirace BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) nadmnožina téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup 1979) The C++ programming language (Stroustrup 1985) C++98 (ISO/IEC ) šablony C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) paralelismus C++11 (ISO/IEC ) C++14 (2014+)
8 Historie C++ a C BCPL (Cambridge 1966) B (Bell Labs. 1969) C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) inspirace nadmnožina C with classes (Stroustrup 1979) téměř nadmnožina významná změna ANSI C (ANSI X3J ) The C++ programming language (Stroustrup 1985) C99 (ISO/IEC ) C++98 (ISO/IEC ) šablony C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C11 (ISO/IEC ) paralelismus C++11 (ISO/IEC ) C++14 (2014+)
9 Historie C++ - Objective-C BCPL (Cambridge 1966) Objective-C (Cox & Love 1981) B (Bell Labs. 1969) C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) inspirace nadmnožina C with classes (Stroustrup 1979) téměř nadmnožina významná změna Object-Oriented Programing (Cox 1986) ANSI C (ANSI X3J ) The C++ programming language (Stroustrup 1985) C99 (ISO/IEC ) C++98 (ISO/IEC ) šablony Objective-C 2.0 (Apple 2006) C++03 (ISO/IEC ) Objective-C++ (Apple 2010) C11 (ISO/IEC ) paralelismus C++TR1 (ISO/IEC ) C++11 (ISO/IEC ) C++14 (2014+)
10 Historie C++ - významné příbuzné jazyky BCPL (Cambridge 1966) Objective-C (Cox & Love 1981) B (Bell Labs. 1969) C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) inspirace nadmnožina C with classes (Stroustrup 1979) téměř nadmnožina významná změna Object-Oriented Programing (Cox 1986) ANSI C (ANSI X3J ) The C++ programming language (Stroustrup 1985) Java (Sun 1995) Objective-C 2.0 (Apple 2006) Objective-C++ (Apple 2010) C99 (ISO/IEC ) C11 (ISO/IEC ) C# (Microsoft 2002) C++/CLI (Microsoft 2005) paralelismus C++98 (ISO/IEC ) C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C++11 (ISO/IEC ) šablony C++14 (2014+)
11 Historie C++ - použití C v jádrech OS BCPL (Cambridge 1966) OS-X 2000 Objective-C (Cox & Love 1981) B (Bell Labs. 1969) Object-Oriented Programing (Cox 1986) Objective-C 2.0 (Apple 2006) Objective-C++ (Apple 2010) Windows NT 1993 C (Bell Labs. 1971) K&R C (Kernigan & Ritchie 1978) MacOS 1984 ANSI C (ANSI X3J ) C99 (ISO/IEC ) C11 (ISO/IEC ) Unix 1973 C with classes (Stroustrup 1979) The C++ programming language (Stroustrup 1985) Linux 1991 C# (Microsoft 2002) C++/CLI (Microsoft 2005) paralelismus inspirace nadmnožina C++98 (ISO/IEC ) C++03 (ISO/IEC ) C++TR1 (ISO/IEC ) C++11 (ISO/IEC ) téměř nadmnožina významná změna Java (Sun 1995) šablony C++14 (2014+)
12 Literatura
13 Literatura C++11 Scott Meyers: Overview of the New C++ (C++11) 360 slajdů z přednášek Vysvětluje motivaci k novým vlastnostem Bjarne Stroustrup: The C++ Programming Language - Fourth Edition Addison-Wesley. ISBN May 2013 Učebnice celého C++ Zatím jediná kompletní učebnice obsahující C++11 Stanley B. Lippman, Josée Lajoie, Barbara E. Moo: C++ Primer (5th Edition) Addison-Wesley. ISBN August
14 Literatura Pro začátečníky - před C++11 Bruce Eckel: Thinking in C++ (2000) Myslíme v jazyku C++ (Grada 2000) Miroslav Virius: Pasti a propasti jazyka C++ (Computer Press 2005) Programování v C++ (ČVUT 2001) Andrew Koenig, Barbara E. Moo: Accelerated C++ (2000) Stanley B. Lippman: Essential C++ (2000)
15 Literatura Pro středně pokročilé - před C++11 Andrei Alexandrescu, Herb Sutter: C++ Coding Standards (2005) Scott Meyers: Effective C++ (1998) More Effective C++ (1996) Effective STL (2001) Herb Sutter: Exceptional C++ (2000) More Exceptional C++ (2002) Exceptional C++ Style (2004) Nicolai M. Josuttis: Object-Oriented Programming in C++ (2002) The C++ Standard Library (1999)
16 Literatura Až si budete myslet, že všechno umíte - před C++11 Andrei Alexandrescu: Modern C++ Design (2001) Moderní programování v C++ (Computer Press 2004) David Vandevoorde, Nicolai M. Josuttis: C++ Templates (2003)
17 Je lepší C++ nebo Java/C#?
18 Špatná otázka Je lepší C++ nebo Java/C#?
19 Co programovat v C++ Pro které oblasti je C++ lepší než Java/C#? Důraz na výkon C++ umožňuje programovat způsobem, který neubírá na výkonu Když budete programovat v C++ stejným stylem jako v Java/C#, dostanete přibližně stejný výkon Spolupráce s hardware C++ nechystá na programátora nepříjemná překvapení (garbage collection etc.) Embedded assembler, spojování s jinými jazyky Spolupráce s OS Všechny významné OS mají v C jádro a tudíž i rozhraní OS Většina systémových aplikací je v C nebo C++ Nativní knihovny jazyků Java/C# jsou implementovány v C/C++ Generické programování Mechanismus šablon v C++ je silnější než v C/C++ Způsob implementace šablon v C++ neubírá na výkonu
20 Co programovat v C++ Proč je Java/C# pomalejší? Java/C# nutí k dynamické alokaci vždy a všude V C++ lze dynamickou alokaci používat pouze v nezbytných případech datové struktury proměnlivé velikosti polymorfní datové struktury objekty s nepravidelnou dobou života Garbage collection je pomalejší než explicitní dealokace (delete) GC dealokuje pozdě - problémy s využitím cache GC je ale rychlejší než chytré ukazatele (shared_ptr) Programy psané v C++ stylem Java/C# jsou pomalejší než originál Chybí pokročilé metody optimalizace v překladačích Vektorizace, transformace cyklů,... Překladače nemají čas (JIT), jejich autoři motivaci Existují i situace, kdy je Java/C# rychlejší Překladače Javy/C# mají jednodušší úlohu při analýze kódu Je C++ pomalejší než C Ne, pokud v něm neprogramujete jako v Javě/C#
21 Co neprogramovat v C++ Co raději neprogramovat v C++ Interaktivní aplikace s GUI C++ nemá standardizované rozhraní na GUI Nativní rozhraní GUI v OS je většinou archaické C Přímé použití je obtížné a nebezpečné Knihovny pro GUI jsou archaické, nepřenositelné nebo obojí Qt, GTK+, wxwidgets... Garbage Collection při programování GUI citelně chybí Aplikace skládané z mnoha cizích součástí V C++ neexistuje široce uznávaný styl psaní komponent Standard C++ nedostatečně zprostředkovává služby OS, Internetu atd. Situace v C++11 a C++14 je však daleko lepší než dříve Cizí knihovny obvykle doplňují chybějící části vlastní tvorbou Různé implementace chybějících částí mohou být v konfliktu Pokud je ale zároveň zapotřebí výkon, nic jiného než C++ nezbývá
22 Proč C++ Proč (stále ještě) učíme C++? Většina řadových programátorů v C++ programovat nebude MFF chce vychovávat elitu Programování OS, databází, překladačů Vědecké výpočty vyžadující výkon Hry, robotika, vestavěné systémy... Údržba rozsáhlých a historických softwarových systémů Porozumíte-li tomu, jak funguje C++, budete lépe rozumět jiným programovacím jazykům architektuře počítačů a operačních systémů překladačům Zvládnutí C++ je odznakem zdatnosti matfyzáka
23 Softwarové inženýrství a C++ NPRG041 Programování v C /2015 David Bednárek 23
24 Co je to programování Algorithms + Data Structures = Programs Niklaus Wirth, 1976 NPRG041 Programování v C /2015 David Bednárek 24
25 Co je to programování Algorithms + Data Structures = Programs Niklaus Wirth, 1976 NPRG041 Programování v C /2015 David Bednárek 25
26 Co je to programování Čím proslul Henry Ford? Vynalezl automobil? NPRG041 Programování v C /2015 David Bednárek 26
27 Co je to programování Čím proslul Henry Ford? Vynalezl automobil? Ne. Karl Benz Byl prvním výrobcem automobilů? NPRG041 Programování v C /2015 David Bednárek 27
28 Co je to programování Čím proslul Henry Ford? Vynalezl automobil? Ne. Karl Benz Byl prvním výrobcem automobilů? Ne. Panhard et Levassor Dokázal při výrobě automobilů využít pracovní sílu lidí, kteří by sami automobil postavit nedokázali. Úkolem dobrého programátora je vytvořit kód, který dokážou používat i horší programátoři V C++ je to dvojnásobně důležité NPRG041 Programování v C /2015 David Bednárek 28
29 Co je to programování První automobil Karl Benz 1885 Automobil Software První programovatelný počítač EDSAC 1949 Pásová výroba automobilů Henry Ford 1913 Systematická výroba software??? NPRG041 Programování v C /2015 David Bednárek 29
30 Co je to programování První automobil Karl Benz 1885 Automobil Software První programovatelný počítač EDSAC 1949 Pásová výroba automobilů Henry Ford 1913 Systematická výroba software??? EU27(2010, včetně výrobců částí): zaměstnanců EUR mzdy EU27(2010, včetně IT služeb): zaměstnanců EUR mzdy NPRG041 Programování v C /2015 David Bednárek 30
31 Co je to programování První automobil Karl Benz 1885 Automobil Software První programovatelný počítač EDSAC 1949 Pásová výroba automobilů Henry Ford 1913 Systematická výroba software??? Kdyby byly běžné automobily stejně spolehlivé jako běžný software, byli bychom dnes všichni mrtví NPRG041 Programování v C /2015 David Bednárek 31
32 Co je to programování První automobil Karl Benz 1885 Automobil Software První programovatelný počítač EDSAC 1949 Pásová výroba automobilů Henry Ford 1913 Systematická výroba software??? Kdyby byly běžné automobily stejně spolehlivé jako běžný software, byli bychom dnes všichni mrtví 2010: Každý automobil obsahuje nejméně 30 vestavěných počítačů Většina programována v C/C++ Spolehlivý software existuje! NPRG041 Programování v C /2015 David Bednárek 32
33 Co je to programování Každý program se dříve či později stane kolektivním dílem......nebo zmizí jako neúspěšný Každý programátor by měl počítat s tím, že jeho dílo bude používat někdo cizí Žádná překvapení, žádné exhibice geniality Dodržování konvencí, analogie dobře známých rozhraní NPRG041 Programování v C /2015 David Bednárek 33
34 Žádná překvapení NPRG041 Programování v C /2015 David Bednárek 34
35 Co je to programování Algorithms + Data Structures + Best Practices = Programs NPRG041 Programování v C /2015 David Bednárek 35
36 Hello, World! NPRG041 Programování v C /2015 David Bednárek 36
37 Hello, World! #include <iostream> int main( int argc, char * * argv) { std::cout << "Hello, world!" << std::endl; return 0; Vstupní bod programu Dědictví jazyka C Žádné třídy ani metody Globální funkce main Parametry programu Z příkazové řádky Děleno na kousky Archaické datové typy Ukazatel na ukazatel Logicky pole polí std - namespace knihoven cout - standardní výstup globální proměnná << - výstup do streamu přetížený operátor endl - oddělovač řádek globální funkce (!)
38 Hello, World! #include <iostream> int main( int argc, char * * argv) { std::cout << "Hello, world!" << std::endl; return 0; Program entry point Heritage of the C language No classes or namespaces Global function "main" main function arguments Command-line arguments Split to pieces Archaic data types Pointer to pointer to char Logically: array of strings std - standard library namespace cout - standard output global variable << - stream output overloaded operator endl - line delimiter global function (trick!)
39 Hello, World! Dělení do modulů Rozhraní modulů je nutno opsat do zvláštního souboru.hpp - hlavičkový soubor Definující i používající modul tento soubor inkluduje textová direktiva #include // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ void world(); #endif // main.cpp #include "world.hpp" // world.cpp #include "world.hpp" #include <iostream> int main( int argc, char * * argv) { void world() world(); { return 0; std::cout << "Hello, world!" << std::endl;
40 Hello, World! More than one module Module interface described in a file.hpp - "header" file The defining and all the using modules shall "include" the file Text-based inclusion // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ void world(); #endif // main.cpp #include "world.hpp" // world.cpp #include "world.hpp" #include <iostream> int main( int argc, char * * argv) { void world() world(); { return 0; std::cout << "Hello, world!" << std::endl;
41 Hello, World! // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ #include <vector> #include <string> typedef std::vector< std::string> t_arg; void world( const t_arg & arg); #endif // main.cpp #include "world.hpp" int main( int argc, char * * argv) { world( t_arg( argv + 1, argv + argc)); return 0; // world.cpp #include "world.hpp" #include <iostream> void world( const t_arg & arg) { if ( arg.empty() ) { std::cout << "Hello, world!" << std::endl;
42 Compilation and linking NPRG041 Programování v C /2015 David Bednárek 42
43 Single-module programs - static linking // iostream // iostream iostream.obj #include <fstream> #include <fstream> namespace std { namespace std { extern ofstream extern ofstream cout, cerr; cout, cerr; ; ; msvcrt.lib // myprog.cpp Compiler myprog.obj Linker myprog.exe #include <iostream> int main() { std::cout << "Hello, world!\n";
44 Multiple-module programs Library include files Library modules.obj User include files.hpp Library.lib User modules.cpp Compiler Compiled.obj Linker Runnable.exe
45 Module interfaces and linking myprog.cpp #include "bee.hpp" int main(int,char**) { return B( 7); Compiler myprog.obj 0000: ???????? export main(int,argv**) import B(int) bee.hpp #ifndef bee_hpp #define bee_hpp int B( int q); #endif Linker myprog.exe 0000: : bee.cpp #include "bee.hpp" int B( int q) { return q+1; Compiler bee.obj 0000: export B(int)
46 make Library include files Library modules.obj User include files.hpp Library.lib User modules.cpp Compiler Compiled.obj Linker Runnable.exe Make makefile
47 Integrated environment Library include files Library modules.obj User include files.hpp Library.lib User modules.cpp Compiler Compiled.obj Linker Runnable.exe Editor Debugger project file
48 Static libraries Std. library include files Std. library modules.obj User include files.hpp Std. library.lib User modules.cpp Compiler Compiled.obj Linker Runnable.exe Library as distributed (binary) Library.hpp Library.lib Library.cpp Compiler Compiled.obj Librarian Library as distributed (source)
49 Dynamic libraries (Microsoft) Std. library include files Std. library modules.obj User include files.hpp Std. library.lib User modules.cpp Compiler Compiled.obj Linker Runnable.exe Library as distributed (binary) Library.hpp Stub library.lib Library.dll Library.cpp Compiler Compiled.obj Librarian Library as distributed (source)
50 Dynamic libraries (Linux) Std. library include files Std. library modules.o User include files.hpp Std. library.a User modules.cpp Compiler Compiled.o Linker Runnable Library as distributed (binary) Library.hpp Library.so Library.cpp Compiler Compiled.o Librarian Library as distributed (source)
51 Základní pravidla pro.cpp/.hpp.hpp "hlavičkové soubory" Ochrana proti opakovanému include #ifndef myfile_hpp_ #define myfile_hpp_ /* */ #endif Vkládají se direktivou s uvozovkami #include "myfile.hpp" Direktiva s úhlovými závorkami je určena pro (standardní) knihovny #include <iostream> Direktivy #include používat vždy na začátku souboru (po ifndef+define) Soubor musí být samostatný: vše, co potřebuje, inkluduje sám.cpp - "moduly" Zařazení do programu pomocí projektu/makefile Nikdy nevkládat pomocí #include NPRG041 Programování v C /2015 David Bednárek 51
52 .cpp/.hpp - best practices.hpp "header files" Protect against repeated inclusion #ifndef myfile_hpp_ #define myfile_hpp_ /* */ #endif Use include directive with double-quotes #include "myfile.hpp" Angle-bracket version is dedicated to standard libraries #include <iostream> Use #include only in the beginning of files (after ifndef+define) Make header files independent: it must include everything what it needs.cpp - "modules" Incorporated to the program using a project/makefile Never include using #include NPRG041 Programování v C /2015 David Bednárek 52
53 Základní pravidla pro.cpp/.hpp.hpp "hlavičkové soubory" Deklarace/definice typů a tříd Implementace funkcí a metod malého rozsahu Funkce a metody mimo třídy označeny "inline" inline int max( int a, int b) { return a > b? a : b; Hlavičky globálních funkcí velkého rozsahu int big_function( int a, int b); Externí deklarace globálních proměnných extern int x; Lepší je použít singleton Veškerý generický kód (šablony tříd a funkcí) Jinak jej překladače neumí použít.cpp - "moduly" Implementace funkcí a metod velkého rozsahu Včetně "main" Definice globálních a statických proměnných Včetně jejich inicializace int x = 729; NPRG041 Programování v C /2015 David Bednárek 53
54 .cpp/.hpp - best practices.hpp "header files" Declaration/definitions of types and classes Implementation of small functions Outside classes, functions must be marked "inline" inline int max( int a, int b) { return a > b? a : b; Headers of large functions int big_function( int a, int b); Extern declarations of global variables extern int x; Consider using singletons instead of global variables Any generic code (class/function templates) The compiler cannot use the generic code when hidden in a.cpp.cpp - "modules" Implementation of large functions Including "main" Definitions of global variables and static class data members May contain initialization int x = 729; NPRG041 Programování v C /2015 David Bednárek 54
55 Vzájemné závislosti v kódu Všechny identifikátory musejí být deklarovány před prvním použitím Překladač čte zdrojové soubory jedním průchodem Výjimka: Těla metod jsou analyzována až na konci třídy Zevnitř metod lze používat položky deklarované později Pro generický kód platí složitější, ale obdobná pravidla Cyklické závislosti je nutné rozbít rozdělením na deklaraci a definici class one; class two { std::shared_ptr< one> p_; ; class one : public two {; Nedefinovaná deklarovaná třída má omezené možnosti použití Nelze použít jako předek, typ položky/proměnné, new, sizeof apod. NPRG041 Programování v C /2015 David Bednárek 55
56 Dependences in code All identifiers must be declared prior to first use Compilers read the code in one pass Exception: Member-function bodies are analyzed at the end of the class A member function body may use other members declared later Generic code involves similar but more elaborate rules Cyclic dependences must be broken using declaration + definition class one; // declaration class two { ; std::shared_ptr< one> p_; class one : public two // definition {; Declared class is of limited use before definition Cannot be used as base class, data-member type, in new, sizeof etc. NPRG041 Programování v C /2015 David Bednárek 56
57 Deklarace a definice
58 Declarations and definitions
59 Deklarace a definice Deklarace Zápis sdělující, že věc (typ/proměnná/funkce/...) existuje Identifikátor Základní vlastnosti věci Umožňuje překladači přeložit kód, který na věc odkazuje Definice V některých případech je k tomu zapotřebí i definice Zápis, který určuje všechny vlastnosti věci Obsah třídy, inicializace proměnné, kód funkce Umožňuje překladači vygenerovat kód a data, která věc reprezentují za běhu Každá definice je i deklarace Deklarace umožňují (některá) použití věci bez definice Oddělený překlad modulů Vyřešení cyklických závislostí Zmenšení objemu překládaného zdrojového kódu
60 Declarations and definitions Declaration A construct to declare the existence (of a class/variable/function/...) Identifier Some basic properties Ensures that (some) references to the identifier may be compiled Definition Some references may require definition A construct to completely define (a class/variable/function/...) Class contents, variable initialization, function implementation Ensures that the compiler may generate runtime representation Every definition is a declaration Declarations allow (limited) use of identifiers without definition Independent compilation of modules Solving cyclic dependences Minimizing the amount of code that requires (re-)compilation
61 Deklarace a definice One-definition rule #1: Jedna překladová jednotka... (modul, tj. jedno.cpp včetně inkludovaných hpp)... smí obsahovat nejvýše jednu definici věci One-definition rule #2: Program... (tj..exe včetně připojených.dll)... smí obsahovat nejvýše jednu definici proměnné nebo non-inline funkce Definice třídy, typu či inline funkce se v různých modulech opakovat smějí (typicky vložením téhož.hpp souboru) Nejsou-li opakované definice totožné, nebo nesouhlasí-li definice s deklarací, program je nekorektní Diagnostika na úrovni programu není normou požadována a překladače/linkery ji dělají jen v jednoduchých případech
62 Declarations and definitions One-definition rule #1: One translation unit... (module, i.e. one.cpp file and the.hpp files included from it)... may contain at most one definition of any item One-definition rule #2: Program... (i.e. the.exe file including the linked.dll files)... may contain at most one definition of a variable or a non-inline function Definitions of classes, types or inline functions may be contained more than once (due to inclusion of the same.hpp file in different modules) If these definitions are not identical, undefined behavior will occur Beware of version mismatch between headers and libraries Diagnostics is usually poor (by linker)
63 Class and type definitions Declaration Definition Class class A; class A {... ; Structure (almost equivalent to class) Union (unusable in C++) struct A; struct A {... ; union A; union A {... ; Named type typedef A A2; typedef A * AP; typedef std::shared_ptr< A> AS; typedef A AA[ 10]; typedef A AF(); typedef AF * AFP1; typedef A (* AFP2)(); typedef std::vector< A> AV; typedef AV::iterator AVI; C++11 style of named types using A2 = A; using AFP2 = A (*)();
64 Function declarations and definitions non-inline Deklarace (.hpp nebo.cpp) Definice (.cpp) Global function int f( int, int); int f( int p, int q) { return p + q; Static member function Nonstatic member function Virtual member function class A { static int f( int p); ; class A { int f( int p); ; class A { virtual int f( int p); ; int A::f( int p) { return p + 1; int A::f( int p) { return p + 1; int A::f( int) { return 0; inline Deklarace (.hpp nebo.cpp) Definice (.hpp nebo.cpp) Global inline function Nonstatic inline member fnc (a) Nonstatic inline member fnc (b) class A { int f( int p); ; inline int f( int p, int q) { return p + q; inline int A::f( int p) { return p + 1; class A { int f( int p) { return p+1; ;
65 Variable declarations and definitions Declaration Definition Global variable extern int x, y, z; int x; int y = 729; int z(729); int u{729; C++11 Static member variable Constant member Static local variable Nonstatic member variable Nonstatic local variable class A { static int x, y, z; ; int A::x; int A::y = 729; int A::z( 729); int A::z{ 729; C++11 class A { static const int x = 729; ; void f() { static int x; static int y = 7, z( 7); static int u{ 7; C++11 class A { int x, y; ; void f() { int x; int y = 7, z( 7); int u{ 7; C++11 ;
66 Storage classes Where data reside... Static storage Global, static member, static local variables, string constants One instance per process Allocated by compiler/linker/loader (listed in.obj/.dll/.exe) Thread-local storage Variables marked "thread_local" One instance per thread Automatic storage (stack or register) Local variables, parameters, anonymous objects, temporaries One instance per function invocation (execution of defining statement) Placement by compiler, space allocated by compiler-generated instructions Dynamic allocation new/delete operators C++11 The programmer is responsible for deallocation, no garbage collection Allocation by library routines Significantly slower than other storage classes NPRG041 Programování v C /2015 David Bednárek 66
67 Organizace paměti procesu IP R0 R1... SP Kódový segment Datový segment Heap Zásobník (stack segment) Segmenty (vyjma zásobníku) nemusejí být souvislé Dynamicky-linkované knihovny sdílené mezi procesy Postupná alokace heapu
68 Organizace paměti procesu IP R0 R1... SP Kódový segment Připraven kompilátorem součást spustitelného souboru Kód uživatelských i knihovních funkcí Obvykle chráněn proti zápisu Datový segment Heap Zásobník (stack segment)
69 Organizace paměti procesu IP R0 R1... SP Kódový segment Datový segment Připraven kompilátorem součást spustitelného souboru Explicitně nebo implicitně (nulami) inicializované globální proměnné Řetězcové konstanty Heap Data knihoven Pomocná data generovaná kompilátorem Zásobník (stack segment)
70 Organizace paměti procesu IP R0 R1... SP Kódový segment Datový segment Heap Vytvářen startovacím modulem knihoven Neinicializovaná dynamicky alokovaná data C: malloc/free C++: new/delete Obsazené bloky různé velikosti + seznam volných bloků Knihovny mohou též požádat OS o zvětšení segmentu Zásobník (stack segment)
71 Organizace paměti procesu IP R0 R1... SP Kódový segment Datový segment Heap Zásobník (stack segment) Připraven op. systémem, knihovny mohou požádat OS o zvětšení Explicitně inicializované nebo neinicializované lokální proměnné Pomocné proměnné generované kompilátorem Návratové adresy Další pomocná data Vícevláknové aplikace mají více zásobníků
72 Organizace paměti vícevláknového procesu thread 1 IP R0 R1... SP Vlákno z pohledu OS IP Ukazatel instrukcí SP Ukazatel zásobníku Další registry procesoru (Identifikátor vlákna) thread 2 IP R0 R1... SP Paměťový prostor je společný Vlákno v paměťovém prostoru Zásobník Thread-local storage Na dně zásobníku, nebo lokalizováno dle id vlákna
73 Storage classes Where data reside... T x; Static storage // global variable Thread-local storage thread_local T x; // global variable void f() { Automatic storage (stack or register) T x; // local variable Dynamic allocation void f() { T * p = new T; //... delete p; NPRG041 Programování v C /2015 David Bednárek 73
74 Dynamic allocation Use smart pointers instead of raw (T *) pointers #include <memory> void f() { one owner (pointer cannot be copied) no runtime cost (compared to T *) std::unique_ptr< T> p = new T; std::unique_ptr< T> q = std::move( p); // pointer moved to q, p becomes nullptr shared ownership runtime cost of reference counting void f() { std::shared_ptr< T> p = std::make_shared< T>(); // invokes new std::shared_ptr< T> q = p; // pointer copied to q Memory is deallocated when the last owner disappears Destructor of (or assignment to) the smart pointer invokes delete when required Reference counting cannot deallocate cyclic structures NPRG041 Programování v C /2015 David Bednárek 74
75 Dynamic allocation Dynamic allocation is slow compared to static/automatic storage the reason is cache behavior, not the allocation itself Use dynamic allocation only when necessary variable-sized or large arrays polymorphic containers (objects with inheritance) object lifetimes not corresponding to function invocations Avoid data structures with individually allocated items linked lists, binary trees,... std::list, std::map,... prefer B-trees (yes, also in memory) or hash tables avoiding is difficult - do it only if speed is important This is how C++ programs may be made faster than C#/java C#/java requires dynamic allocation of every class instance NPRG041 Programování v C /2015 David Bednárek 75
76 Arrays Homogeneous Fixed size static const std::size_t n = 3; std::array< T, n> a; a[ 0] = /*...*/; a[ 1].f(); Variable size std::size_t n = /*...*/; std::vector< T> a(n); a[ 0] = /*...*/; a[ 1].f(); Polymorphic std::tuple< T1, T2, T3> a; std::get< 0>( a) = /*...*/; std::get< 1>( a).f(); std::vector< std::unique_ptr< Tbase>> a; a.push_back( new T1); a.push_back( new T2); a.push_back( new T3); a[ 1]->f(); NPRG041 Programování v C /2015 David Bednárek 76
77 Array layouts std::array< T, 3> T T T std::tuple< T1, T2, T3> T1 T2 T3 std::vector< T> std::vector< std::unique_ptr<tbase>> T T T T1 T2 T3 NPRG041 Programování v C /2015 David Bednárek 77
78 Frequently used data types
79 Selected number types bool char std::wchar_t int unsigned long long unsigned long long std::size_t double long double std::complex<double> false, true character (ASCII, 8 bit) character (Unicode, 16/32 bit) signed integer (~32 bit) unsigned integer (~32 bit) extra large signed integer (~64 bit) extra large unsigned integer (~64 bit) unsigned integer large enough for array sizes (32/64 bit) "double precision" floating-point number (Intel: 64 bit) extended precision floating-point number (Intel: 80 bit) complex number of double precision
80 Important non-number types std::string std::wstring std::istream std::wistream std::ostream std::wostream struct T { std::pair<t1,t2> std::tuple<t1,...> std::array<t,n> std::vector<t> std::list<t> std::map<k,t> std::multimap<k,t> std::unordered_map<k,t> std::unordered_multimap<k,t> string (containing char) string (containing std::wchar_t) input stream (containing char) input stream (containing std::wchar_t) output stream (containing char) output stream (containing std::wchar_t) structure (almost equivalent to class) pair of T1 and T2 k-tuple of various types fixed-size array of T variable-size array of T doubly linked list of T ordered associative container of T indexed by K ordered associative container with multiplicity of keys hash table of T indexed by K hash table with multiplicity of keys
81 Class NPRG041 Programování v C /2015 David Bednárek 81
82 Class class X { /*...*/ ; Class in C++ is an extremely powerful construct Other languages often have several less powerful constructs (class+interface) Requires caution and conventions Three degrees of usage Non-instantiated class - a pack of declarations (used in generic programming) Class with data members Class with inheritance and virtual functions (object-oriented programming) class = struct struct members are by default public by convention used for simple or non-instantiated classes class members are by default private by convention used for large classes and OOP
83 Three degrees of classes Non-instantiated class class X { public: typedef int t; static const int c = 1; static int f( int p) { return p + 1; ; Class with data members class Y { public: Y() : m_( 0) { int get_m() const { return m_; void set_m( int m) { m_ = m; private: int m_; ; Classes with inheritance class U { public: void f() { f_(); private: virtual void f_() = 0; ; class V : public U { public: V() : m_( 0) { private: int m_; virtual void f_() { ++ m_; ; NPRG041 Programování v C /2015 David Bednárek 83
84 Type and static members of classes class X { public: class N { /*...*/ ; typedef unsigned long t; static const t c = 1; static t f( t p) { return p + v_; private: static t v_; // declaration of X::v_ ; X::t X::v_ = X::c; // definition of X::v_ void f2() { X::t a = 1; a = X::f( a); Type and static members... Nested class definitions typedef definitions static member constants static member functions static member variables... are not bound to any class instance (object) Equivalent to global types/variables/functions But referenced using qualified names (prefix X::) Encapsulation in a class avoids name clashes But namespaces do it better Some members may be private Class may be passed to a template NPRG041 Programování v C /2015 David Bednárek 84
85 Uninstantiated classes vs. namespaces class X { public: Uninstantiated class Class definitions are intended for objects Static members must be explicitly marked Class members may be public/protected/private class N { /*...*/ ; typedef unsigned long t; static const t c = 1; static t f( t p) { return p + v; static t v; // declaration of X::v ; Class must be defined in one piece Definitions of class members may be placed outside Namespace Namespace members are always static No objects can be made from namespaces Functions/variables are not automatically inline/extern namespace X { class N { /*...*/ ; typedef unsigned long t; const t c = 1; inline t f( t p) { return p + v; extern t v; // declaration of X::v ; namespace X { Namespace may be reopened Namespace may be split into several header files Definitions of namespace members must reopen it X::t X::v = X::c; // definition of X::v t v = c; // definition of X::v void f2() { X::t a = 1; ; void f2() { Namespace members can be made directly visible "using namespace" a = X::f( a); X::t a = 1; using namespace X; A class may become a template argument a = f( a); typedef some_generic_class< X> specific_class; NPRG041 Programování v C /2015 David Bednárek 85
86 Class with data members class Y { public: Y() : m_( 0) { int get_m() const { return m_; void set_m( int m) { m_ = m; private: int m_; ; Class (i.e. type) may be instantiated (into objects) Y v1; Using a variable of class type This is NOT a reference! Dynamically allocated Held by a (smart) pointer std::unique_ptr< Y> p = new Y; std::shared_ptr< Y> q = std::make_shared< Y>(); Element of a larger type typedef std::array< Y, 5> A; class C1 { public: Y v; ; class C2 : public Y {; Embedded into the larger type NO explicit instantiation by new! NPRG041 Programování v C /2015 David Bednárek 86
87 Class with data members class Y { public: Y() : m_( 0) { int get_m() const { return m_; void set_m( int m) { m_ = m; private: int m_; ; Y v1; Class (i.e. type) may be instantiated (into objects) std::unique_ptr< Y> p = new Y; v1.get_m() p->set_m(0) v1.m_ Non-static data members constitute the object Non-static member functions are invoked on the object Object must be specified when referring to non-static members References from outside may be prohibited by "private"/"protected" // error Only "const" methods may be called on const objects const Y * pp = p.get(); // secondary pointer pp->set_m(0) // error NPRG041 Programování v C /2015 David Bednárek 87
88 Pointer vs. value
89 Forms of pointers in C++ T & const T & References T * Built in C++ Syntactically identical to values when used (r.a) Raw pointers const T * Built in C/C++ Requires special operators to access the referenced value (*p, p->a) Pointer arithmetics allows to access adjacent values residing in arrays Manual allocation/deallocation Smart pointers std::shared_ptr< T> std::unique_ptr< T> K::iterator Class templates in standard C++ library Operators to access the referenced value same as with raw pointers (*p, p->a) Represents ownership - automatic deallocation on destruction of the last reference Iterators K::const_iterator Classes associated to every kind of container (K) in standard C++ library Operators to access the referenced value same as with raw pointers (*p, p->a) Pointer arithmetics allows to access adjacent values in the container
90 C#/Java vs. C++ class T { public int a; class test { static void f( T z) { z.a = 3; static void g() { T x = new T(); // allocation x.a = 1; Reference types (C#,Java) T y = x; // second reference y.a = 2; // x.a == 2 f( x); // x.a == 3 Raw pointers (C++) class T { public: int a; ; void f( T * z) { z->a = 3; void g() { T * x = new T; // allocation x->a = 1; T * y = x; // second pointer y->a = 2; // x->a == 2 f( x); // x->a == 3 // garbage collector will later // reclaim the memory when needed delete x; // manual deallocation
91 C#/Java vs. C++ class T { public int a; class test { static void f( T z) { z.a = 3; Reference types (C#,Java) Smart pointers (C++) class T { public: int a; ; void f( T * z) { z->a = 3; static void g() { T x = new T(); // allocation x.a = 1; T y = x; // second reference y.a = 2; // x.a == 2 f( x); // x.a == 3 // garbage collector will later // reclaim the memory when needed void g() { std::shared_ptr< T> x = std::make_shared< T>(); // allocation x->a = 1; std::shared_ptr< T> y = x; // second pointer y->a = 2; // x->a == 2 f( x); // x->a == 3 // automatic deallocation // when pointers are destructed
92 C#/Java vs. C++ class T { public int a; class test { static void f( T z) { z.a = 3; static void g() { T x = new T(); // allocation x.a = 1; Reference types (C#,Java) References (C++) class T { public: int a; ; void f( T & z) { z.a = 3; void g() { T x; x.a = 1; // automatic storage (stack) T y = x; // second reference T & y = x; // a reference to the stack object y.a = 2; // x.a == 2 f( x); // x.a == 3 // garbage collector will later // reclaim the memory when needed y.a = 2; // x.a == 2 f( x); // x.a == 3 // x is destructed on exit
93 C#/Java vs. C++ Value types (C#) Values (C++) struct T { int a; class test { static void f( T z) { z.a = 3; static void g() { T x; // creation x.a = 1; T y = x; // a copy y.a = 2; // x.a == 1 f( x); // x.a == 1 class T { public: int a; ; void f( T z) { z.a = 3; void g() { T x; // creation x.a = 1; T y = x; // a copy y.a = 2; // x.a == 1 f( x); // x.a == 1 // destruction on exit // destruction on exit
94 C#/Java vs. C++ Passing value types by reference (C#) struct T { int a; class test { static void f( ref T z) { z.a = 3; Passing by lvalue reference (C++) class T { public: int a; ; void f( T & z) { z.a = 3; static void g() { T x; // creation x.a = 1; f( ref x); // x.a == 3 void g() { T x; x.a = 1; f( x); // x.a == 3
95 C#/Java vs. C++ Passing reference types by reference (C#) class T { public int a; class test { static void f( ref T z) { z = new T(); // allocation of another object static void g() { T x = new T(); // allocation f( ref x); // x is now a different object // deallocation later by GC Passing smart pointers by reference (C++) class T { public: int a; ; void f( std::unique_ptr<t> & z) { z = new T; // allocation of another object // deallocation of the old object void g() { std::unique_ptr< T> x = new T; // allocation f( x); // *x is now a different object // deallocation by destruction of x
96 Pointer/reference conventions
97 Pointer/references C++ allows several ways of passing links to objects smart pointers C-like pointers references Technically, all the forms allow almost everything At least using dirty tricks to bypass language rules By convention, the use of a specific form signalizes some intent Conventions (and language rules) limits the way how the object is used Conventions help to avoid "what-if" questions What if someone destroys the object I am dealing with? What if someone modifies the contents of the object unexpectedly?...
98 Passing a pointer/reference in C++ - conventions What the recipient may do? For how long? What the others will do meanwhile? std::unique_ptr<t> Modify the contents and destroy the object As required Nothing std::shared_ptr<t> Modify the contents As required Read/modify the contents T * Modify the contents Until noticed to stop/by agreement const T * Read the contents Until noticed to stop/by agreement T & Modify the contents During a call/statement const T & Read the contents During a call/statement Read/modify the contents Modify the contents Nothing (usually) Nothing (usually)
99 Transferring unique ownership channel ch; class packet { /*...*/ ; void send_hello() { std::unique_ptr< packet> p = new packet; p->set_contents( "Hello, world!"); ch.send( std::move( p)); // p is nullptr now void dump_channel() class channel { public: void send( std::unique_ptr< packet> q); bool empty() const; std::unique_ptr< packet> receive(); { while (! ch.empty() ) { std::unique_ptr< packet> m = ch.receive(); std::cout << m->get_contents(); private: ; /*...*/ // the packet is deallocated here NPRG041 Programování v C /2015 David Bednárek 99
100 Transferring unique ownership channel ch; class packet { /*...*/ ; void send_hello() { std::unique_ptr< packet> p = new packet; p->set_contents( "Hello, world!"); ch.send( std::move( p)); // p is nullptr now class channel { public: void send( std::unique_ptr< packet> q) { q_.push_back( std::move( q)); void dump_channel() { while (! ch.empty() ) { std::unique_ptr< packet> m = ch.receive(); std::cout << m->get_contents(); // the packet is deallocated here std::unique_ptr< packet> receive() { std::unique_ptr< packet> r = std::move( q_.front()); // remove the nullptr from the queue q_.pop_front(); return r; private: ; std::deque< std::unique_ptr< packet>> q_; NPRG041 Programování v C /2015 David Bednárek 100
101 Shared ownership class sender { public: sender( std::shared_ptr< channel> ch) : ch_( ch) { void send_hello() { /*...*/ ch_->send( /*...*/); private: std::shared_ptr< channel> ch_; ; class channel { /*...*/ ; std::unique_ptr< sender> s; std::unique_ptr< recipient> r; void init() { std::shared_ptr< channel> ch = std::make_shared< channel>(); s.reset( new sender( ch)); class recipient { public: recipient( std::shared_ptr< channel> ch) r.reset( new recipient( ch)); : ch_( ch) { void dump_channel() { /*...*/ = ch_->receive(); /*...*/ private: std::shared_ptr< channel> ch_; void kill_sender() { s.reset(); void kill_recipient() { r.reset(); The server and the recipient may be destroyed in any order The last one will destroy the channel NPRG041 Programování v C /2015 David Bednárek 101
102 Accessing without ownership transfer class sender { class channel { /*...*/ ; public: sender( channel * ch) : ch_( ch) { void send_hello() { /*...*/ ch_->send( /*...*/); private: channel * ch_; ; std::unique_ptr< channel> ch; std::unique_ptr< sender> s; std::unique_ptr< recipient> r; void init() { ch.reset( new channel); s.reset( new sender( ch.get())); class recipient { public: r.reset( new recipient( ch.get())); recipient( channel * ch) : ch_( ch) { void dump_channel() { /*...*/ = ch_->receive(); /*...*/ private: channel * ch_; void shutdown() { s.reset(); r.reset(); ch.reset(); The server and the recipient must be destroyed before the destruction of the channel NPRG041 Programování v C /2015 David Bednárek 102
103 Holding pointers to locally allocated objects class sender { public: sender( channel * ch) : ch_( ch) { void send_hello() { /*...*/ ch_->send( /*...*/); private: channel * ch_; ; class recipient { public: recipient( channel * ch) : ch_( ch) { void dump_channel() { /*...*/ = ch_->receive(); /*...*/ private: channel * ch_; void do_it( sender &, receiver &); void do_it_all() { channel ch; sender s( & ch); recipient r( & ch); do_it( s, r); The need to use "&" in constructor parameters warns of long life of the reference "&" - converts reference to pointer "*" - converts pointer to reference Local variables are automatically destructed in the reverse order of construction NPRG041 Programování v C /2015 David Bednárek 103
104 Class holding a reference class sender { public: sender( channel & ch) : ch_( ch) { void send_hello() { /*...*/ ch_.send( /*...*/); private: channel & ch_; ; class recipient { public: recipient( channel & ch) : ch_( ch) { void dump_channel() { /*...*/ = ch_.receive(); /*...*/ private: channel & ch_; void do_it( sender &, receiver &); void do_it_all() { channel ch; sender s( ch); recipient r( ch); do_it( s, r); s and r will hold the reference to ch for their lifetime There is no warning of that! If references are held by locally allocated objects, everything is OK Destruction occurs in reverse order NPRG041 Programování v C /2015 David Bednárek 104
105 ERROR: Passing a reference to local object out of its scope class sender { public: sender( channel & ch) : ch_( ch) { void send_hello() { /*...*/ ch_.send( /*...*/); private: channel & ch_; ; class recipient { std::unique_ptr< sender> s; std::unique_ptr< recipient> r; void init() { channel ch; s.reset( new sender( ch)); r.reset( new recipient( ch)); public: recipient( channel & ch) : ch_( ch) { void dump_channel() { /*...*/ = ch_.receive(); /*...*/ private: channel & ch_; ch will die sooner than s and r s and r will access invalid object Fatal crash sooner or later Nothing warns of this behavior Prefer pointers in this case NPRG041 Programování v C /2015 David Bednárek 105
106 ERROR: Killing an object in use class sender { public: sender( channel & ch) : ch_( ch) { void send_hello() { /*...*/ ch_.send( /*...*/); private: channel & ch_; ; std::unique_ptr< channel> ch; void do_it() { ch.reset( new channel); sender s( ch.get()); recipient r( ch.get()); do_it( s, r); class recipient { public: recipient( channel & ch) : ch_( ch) { void dump_channel() { /*...*/ = ch_.receive(); /*...*/ private: channel & ch_; ch.reset( new channel); do_it( s, r); ch is destructed before s and r Fatal crash sooner or later Rare programming practice NPRG041 Programování v C /2015 David Bednárek 106
107 Allowing access temporarily channel ch; void send_hello() { std::unique_ptr< packet> p = new packet; p->set_contents( "Hello, world!"); ch.send( std::move( p)); // p is nullptr now void dump_channel() { while (! ch.empty() ) { std::unique_ptr< packet> m = ch.receive(); std::cout << m->get_contents(); // the packet is deallocated here class packet { ; void set_contents( const std::string & s); const std::string & get_contents() const; /*...*/ get_contents returns a reference to data stored inside the packet const prohibits modification How long the reference is valid? Probably until modification/destruction of the packet It will last at least during the statement containing the call Provided there is no other action on the packet in the same statement set_contents receives a reference to data stored elsewhere const prohibits modification the reference is valid throughout the call NPRG041 Programování v C /2015 David Bednárek 107
108 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 1: Lokální proměnná Complex & add( const Complex & a, const Complex & b) { Complex r( a.re + b.re, a.im + b.im); return r; BĚHOVÁ CHYBA: r zaniká při návratu z funkce
109 Returning by reference Functions which compute their return values must NOT return by reference the computed value usually differs from values of arguments the value of arguments must not be changed there is nothing that the reference might point to Invalid idea #1: Local variable Complex & add( const Complex & a, const Complex & b) { Complex r( a.re + b.re, a.im + b.im); return r; RUNTIME ERROR: r disappears during exit from the function before the calling statement can read it
110 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 2: Dynamická alokace Complex & add( const Complex & a, const Complex & b) { Complex * r = new Complex( a.re + b.re, a.im + b.im); return * r; PROBLÉM: kdo to odalokuje?
111 Returning by reference Functions which compute their return values must NOT return by reference the computed value usually differs from values of arguments the value of arguments must not be changed there is nothing that the reference might point to Invalid idea #2: Dynamic allocation Complex & add( const Complex & a, const Complex & b) { Complex * r = new Complex( a.re + b.re, a.im + b.im); return * r; PROBLEM: who will deallocate the object?
112 Vracení odkazem Funkce jako add nemůže vracet referenci add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Špatné řešení č. 3: Globální proměnná Complex g; Complex & add( const Complex & a, const Complex & b) { g = Complex( a.re + b.re, a.im + b.im); return g; CHYBA: globální proměnná je sdílená Complex a, b, c, d, e = add( add( a, b), add( c, d));
113 Returning by reference Functions which compute their return values must NOT return by reference the computed value usually differs from values of arguments the value of arguments must not be changed there is nothing that the reference might point to Invalid idea #3: Global variable Complex g; Complex & add( const Complex & a, const Complex & b) { g = Complex( a.re + b.re, a.im + b.im); return g; PROBLEM: the variable is shared Complex a, b, c, d, e = add( add( a, b), add( c, d));
114 Vracení odkazem Funkce jako add musí vracet hodnotou add vrací hodnotu různou od všech svých parametrů hodnotu parametrů nesmí měnit reference nemá na co ukazovat Správné řešení Complex add( const Complex & a, const Complex & b) { Complex r( a.re + b.re, a.im + b.im); return r; Zkrácený (ekvivalentní) zápis return Complex( a.re + b.re, a.im + b.im);
115 Returning by reference Functions which compute their return values must return by value the computed value usually differs from values of arguments the value of arguments must not be changed there is nothing that a reference might point to (The only) correct function interface: Complex add( const Complex & a, const Complex & b) { Complex r( a.re + b.re, a.im + b.im); return r; This body may be shortened to (equivalent by definition): return Complex( a.re + b.re, a.im + b.im);
116 Returning by reference Functions which enable access to existing objects may return by reference the object must survive the return from the function Example: template< typename T, std::size_t N> class array { public: T & at( std::size_t i) { return a_[ i]; private: T a_[ N]; ; Returning by reference may allow modification of the returned object array< int, 5> x; x.at( 1) = 2;
117 Returning by reference Functions which enable access to existing objects may return by reference Often there are two versions of such function template< typename T, std::size_t N> class array { public: Allowing modification of elements of a modifiable container T & at( std::size_t i) { return a_[ i]; Read-only access to elements of a read-only container const T & at( std::size_t i) const { return a_[ i]; private: T a_[ N]; ; void f( array< int, 5> & p, const array< int, 5> & q) { p.at( 1) = p.at( 2); int x = q.at( 3); // non-const version in BOTH cases // const version
118 Returning by reference Functions which enable access to existing objects may return by reference The object must survive the return from the function template< typename T> class vector { public: back returns the last element which will remain on the stack it may allow modification of the element T & back(); const T & back() const; this pop_back removes the last element from the stack and returns its value it must return by value - slow (and exception-unsafe) T pop_back(); therefore, in standard library, the pop_back function returns nothing void pop_back(); //... ;
119 STL Standard Template Library
120 STL Kontejnery Prefabrikáty základních datových struktur Šablony parametrizované typem ukládaného objektu Všechny kontejnery pracují s kopiemi vkládaných hodnot Typ hodnot musí mít alespoň copy-constructor a destruktor Některé druhy kontejnerů či operací s nimi vyžadují i operator= nebo konstruktor bez parametrů Hodnoty se přidávají a odebírají metodami odpovídajícími druhu kontejneru K hodnotám je možno přistupovat pomocí iterátoru, který reprezentuje inteligentní ukazatel dovnitř kontejneru Prostřednictvím iterátoru je možno měnit uložené hodnoty
121 STL Containers Generic data structures Based on arrays, linked lists, trees, or hash-tables Store objects of given type (template parameter) The container takes care of allocation/deallocation of the stored objects All objects must be of the same type (defined by the template parameter) Containers can not directly store polymorphic objects with inheritance New objects are inserted by copying/moving/constructing in place Containers can not hold objects created outside them Inserting/removing objects: Member functions of the container Reading/modifying objects: Iterators
122 STL Příklad #include <deque> typedef std::deque< int> my_deque; my_deque the_deque; the_deque.push_back( 1); the_deque.push_back( 2); the_deque.push_back( 3); int x = the_deque.front(); // 1 the_deque.pop_front(); my_deque::iterator ib = the_deque.begin(); my_deque::iterator ie = the_deque.end(); for ( my_deque::iterator it = ib; it!= ie; ++it) { *it = *it + 3; int y = the_deque.back(); // 6 the_deque.pop_back() int z = the_deque.back(); // 5
123 STL Sequential containers New objects are inserted in specified location array< T, N> - pole se staticky danou velikostí vector< T> - pole prvků s přidáváním zprava stack< T> - zásobník priority_queue< T> - prioritní fronta basic_string< T> - vektor s terminátorem string = basic_string< char> - řetězec (ASCII) wstring = basic_string< wchar_t> - řetězec (Unicode) deque< T> - fronta s přidáváním a odebíráním z obou stran queue< T> - fronta (maskovaná deque) forward_list< T> - jednosměrně vázaný seznam list< T> - obousměrně vázaný seznam
124 STL Sequential containers New objects are inserted in specified location array< T, N> - fixed-size array (no insertion/removal) vector< T> - array, fast insertion/removal at the back end stack< T> - insertion/removal only at the top (back end) priority_queue< T> - priority queue (heap implemented in vector) basic_string< T> - vektor s terminátorem string = basic_string< char> wstring = basic_string< wchar_t> deque< T> - fast insertion/removal at both ends queue< T> - FIFO (insert to back, remove from front) forward_list< T> - linked list list< T> - doubly-linked list
125 STL - Kontejnery Asociativní kontejnery Uspořádané (samovyvažující se stromy) set<t> - množina multiset<t> - množina s opakováním map<k,t> - asociativní pole, tj. parciální zobrazení K -> T multimap<k,t> - relace s rychlým vyhledáváním podle klíče K Hashované unordered_set<t> - množina unordered_multiset<t> - množina s opakováním unordered_map<k,t> - asociativní pole, tj. parciální zobrazení K -> T unordered_multimap<k,t> - relace s rychlým vyhledáváním podle klíče K pair<a,b> - pomocná šablona uspořádané dvojice s položkami first, second
126 STL Associative containers New objects are inserted at a position defined by their properties sets: type T must define ordering relation or hash function maps: stored objects are of type pair< const K, T> type K must define ordering or hash multi-: multiple objects with the same (equivalent) key value may be inserted Ordered (implemented usually by red-black trees) set<t> multiset<t> map<k,t> multimap<k,t> Hashed unordered_set<t> unordered_multiset<t> unordered_map<k,t> unordered_multimap<k,t>
127 STL - Kontejnery Uspořádané kontejnery vyžadují uspořádání na klíčích Vystačí si s operací < V nejjednodušším případě to funguje samo std::map< std::string, int> mapa; Pokud typ uspořádání nemá, lze jej definovat obecně bool operator<( const Klic & a, const Klic & b) { return...; std::map< Klic, int> mapa; Pokud obecná definice uspořádání nevyhovuje, lze definovat uspořádání funktorem pouze pro daný typ kontejneru struct Usporadani { ; bool operator()( const Klic & a, const Klic & b) const { return...; std::map< Klic, int, Usporadani> mapa; Pokud různé instance kontejneru mají mít různé uspořádání, lze do funktoru doplnit datové položky struct Usporadani { Usporadani( bool a); /*...*/ bool ascending; ; std::map< Klic, int, Usporadani> mapa( Usporadani( true));
128 STL - Ordered Containers Ordered containers require ordering relation on the key type Only < is used (no need to define >, <=, >=, ==,!=) In simplest cases, the type has a built-in ordering std::map< std::string, my_value> my_map; If not built-in, ordering may be defined using a global function bool operator<( const my_key & a, const my_key & b) { return /*...*/; std::map< my_key, my_value> mapa; If global definition is not appropriate, ordering may be defined using a functor struct my_functor { bool operator()( const my_key & a, const my_key & b) const { return /*...*/; ; std::map< my_key, my_value, my_functor> my_map; If the ordering has run-time parameters, the functor will carry them struct my_functor { my_functor( bool a); /*...*/ bool ascending; ; std::map< my_key, my_value, my_functor> my_map( my_functor( true));
129 STL - Kontejnery Uspořádání na klíčích hashující kontejnery Kontejner vyžaduje funktory pro hashování a pro porovnání template< typename K> class hash { public: std::size_t operator()( const K & a) const { /*...*/ ; template< typename K> class equal_to { public: bool operator()( const K & a, const K & b) const { return a == b; ; Šablona kontejneru má dva další parametry template< typename K, typename T, typename H = std::hash< K>, typename E = std::equal_to< K> > class unordered_map; Konstruktor kontejneru dostává hodnoty funktorů explicit unordered_map( std::size_t initial_bucket_count = /*...*/, const H & h = L(), const E & e = E());
130 STL - Unordered containers Hashed containers require two functors: hash function and equality comparison struct my_hash { ; std::size_t operator()( const my_key & a) const { /*...*/ struct my_equal { public: ; bool operator()( const my_key & a, const my_key & b) const { /*return a == b;*/ std::unordered_map< my_key, my_value, my_hash, my_equal> my_map; If not explicitly defined by container template parameters, hashed containers try to use generic functors defined in the library std::hash< K> std::equal_to< K> Defined for numeric types, strings, and some other library types std::unordered_map< std::string, my_value> my_map;
131 STL Iterátory Metody kontejneru, vracející iterátory Odkaz na začátek kontejneru - první platný prvek iterator begin() const_iterator begin() const Odkaz za konec kontejneru - za poslední platný prvek iterator end() const_iterator end() const iterator a const_iterator jsou typy definované uvnitř kontejneru, zvané iterátory přístupné konstrukcemi jako vector< int>::iterator vlastnosti iterátorů jsou mírně závislé na druhu kontejneru Iterátor kontejneru obsahujícího typ T je třída s operátory definovanými tak, aby se chovala podobně jako "T *" "(ukazatel na typ T) resp. "const T *" Vytváří se tak iluze, že kontejner je pole
132 STL Iterators Each container defines two member types: iterator and const_iterator using my_container = std::map< my_key, my_value>; using my_iterator = my_container::iterator; using my_const_iterator = my_container::const_iterator; Iterators act like pointers to objects inside the container objects are accessed using operators *, -> const_iterator does not allow modification of the objects An iterator may point to an object inside the container to an imaginary position behind the last object: end()
133 STL Iterators void example( my_container & c1, const my_container & c2) { Every container defines functions to access both ends of the container begin(), cbegin() - the first object (same as end() if the container is empty) end(), cend() - the imaginary position behind the last object my_iterator i1 = begin( c1); // also c1.begin() my_const_iterator i2 = cbegin( c1); my_const_iterator i3 = cbegin( c2); // also c1.cbegin(), begin( c1), c1.begin() // also c2.cbegin(), begin( c2), c2.begin() Associative containers allow searching find( k) - first object equal (i.e. not less and not greater) to k, end() if not found lower_bound( k) - first object not less than k, end() if not found upper_bound( k) - first object greater than k, end() if not found my_key k = /*...*/; my_iterator i4 = c1.find( k); my_const_iterator i5 = c2.find( k); Iterators may be shifted to neighbors in the container all iterators allow shifting to the right and equality comparison for ( my_iterator i6 = c1.begin(); i6!= c1.end(); ++ i6 ) { /*...*/ bidirectional iterators (all containers except forward_list) allow shifting to the left -- i1; random access iterators (vector, string, deque) allow addition/subtraction of integers, difference and comparison my_container::difference_type delta = i4 - c1.begin(); // number of objects left to i4 my_iterator i7 = c1.end() - delta; // the same distance from the opposite end if ( i4 < i7 ) my_value v = i4[ delta].second; // same as (*(i4 + delta)).second, (i4 + delta)->second
134 STL Iterators Caution: Shifting an iterator before begin() or after end() is illegal for (my_iterator it = c1.end(); it >= c1.begin(); -- it) // ERROR: underruns begin() Comparing iterators associated to different (instances of) containers is illegal if ( c1.begin() < c2.begin() ) // ILLEGAL Insertion/removal of objects in vector/basic_string/deque invalidate all associated iterators The only valid iterator is the one returned from insert/erase std::vector< std::string> c( 10, "dummy"); auto it = c.begin() + 5; // the sixth dummy std::cout << * it; auto it2 = c.insert( std::begin(), "first"); std::cout << * it; it2 += 6; // CRASH // the sixth dummy c.push_back( "last"); std::cout << * it2; // CRASH
135 STL Insertion/deletion Containers may be filled immediately upon construction using n copies of the same object std::vector< std::string> c1( 10, "dummy"); or by copying from another container std::vector< std::string> c2( c1.begin() + 2, c1.end() - 2); Expanding containers - insertion insert - copy or move an object into container emplace - construct a new object (with given parameters) inside container Sequential containers position specified explicitly by an iterator new object(s) will be inserted before this position c1.insert( c1.begin(), "front"); c1.insert( c1.begin() + 5, "middle"); c1.insert( c1.end(), "back"); // same as c1.push_back( "back");
136 STL insertion/deletion insert by copy slow if copy is expensive std::vector< std::vector< int>> c3; not applicable if copy is prohibited std::vector< std::unique_ptr< T>> c4; insert by move explicitly using std::move std::unique_ptr< T> p( new T); c4.push_back( std::move( p)); implicitly when argument is rvalue (temporal object) c3.insert( begin( c3), std::vector< int>( 100, 0)); emplace constructs a new element from given arguments c4.emplace_back( new T); c3.insert( begin( c3), 100, 0);
137 STL insertion/deletion Shrinking containers - erase/pop single object my_iterator it = /*...*/; c1.erase( it); c2.erase( c2.end() - 1); // same as c2.pop_back(); range of objects my_iterator it1 = /*...*/, it2 = /*...*/; c1.erase( it1, it2); c2.erase( c2.begin(), c2.end()); // same as c2.clear(); by key (associative containers only) my_key k = /*...*/; c3.erase( k);
138 Algoritmy
139 Algorithms
140 Algoritmy Sada generických funkcí pro práci s kontejnery cca 90 funkcí od triviálních po sort, make_heap, set_intersection,... #include <algorithm> Kontejnery se zpřístupňují nepřímo - pomocí iterátorů Obvykle pomocí dvojice iterátorů - polouzavřený interval Lze pracovat s výřezem kontejneru Je možné použít cokoliv, co se chová jako iterátor požadované kategorie Některé algoritmy kontejner pouze čtou Typicky vracejí iterátor Např. hledání v setříděných sekvenčních kontejnerech Většina algoritmů modifikuje objekty v kontejneru Kopírování, přesun (pomocí std::move), výměna (pomocí std::swap) Aplikace uživatelem definované akce (funktor) Iterátory neumožňují přidávání/odebírání objektů v kontejneru Pro "nové" prvky musí být předem připraveno místo Odebrání nepotřebných prvků musí provést uživatel dodatečně
141 Algorithms Set of generic functions working on containers cca 90 functions, trivial or sophisticated (sort, make_heap, set_intersection,...) #include <algorithm> Containers are accessed indirectly - using iterators Typically a pair of iterator specifies a range inside a container Algorithms may be run on complete containers or parts Anything that looks like an iterator may be used Some algorithms are read-only The result is often an iterator E.g., searching in non-associative containers Most algorithms modify the contents of a container Copying, moving (using std::move), or swapping (pomocí std::swap) elements Applying user-defined action on elements (defined by functors) Iterators does not allow insertion/deletion of container elements The space for "new" elements must be created before calling an algorithm Removal of unnecessary elements must be done after returning from an algorithm
142 Algoritmy Iterátory neumožňují přidávání/odebírání objektů v kontejneru Pro "nové" prvky musí být předem připraveno místo my_container c2( c1.size(), 0); std::copy( c1.begin(), c1.end(), c2.begin()); Tento příklad lze zapsat bez algoritmů jako my_container c2( c1.begin(), c1.end()); Odebrání nepotřebných prvků musí provést uživatel dodatečně auto my_predicate = /*...*/; // some condition my_container c2( c1.size(), 0); // max size my_iterator it2 = std::copy_if( c1.begin(), c1.end(), c2.begin(), my_predicate); c2.erase( it2, c2.end()); // shrink to really required size my_iterator it1 = std::remove_if( c1.begin(), c1.end(), my_predicate); c1.erase( it1, c1.end()); // really remove unnecessary elements
143 Algorithms Iterators does not allow insertion/deletion of container elements The space for "new" elements must be created before calling an algorithm my_container c2( c1.size(), 0); std::copy( c1.begin(), c1.end(), c2.begin()); Note: This example does not require algorithms: my_container c2( c1.begin(), c1.end()); Removal of unnecessary elements must be done after returning from an algorithm auto my_predicate = /*...*/; // some condition my_container c2( c1.size(), 0); // max size my_iterator it2 = std::copy_if( c1.begin(), c1.end(), c2.begin(), my_predicate); c2.erase( it2, c2.end()); // shrink to really required size my_iterator it1 = std::remove_if( c1.begin(), c1.end(), my_predicate); c1.erase( it1, c1.end()); // really remove unnecessary elements
144 STL Algoritmy Falešné iterátory Algoritmy dovedou pracovat s čímkoliv, co napodobuje iterátor Požadavky algoritmu na iterátory definovány pomocí kategorií Input, Output, Forward, Bidirectional, RandomAccess Každý iterátor musí prozradit svou kategorii a další vlastnosti std::iterator_traits Některé algoritmy se přizpůsobují kategorii svých parametrů (std::distance) Insertery my_container c2; // empty auto my_inserter = std::back_inserter( c2); std::copy_if( c1.begin(), c1.end(), my_inserter, my_predicate); Textový vstup/výstup auto my_inserter2 = std::ostream_iterator< int>( std::cout, " "); std::copy( c1.begin(), c1.end(), my_inserter2);
145 STL Algorithms Fake iterators Algorithms may accept anything that works like an iterator The required functionality is specified by iterator category Input, Output, Forward, Bidirectional, RandomAccess Every iterator must specify its category and some other properties std::iterator_traits Some algorithms change their implementation based on the category (std::distance) Inserters my_container c2; // empty auto my_inserter = std::back_inserter( c2); std::copy_if( c1.begin(), c1.end(), my_inserter, my_predicate); Text input/output auto my_inserter2 = std::ostream_iterator< int>( std::cout, " "); std::copy( c1.begin(), c1.end(), my_inserter2);
146 Funktory NPRG041 Programování v C /2015 David Bednárek 146
147 Functors NPRG041 Programování v C /2015 David Bednárek 147
148 STL Funktory Příklad - funkce for_each template<class InputIterator, class Function> Function for_each( InputIterator first, InputIterator last, Function f) { for (; first!= last; ++first) f( * first); return f; f je cokoliv, co lze zavolat syntaxí f(x) globální funkce (ukazatel na funkci), nebo funktor, tj. třída obsahující operator() Funkce f (případně metoda operator()) je zavolána na každý prvek v zadaném intervalu prvek se předává jako * iterator, což může být odkazem funkce f tedy může modifikovat prvky seznamu
149 STL Functors Example - for_each template<class InputIterator, class Function> Function for_each( InputIterator first, InputIterator last, Function f) { for (; first!= last; ++first) f( * first); return f; f may be anything that has the function call operator f(x) a global function (pointer to function), or a functor, i.e. a class containing operator() The function f (its operator()) is called for each element in the given range The element is accessed using the * operator which typically return a reference The function f can modify the elements of the container
150 STL Algoritmy Jednoduché použití funkce for_each void my_function( double & x) { x += 1; void increment( std::list< double> & c) { std::for_each( c.begin(), c.end(), my_function); [C++11] Lambda Nová syntaktická konstrukce generující funktor void increment( std::list< double> & c) { for_each( c.begin(), c.end(), []( double & x){ x += 1;);
151 STL Algorithms A simple application of for_each void my_function( double & x) { x += 1; void increment( std::list< double> & c) { std::for_each( c.begin(), c.end(), my_function); [C++11] Lambda New syntax construct - generates a functor void increment( std::list< double> & c) { for_each( c.begin(), c.end(), []( double & x){ x += 1;);
152 STL Algoritmy Předávání parametrů vyžaduje funktor class my_functor { public: double v; void operator()( double & x) const { x += v; my_functor( double p) : v( p) { ; void add( std::list< double> & c, double value) { std::for_each( c.begin(), c.end(), my_functor( value)); Lambda s přístupem k lokální proměnné void add( std::list< double> & c, double value) { std::for_each( c.begin(), c.end(), [value]( double & x){ x += value;);
153 STL Algorithms Passing parameters requires a functor class my_functor { public: double v; void operator()( double & x) const { x += v; my_functor( double p) : v( p) { ; void add( std::list< double> & c, double value) { std::for_each( c.begin(), c.end(), my_functor( value)); Equivalent implementation using lambda void add( std::list< double> & c, double value) { std::for_each( c.begin(), c.end(), [value]( double & x){ x += value;);
154 STL Algoritmy Funktory modifikující svůj obsah class my_functor { public: double s; void operator()( const double & x) { s += x; my_functor() : s( 0.0) { ; double sum( const std::list< double> & c) { my_functor f = std::for_each( c.begin(), c.end(), my_functor()); return f.s; Lambda s referencí na lokální proměnnou double sum( const std::list< double> & c) { double s = 0.0; for_each( c.begin(), c.end(), [& s]( const double & x){ s += x;); return s;
155 STL Algoritmy A functor may modify its contents class my_functor { public: double s; void operator()( const double & x) { s += x; my_functor() : s( 0.0) { ; double sum( const std::list< double> & c) { my_functor f = std::for_each( c.begin(), c.end(), my_functor()); return f.s; Using lambda (the generated functor contains a reference to s) double sum( const std::list< double> & c) { double s = 0.0; for_each( c.begin(), c.end(), [& s]( const double & x){ s += x;); return s;
156 Lambda
157 Lambda výrazy Lambda výraz [ capture ]( params ) mutable -> rettype { body Deklaruje třídu ve tvaru class ftor { public: ftor( TList... plist) : vlist( plist)... { rettype operator()( params ) const { body private: ; TList... vlist; vlist je určen proměnnými použitými v body TList je určen jejich typy a upraven podle capture operator() je const pokud není uvedeno mutable Lambda výraz je nahrazen vytvořením objektu ftor( vlist...) C++11
158 Lambda expressions Lambda expression [ capture ]( params ) mutable -> rettype { body Declares a class class ftor { public: ftor( TList... plist) : vlist( plist)... { rettype operator()( params ) const { body private: ; TList... vlist; vlist determined by local variables used in the body TList determined by their types and adjusted by capture operator() is const if mutable not present The lambda expression corresponds to creation of an anonymous object ftor( vlist...) C++11
159 Lambda výrazy návratový typ a typ funkce C++11 Návratový typ operátoru Explicitně definovaný návratový typ []() -> int { /* */ Automaticky určen pro tělo lambda funkce ve tvaru []() { return V; Jinak void
160 Lambda expressions return types C++11 Return type of the operator() Explicitly defined []() -> int { /* */ Automatically derived if body contains just one return statement []() { return V; void otherwise
161 Lambda výrazy capture Capture Způsob zpřístupnění vnějších entit lokální proměnné this Určuje typy datových položek a konstruktoru funktoru Explicitní capture Programátor vyjmenuje všechny vnější entity v capture C++11 [a,&b,c,&d,this] entity označené & předány odkazem, ostatní hodnotou Implicitní capture Překladač sám určí vnější entity, capture určuje způsob předání [=] [=,&b,&d] předání hodnotou, vyjmenované výjimky odkazem [&] [&,a,c] předání odkazem, vyjmenované výjimky hodnotou
162 Lambda expressions capture Capture Defines which external variables are accessible and how local variables in the enclosing function this, if used in a member function Determines the data members of the functor Explicit capture The external variables explicitly listed in capture C++11 [a,&b,c,&d,this] [=] variables marked & passed by reference, the others by value Implicit capture The required external variables determined automatically by the compiler, capture defines the mode of passing [=,&b,&d] passed by value, the listed exceptions by reference [&] [&,a,c] passed by reference, the listed exceptions by value
163 Konstruktory a destruktory Constructors and Destructors
164 Constructors and destructors Constructors and Destructors
165 Konstruktory a destruktory Konstruktor třídy T je metoda se jménem T Typ návratové hodnoty se neurčuje Konstruktorů může být více, liší se parametry Nesmí být virtuální Konstruktor je volán vždy, když vzniká objekt typu T Parametry se zadávají při vzniku objektu Některé z konstruktorů mají speciální význam Některé z konstruktorů může generovat sám kompilátor Konstruktor nelze vyvolat přímo Destruktor třídy je metoda se jménem ~T Nesmí mít parametry ani návratovou hodnotu Může být virtuální Destruktor je volán vždy, když zaniká objekt typu T Destruktor může generovat sám kompilátor Destruktor lze vyvolat přímo pouze speciální syntaxí
166 Constructors and destructors Constructor of class T is a method named T Return type not specified More than one constructor may exist with different arguments Never virtual A constructor is called whenever an object of the type T is created Constructor parameters specified in the moment of creation Some constructors have special meaning Some constructors may be generated by the compiler Constructors cannot be called directly Destructor of class T is a method named ~T No arguments, no return value May be virtual The destructor is called whenever an object of the type T is destroyed The destructors may be generated by the compiler Explicit call must use special syntax
Programování v C++ NPRG041 Programování v C /2016 David Bednárek
Programování v C++ NPRG041 Programování v C++ - 2015/2016 David Bednárek 1 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období... 3. pokusy
Programování v C++ NPRG041 Programování v C++ - 2015/2016 David Bednárek
Programování v C++ NPRG041 Programování v C++ - 2015/2016 David Bednárek 1 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období... 3. pokusy
2011 Jan Janoušek BI-PJP. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE TRANSFORMACE GRAMATIK NA LL(1) GRAMATIKU. TABULKA SYMBOLŮ. VNITŘNÍ REPREZENTACE: AST. JAZYK ZÁSOBNÍKOVÉHO POČÍTAČE. RUNTIME PROSTŘEDÍ. 2011 Jan Janoušek BI-PJP Evropský
PROGRAMOVÁNÍ V C++ CVIČENÍ
PROGRAMOVÁNÍ V C++ CVIČENÍ INFORMACE Michal Brabec http://www.ksi.mff.cuni.cz/ http://www.ksi.mff.cuni.cz/~brabec/ brabec@ksi.mff.cuni.cz gmichal.brabec@gmail.com PODMÍNKY ZÁPOČTU Základní podmínky společné
Ú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í
IUJCE 07/08 Přednáška č. 1
Úvod do předmětu Literatura Záznamy přednášek a vaše poznámky Harbison, S. P., Steele, G. L.: Referenční příručka jazyka C Herout, P.: Učebnice jazyka C Kernighan, B. W., Ritchie, D. M.: The C Programming
Programování v C++ NPRG041 Programování v C /2017 David Bednárek
Programování v C++ NPRG041 Programování v C++ - 2016/2017 David Bednárek 1 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období... 3. pokusy
Programování v C++ NPRG041 Programování v C /2017 David Bednárek
Programování v C++ NPRG041 Programování v C++ - 2016/2017 David Bednárek 1 Zápočty Základní podmínky společné všem skupinám Úspěšné složení zápočtového testu 1. a 2. pokusy ve zkouškovém období... 3. pokusy
MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Stručný úvod do programování v jazyce C 2.díl. České vysoké učení technické Fakulta elektrotechnická
MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY Stručný úvod do programování v jazyce C 2.díl České vysoké učení technické Fakulta elektrotechnická A1B14MIS Mikroprocesory pro výkonové systémy 07 Ver.1.10 J. Zděnek,
PB161 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]()?
IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí
Velké projekty v C velký = 100ky a více řádek udržovatelnost, bezpečnost, přehlednost kódu rozdělení programu do více souborů další prvky globální proměnné, řízení viditelnosti proměnných, funkcí Globální
Programování v C++ David Bednárek. www.ksi.mff.cuni.cz/~bednarek
Programování v C++ David Bednárek www.ksi.mff.cuni.cz/~bednarek Pravidla studia NPRG041 2/2 Z,Zk Zápis na cvičení Elektronický zápis do jednotlivých skupin is.cuni.cz/studium Zápis předmětů a rozvrhu -
PB161 Programování v jazyce C++ Přednáška 8
.. PB161 Programování v jazyce C++ Přednáška 8 Výjimky Správa prostředků (RAII) Nikola Beneš 9. listopadu 2015 PB161 přednáška 8: výjimky, RAII 9. listopadu 2015 1 / 24 . PB161 přednáška 8: výjimky, RAII
PB161 Programování v jazyce C++ Přednáška 10
PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 27. listopadu 2017 PB161 přednáška 10: šablony 27. listopadu 2017 1 / 33 Šablony PB161 přednáška 10: šablony 27. listopadu 2017 2 / 33
Čipové karty Lekařská informatika
Čipové karty Lekařská informatika Následující kód je jednoduchou aplikací pro čipové karty, která po překladu vytváří prostor na kartě, nad kterým jsou prováděny jednotlivé operace a do kterého jsou ukládány
MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Stručný úvod do programování v jazyce C 1.díl. České vysoké učení technické Fakulta elektrotechnická
MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY Stručný úvod do programování v jazyce C 1.díl České vysoké učení technické Fakulta elektrotechnická A1B14MIS Mikroprocesory pro výkonové systémy 06 Ver.1.10 J. Zděnek,
PB161 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
2. Entity, Architecture, Process
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Praktika návrhu číslicových obvodů Dr.-Ing. Martin Novotný Katedra číslicového návrhu Fakulta informačních technologií ČVUT v Praze Miloš
David Bednárek Jakub Yaghob Filip Zavoral. http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html
David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html Interoperabilita C++ a C, dll, C++ a.net, C++/CLI Nové normy a knihovny C++11/14/17, lambda výrazy,
IUJCE 07/08 Přednáška č. 6
Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak
ADT/ADS = abstraktní datové typy / struktury
DT = datové typy obor hodnot, které může proměnná nabývat, s operacemi na tomto oboru určen: obor hodnot + výpočetní operace např. INT = { 2 147 483 648 až +2 147 483 647} + {+,,*,/,} ADT/ADS = abstraktní
PB161 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
PB161 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
PREPROCESOR 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,
Ú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
Ú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
Chapter 7: Process Synchronization
Chapter 7: Process Synchronization Background The Critical-Section Problem Synchronization Hardware Semaphores Classical Problems of Synchronization Critical Regions Monitors Synchronization in Solaris
Programová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
Michal 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ů
Doporučené postupy. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze
Doporučené postupy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Hořeňovský, Aleš Hrabalík a Martin
Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++
Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++ Objektové programování Objektový přístup data a metody pro manipulaci s nimi jsou sdruženy společně v rámci jedné entity Objektové
14.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í
Šablony, kontejnery a iterátory
7. října 2010, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 21 Šablona funkce/metody Šablona je obecný popis (třídy, funkce) bez toho, že by
Jazyk 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
GUIDELINES FOR CONNECTION TO FTP SERVER TO TRANSFER PRINTING DATA
GUIDELINES FOR CONNECTION TO FTP SERVER TO TRANSFER PRINTING DATA What is an FTP client and how to use it? FTP (File transport protocol) - A protocol used to transfer your printing data files to the MAFRAPRINT
př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 - operátor je speciální
Michal 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ů
př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
Šablony, kontejnery a iterátory
11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
Zá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č
PB přednáška (23. listopadu 2015)
PB161 10. přednáška (23. listopadu 2015) Šablony Motivace snaha o co nejmenší duplikaci kódu co když máme kód, který chceme použít pro různé typy? generická funkce (maximum, minimum, swap, ) kontejnery
Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016
Preprocesor Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
x86 assembler and inline assembler in GCC
x86 assembler and inline assembler in GCC Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0 Useful instructions mov moves data between registers and memory mov $1,%eax # move 1 to register
Datové 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ř.
Jazyk C++, některá rozšíření oproti C
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra
Jazyk 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()
Programování v C++ 1, 1. cvičení
Programování v C++ 1, 1. cvičení opakování látky ze základů 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 1 2 Shrnutí procvičených
Jazyk 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&
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
Michal 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ů
Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016
ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce
Obsah. 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é
PB161 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
<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************
zdroje/zdroje.xml
Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Enterprise Java
Programovací jazyk C++ Hodina 1
Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor
Compression of a Dictionary
Compression of a Dictionary Jan Lánský, Michal Žemlička zizelevak@matfyz.cz michal.zemlicka@mff.cuni.cz Dept. of Software Engineering Faculty of Mathematics and Physics Charles University Synopsis Introduction
Koncepce (větších) programů. Základy programování 2 Tomáš Kühr
Koncepce (větších) programů Základy programování 2 Tomáš Kühr Parametry a návratová hodnota main Již víme, že main je funkce A také tušíme, že je trochu jiná než ostatní funkce v programu Funkce main je
Ukazatele, dynamická alokace
Ukazatele, dynamická alokace Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Mazanec Karel Richta,
Úvod do programování v jazyce Java
Úvod do programování v jazyce Java Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci 5. říjen, 2011 Petr Krajča (UP) KMI/UP3J: Seminář I. 5.10.2011 1 / 17 Organizační informace email: petr.krajca@upol.cz
Objektově 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
Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze
Dynamika objektů Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský, Aleš Hrabalík,
Generické 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 =
11. Přehled prog. jazyků
Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 11 1 Základy algoritmizace 11. Přehled prog. jazyků doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze
Abstraktní datové typy, moduly
Abstraktní datové typy, moduly BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních
Jazyk 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í
Mě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
Anglický text: Lesson 8: Class Inheritance
Ukázka odborného technického překladu. Zdroj původního textu: http://www.csharpstation.com/tutorials/lesson08.aspx Poznámka k překladům příkladů: Za normálních okolností by samozřejmně bylo lepší v úryvcích
2 Axiomatic Definition of Object 2. 3 UML Unified Modelling Language Classes in UML Tools for System Design in UML 5
Contents Contents 1 Semestrální práce 1 2 Axiomatic Definition of Object 2 3 UML Unified Modelling Language 2 3.1 Classes in UML............................ 3 4 Tools for System Design in UML 5 5 Student
Dynamic programming. Optimal binary search tree
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Dynamic programming Optimal binary search tree Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), The complexity
Programová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
Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.
Architektura COM 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 Historie Component Object Model (COM)
Funkční objekty v C++.
Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční
Pokroč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é
Programová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
Introduction to MS Dynamics NAV
Introduction to MS Dynamics NAV (Item Charges) Ing.J.Skorkovský,CSc. MASARYK UNIVERSITY BRNO, Czech Republic Faculty of economics and business administration Department of corporate economy Item Charges
Ú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
PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK
PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK ČÍSLO OPERAČNÍHO PROGRAMU: CZ.1.07 NÁZEV OPERAČNÍHO PROGRAMU: VZDĚLÁVÁNÍ PRO KONKURENCESCHOPNOST OPATŘENÍ:
Algoritmizace a programování
Algoritmizace a programování Strukturované proměnné Struktura, union Jazyk C České vysoké učení technické Fakulta elektrotechnická A8B14ADP Jazyk C - Strukturované proměnné Ver.1.10 J. Zděnek 20151 Struktura
Abstraktní třídy, polymorfní struktury
Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství
ZPRO v "C" Ing. Vít Hanousek. verze 0.3
verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout
Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz
Semestrální práce z předmětu KIV/UPA Jan Bařtipán / A03043 bartipan@studentes.zcu.cz Zadání Program přečte ze vstupu dvě čísla v hexadecimálním tvaru a vypíše jejich součet (opět v hexadecimální tvaru).
Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo
Statické proměnné a metody Tomáš Pitner, upravil Marek Šabo Úvod Se statickou metodou jsme se setkali už u úplně prvního programu - Hello, world! public class Demo { public static void main(string[] args)
Jakub Č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
Programová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
Postup objednávky Microsoft Action Pack Subscription
Postup objednávky Microsoft Action Pack Subscription DŮLEŽITÉ: Pro objednání MAPS musíte být členem Microsoft Partner Programu na úrovni Registered Member. Postup registrace do Partnerského programu naleznete
PB161 Programování v jazyce C++ Přednáška 2
PB161 Programování v jazyce C++ Přednáška 2 Základy objektů Reference, const Nikola Beneš 25. září 2018 PB161 přednáška 2: objekty, reference, const 25. září 2018 1 / 30 Jak funguje std::vector? (pro zvídavé)
Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016
Správa paměti Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016 Objektové modelování, B36OMO 10/2016, Lekce 2 https://cw.fel.cvut.cz/wiki/courses/xxb36omo/start
PB161 Programování v jazyce C++ Přednáška 5
PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Nikola Beneš 16. října 2017 PB161 přednáška 5: práce s pamětí, princip RAII 16. října 2017 1 / 25 Práce s pamětí PB161 přednáška
Jazyk 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ýrazy, operace, příkazy
Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,
David Bednárek Jakub Yaghob Filip Zavoral.
David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html C++ a vlastní C moduly obj, lib, dll/so jak linkovat C a C++ moduly jak dělat společné C/C++ headery
Jak importovat profily do Cura (Windows a
Jak importovat profily do Cura (Windows a macos) Written By: Jakub Dolezal 2019 manual.prusa3d.com/ Page 1 of 10 Step 1 Stažení Cura profilů V tomto návodu se dozvíte, jak importovat a aktivovat nastavení
Odvozené a strukturované typy dat
Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu
NPRG031 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
DTP Základy programování Úvod do předmětu
DTP Základy programování 01 - Úvod do předmětu Úvod Co již umíte? Plán předmětu Studijní materiály Způsob ukončení předmětu Základní pojmy I. Řešený problém: Řešeným nebo zpracovávaným problémem je konkrétní
Matematika v programovacích
Matematika v programovacích jazycích Pavla Kabelíková am.vsb.cz/kabelikova pavla.kabelikova@vsb.cz Úvodní diskuze Otázky: Jaké programovací jazyky znáte? S jakými programovacími jazyky jste již pracovali?
Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013
Předměty Algoritmizace a programování Seminář z programování Verze pro akademický rok 2012/2013 Verze pro akademický rok 2012/2013 1 Přednášky Jiřina Královcová MTI, přízemí budovy A Tel: 48 53 53 521
PB161 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