Úvod do programování v C++

Embed Size (px)

DESCRIPTION

Používání základních příkazů

Citation preview

  • 18. unora 2015, BrnoPripravil: David Prochazka

    Zaklady programovan v C++Programovac jazyk C++

  • Historie C++: od Fortranu po C++11 Strana 2 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Historie C++: od Fortranu po C++11 Strana 3 / 53

    Trocha historie nikoho nezabije...

    Na pocatku bylo slovo, to slovo bylo... FortranLze ho povazovat za jeden z prvnch programovacchjazyku soucasneho typu.Dodnes je jeho nova verze pouzvana pro programovanruznych matematickych uloh.Jazyku postupne pribyvalo... Simula, Cobol, LISP, Prolog,Smalltalk, C...Fortran inspiroval Algol, Algol CPL, CPL BPL, BCPL,BCPL B, B C

  • Historie C++: od Fortranu po C++11 Strana 4 / 53

    Jazyk C

    Nzkourovnovy jazyk.Systemovy jazyk.Operacn systemy, prekladace, drivery.Rozsahle moznosti dky knihovnam.Nizs efektivita vyvoje vyvazena rychlym a elegantnmkodem a velkymi moznostmi.Implementace OOP podle Smalltalku Objective C.

  • Historie C++: od Fortranu po C++11 Strana 5 / 53

    Jazyk C++

    Od zakladu zameren na OOP.Rychlejs vyvoj aplikac oproti C.Spousta IDE Code::Blocks, Microsoft Visual Studio,Eclipse, Qt Creator, XCode (MacOS X) . . . a prekladacuGCC, LLVM, IBM, MsVzor pro dals OO jazyky Java, C#.

  • Historie C++: od Fortranu po C++11 Strana 6 / 53

    Historie C/C++

    1972 Ritchie, Thomson (pro OS Unix)1978 specifikace Ritchie, Kerninghan1984 prvn standardizace ANSI C1990 definitivn standardizace ANSI C1980 C with Classes (prvn pokus o budouc C++)1983 C++1998, 2003 standardizace ANSI/ISO C++2011 standardizace C++11 (drve C++0x)

  • Historie C++: od Fortranu po C++11 Strana 7 / 53

    C++11

    Kompatibilita s C++98,tenky zaklad rozsreny zejmena prostrednictvm STL,duraz na vykon a prmou praci s hadwarem,zlepsen vcevlaknoveho a generickeho programovan,doplneny pozadovane vlastnosti konkurence: rozsahovefor cykly, podpora UTF-8/16/32. . .nove elegantn konstrukce: lambda vyrazy, regularnvyrazy, silne typove vycty, uzivatelem definovane literalyatp.

    http://en.wikipedia.org/wiki/C++11

    http://en.wikipedia.org/wiki/C++11

  • Historie C++: od Fortranu po C++11 Strana 8 / 53

    Je uz C++ idealn volbou?

    NE

    Idealn univerzaln jazyk neexistuje.Ale Je to stabiln, odladeny jazyk obsahujc vetsinu

    modernch nastroju.Je podporovany prakticky na vsech platformach.Ackoliv je relativne vysokourovnovy, je rychly.Nehod se na vsechno napr. zpracovan textu.Nen tak pohodlny mj. silne typovy.

  • Pripomenut zakladu OOP v C++ Strana 9 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Pripomenut zakladu OOP v C++ Strana 10 / 53

    Pripomenut trivialn aplikace

    1 class Car{

    2 private: // soukroma cast

    3 string m_model;

    4 public: // verejne rozhrani

    5 Car(string model){ // konstruktor

    6 m_model = model;

    7 }

    8

    9 string getModel (){

    10 return m_model;

    11 }

    12

    13 void setModel(string model){

    14 m_model = model;

    15 }

    16 };

  • Pripomenut zakladu OOP v C++ Strana 11 / 53

    Pripomenut trivialn aplikace

    1 int main(void) {

    2 // vytvoreni promenne s ukazatelem

    3 Car* ford;

    4

    5 // vytvoreni objektu a prirazeni uk.

    6 ford = new Car("Fiesta");

    7

    8 // volani metody

    9 cout

  • Pripomenut zakladu OOP v C++ Strana 12 / 53

    Staticke a dynamicke instance trd

    Zasobnk (Stack) je oblast vyuzvana pro volan funkc,ukladan navratovych adres, parametru funkce a lokalnchpromennych.Zasobnk je koncipovan na ukladan lokalnch promennych,nen vhodny pro objemna data. Pro ty je halda (heap).V jazyce C slouz k alokovan a uvolnovan pameti nahalde funkce malloc(), resp. free(). V C++ jsou zde pakoperatory new a delete.

  • Pripomenut zakladu OOP v C++ Strana 13 / 53

    Staticke a dynamicke instance trd

    Nasledujc kod ilustruje vytvoren promenne ukazatel nazasobnku, ktera ukazuje na objekt alokovany na halde. Objektlze kdykoliv vytvorit a zrusit.

    1 Car* ukazatel; // vytvor promennou s ukaz.

    2 ukazatel = new Car; // vloz adresu objektu

    3 ukazatel ->metoda (); // zavolani metody

    4 delete ukazatel; // smaz objekt za ukazatelem

    5 ukazatel = new Car; // a dosadime opet jiny

    Nasledujc kod ilustruje vytvoren promenne objekt nazasobnku, ktera prmo obsahuje hodnotu objektu. Objekt jelokaln promennou, tedy zanikne automaticky na konci metody,ale nen mozne jej explicitne zrusit.

    1 Car objekt; // vytvorime promennou s obj.

    2 objekt.metoda (); // opet volame metodu

    3 Car objekt2(parametr ); // zavolani par. konst.

  • Pripomenut zakladu OOP v C++ Strana 14 / 53

    Stabn kultura

    Odsazujte tak, aby byla patrna struktura kodu (aleneprepisujte).Delku radku udzujte na rozumne velikosti (ale neprepisujte)Pojmenovavejte jednotnym zpusobem trdy (Trida,JinaTrida), promenne (mojeInstance), metody(vypisInformace nebo VypisInformace), atributy(m mujAtribut), promenne trdy (s promTridy), globalnpromenne (fuj, ale g pocet) atp.Piste kratke a jasne metody princip Keep It StupidSimple.Kazda entita by mela mt pouze jeden ucel.

  • Pripomenut zakladu OOP v C++ Strana 15 / 53

    Prostory jmen

    Trdy, ale i promenne a prpadne dals nastroje C++ lzetrdit do skupin prostoru jmen.Smyslem je logicky rozclenit aplikaci a vyhnout sepotencialnm duplicitam v oznacen.Nema smysl vyuzvat u trivialnch aplikac.Vyuzvame pri tvorbe knihoven nebo komplexnejschaplikac.Pro identifikaci jmenneho prostoru pouzvame operator ::nebo deklaraci using namespace.Existuje implicitn prostor jmen, ktery nema jmeno.Podle ANSI C++ existuje standardn prostor jmen std, tampatr mnoho nastroju.

  • Pripomenut zakladu OOP v C++ Strana 16 / 53

    Implicitn a standardn prostory jmen

    1 using namespace std;

    2

    3 class Foo{

    4 ...

    5 };

    6

    7 int main(void) {

    8 Foo* ukazatel = new Foo();

    9 ukazatel ->metoda ();

    10 delete ukazatel;

    11 return 0;

    12 }

  • Pripomenut zakladu OOP v C++ Strana 17 / 53

    Prklad prostoru jmen

    1 namespace JmennyProstor{

    2 class Foo{

    3 ...

    4 };

    5 }

    6

    7 class Foo{

    8 ...

    9 };

  • Pripomenut zakladu OOP v C++ Strana 18 / 53

    Pouzit prostoru jmen

    1 int main(void) {

    2 JmennyProstor ::Foo* ukazatel1

    3 = new JmennyProstor ::Foo();

    4 ukazatel1 ->metoda ();

    5 delete ukazatel1;

    6

    7 Foo* ukazatel2 = new Foo();

    8 ukazatel2 ->metoda ();

    9 delete ukazatel2;

    10

    11 return 0;

    12 }

  • Pripomenut zakladu OOP v C++ Strana 19 / 53

    Dals pouzit direktivy using

    1 int main(void) {

    2 // import v ramci metody/funkce

    3 using namespace std;

    4 ...

    5 }

    nebo

    1 // import jedineho prikazu

    2 using std::cout;

    3 ...

    4 int main(void) {

    5 ...

  • Preklad aplikace Strana 20 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Preklad aplikace Strana 21 / 53

    Preklad

    1 preprocesor predzpracovava zdrojovy soubor .cc (.cpp)(include, defined).

    2 kompilator prekladac provad preklad zdrojovehosouboru

    .OBJ (.o) relativn strojovy kod, adresy promennych a fcnejsou znamy.LIS protokol o prekladu

    3 linker sestavovac program provede pridelenabsolutnch adres

    .EXE, spustitelny soubor

    Je doporucovano kompilovat pri vysoke citlivosti kompilatoru(c++ -Wall -pedantic -o program program.cc).Pro preklad C++11 muste take zvolit knihovnu libc++(-std=c++0x -stdlib=libc++). V XCode je nalezneme podnastavenm C++ Standard Library a C++ Language Dialect.

  • Preklad aplikace Strana 22 / 53

    Preklad vce souboru

    U vetsch projektu je zvykem rozdelovat kod do vcesouboru.Obvykle pro kazdou trdu vytvorme samostatny hlavickovy(.h) a implementacn (.cc) soubor.Hlavn soubor programu (main.cc) vklada pomoc direktivinclude pouze hlavickove soubory modulu (nikdyimplementacn soubory). Ty jsou prekladany samostatne.

    c++ ./main.cc ./lev.cc ./zirafa.cc -o zookoutek

  • Preklad aplikace Strana 23 / 53

    Hlavickove soubory a jejich podmnenenacten

    Hlavickove soubory vzdy obsahuj veskere direktivyinclude nezbytne pro samostatny preklad modulu (trdy).Implementacn soubor (.cc) obsahuje pouze implementacenesablonovych metod a jedinou direktivu include, kteravloz hlavickovy soubor dane trdy.Hlavickove soubory jsou casto includovany vcekrat. jenutne zabranit jejich vcenasobnemu nacten.K tomu slouz definice podmneneho bloku: Pokud blokkodu s tmto jmenem nebyl definovan, nadefinuj ho.

    1 #ifndef _MEDVED_H

    2 #define _MEDVED_H

    3 // samotny obsah souboru medved.h

    4 #endif

  • Promenne a prace s nimi Strana 24 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Promenne a prace s nimi Strana 25 / 53

    Datove typy (cast)

    ZakladnCelocselne: int, long int, short int, long longRealne: float, double, long doubleZnaky a retezce: char[16 t| 32 t], string.Specialn: void, auto

    Velikosti typu zalez na dane architekture. Zjistme pomocprkazu sizeof(int) nebo konstant INT MAX INT MIN, aj.Specialn

    Zaznam, union, vyctovy typ enumerate, vyctova trda,pole (inicializace int pole[3], resp. int pole[3] ={1,2,3}1, prstup pole[0])STL: seznam, fronta, zasobnk, ...

    U celocselnych typu existuj take neznamenkove variantyunsigned. Cselny rozsah posunut pouze do kladnych csel.

    1moznost vlozen objektu { { 1,2,3 },... }

  • Promenne a prace s nimi Strana 26 / 53

    Kontrola rozsahu

    1 #include

    2 using namespace std;

    3 ...

    4 int main (){

    5 cout

  • Promenne a prace s nimi Strana 27 / 53

    Typy s garantovanym rozsahem (C++11)Znamenkovy int o presne bitove velikosti

    int8 t, int16 t, int32 t, int64 tuint8 t, uint16 t, uint32 t, uint64 t

    Rychla (nativn) implementaceint fast8 t, int fast16 t, int fast32 t, int fast64 t

    uint fast8 t, uint fast16 t, uint fast32 t, uint fast64 tImplementace zabrajc nejmene pameti

    int least8 t, int least16 t,int least32 t, int least64 tuint least8 t, uint least16 t,uint least32 t, uint least64 t

  • Promenne a prace s nimi Strana 28 / 53

    Klcove slovo auto (C++11)

    Automaticky se dosad typ na zaklade inicializace.Nepouzvat pokud nen typ zrejmy!

    1 int x = 10;

    2 auto y = x; // y je int

  • Promenne a prace s nimi Strana 29 / 53

    Deklarace a inicializace promennych

    typ jmeno = inicializacni hodnota

    1 int i = 1; // globalni promenna

    2 int main(void) {

    3 int j = 10; // lokalni prom.

    4 int &ref = j; // reference na j, nutno hned inic.

    5 return 0;

    6 }

    Promenna by mela mt co nejmens moznou platnost.Pri vytvoren prom. je vzdy vhodne ji okamzite inicializovat.

  • Promenne a prace s nimi Strana 30 / 53

    In-class inicializace promennych (C++11)

    Drve:

    1 int var = 7;

    2 class X {

    3 static const int m1 = 7; // ok

    4 const int m2 = 7; // error: not static

    5 static int m3 = 7; // error: not const

    6 static const int m4 = var; // error: init. not const. exp.

    7 static const string m5 = "odd"; // error: not integral type

    8 };

    Nyn inicializace v dobe prekladu:

    1 class X {

    2 int m_a = 7;

    3 };

  • Promenne a prace s nimi Strana 31 / 53

    Konstruktory: inicializace v dobe prekladu

    In-class inicializace je ekvivalent

    1 class A {

    2 int m_a;

    3 public:

    4 A() : m_a(7) {}

    5 };

    Tento zpusob inicializace atributu je nezbytny pokud atributemje objekt, ktery nema bezparametricky konstruktor

    1 class Vektor{

    2 Bod m_x;

    3 Bod m_y;

    4 public:

    5 Bod(Bod x, Bod y):m_x(x), m_y(y){...}

    6 };

  • Promenne a prace s nimi Strana 32 / 53

    Konstruktory: delegovan konstruktoru(C++11)

    Drve:1 class Bod {

    2 int m_x;

    3 validate(int x) { if (0

  • Promenne a prace s nimi Strana 33 / 53

    Prklad metody vracejc jednu hodnotu

    1 class Vypocet{

    2 public:

    3 int secti(int cislo1 , int cislo2 ){

    4 return cislo1+cislo2;

    5 }

    6 };

    7 ...

    8

    9 int x = 12;

    10 int y = 45;

    11 int a = objekt ->secti(a,b);

    12 int b = objekt ->secti (10 ,12);

  • Promenne a prace s nimi Strana 34 / 53

    Vracen vce hodnot

    Situace se lehce komplikuje, pokud potrebujeme vracetz metody vce hodnot.Mame 2 moznosti, jak to realizovat: pomoc ukazatelu (*)nebo refenc (&).Subjektivne jednoduzs je:

    1 class Vymena{

    2 public:

    3 void vymen(int &a, int &b){

    4 int pom = a;

    5 a = b; b = pom;

    6 }

    7 };

    8 ...

    9 objekt ->vymen(a, b);

  • Promenne a prace s nimi Strana 35 / 53

    Vracen vce hodnot varianta *

    1 class Vymena{

    2 public:

    3 void vymen(Student *a, Student *b){

    4 Student pom = a;

    5 a = b;

    6 b = pom;

    7 }

    8 };

    9

    10 int main(void){

    11 Student* karel = new Student("Karel", 11)

    12 Student* pepa = new Student("Pepa", 11)

    13 objekt ->vymen(karel , pepa);

    Casto je doporucovano spojit hodnoty do jedne trdy a vratit jepomoc return. Napr. msto x a y vracet instanci Bod2D svlastnostmi x a y.

  • Stabn kultura Strana 36 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Stabn kultura Strana 37 / 53

    Stabn kultura parametru

    Hodnotou predavame trivialn vestavene typy.Parametry, ktere slouz pouze pro vstup by meli bytoznaceny const.Pokud se jedna o ukazatele na prom. je velmi doporuceneoznacit je const.Reference (&) se pouzva nejen pro vracen hodnoty, ale iz duvodu efektivity. Reference na vstupn promennou bymela byt vzdy const. (nebezpec modifikace puvodnchdat)Napr: void zpracuj(const vector& vec), voidudelej(const Velka3DMatice& prvek)

    Parametry by mely byt pokud mozno jednoduche typya trdy.

  • Const Strana 38 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Const Strana 39 / 53

    Konstanty

    Pokud ma mt parametr nebo promenna stale stejnou hodnotu,pouzijte klcove slovo const. Pozor na odkazy: const x* zajistnemennost ukazatele nikoli hodnoty.

    1 const int kHeight = 10; // konstantni lokalni prom.

    Vsimnete si nazvu. Byva zvykem pouzvat predponu k.

  • Const Strana 40 / 53

    Konstanty

    Nepouzvat ceckove#define

    Ma neomezenou platnost a nelze specifikovat typ.Konstanta na urovni jmenneho prostoru:

    const int kPageSize = 365;

    Konstanta na urovni trdy:

    1 class Window{

    2 static const int s_kWidth = 400;

    3 static const int s_kHeigth;

    4 };

    5

    6 const int Window :: s_kHeigth = 300;

  • Const Strana 41 / 53

    Dals aplikace const

    const u parametru metody oznacuje, ze pouze vstupn.Pokud pseme const za metodou, rkame, ze metodanemen stav objektu.int vratHodonotuAtributu() const;

    V C++ lze vytvorit i konstantn instanci, u ktere nelze nijakmenit vnitrn stav.U takove instance lze volat pouze metody deklarovane sklcovym slovem const.

  • Const Strana 42 / 53

    Constexpr (C++11)

    constexpr umoznuje definovat, ze funkce/metoda atp. sevyhodnocuje v dobe prekladu.Muze vyznamne pomoci pri optimalizaci kodu.Funkci/metodu ale lze volat i za behu programu. Tj. nennutne oddelovat resen pro vypocet v dobe prekladu a vdobe behu.

    1 constexpr int secti(int x, int y){

    2 return x+y;

    3 }

    4

    5 // prekladac muze vyraz vyhodnotit pri prekladu

    6 const int val = secti (10, 10);

  • Static Strana 43 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Static Strana 44 / 53

    Clenske promenne trdy

    Veskere atributy, ktere jsme doposud pouzvali byli atributyobjektu byly unikatn pro jednotlive objekty.V C++ muzeme definovat i atributy, ktere nalez prmotrdam clenske promenne.Pro deklaraci atributu trdy pouzvame static.Lze k nim pristupovat pomoc nazvu trdy, :: a nazvupromenne (Trda::promenna).

    1 class Trida{

    2 private:

    3 static int s_pocetInstanci; // nelze napsat = 0;

    4 int m_normaniAtribut;

    5 ...

  • Static Strana 45 / 53

    Clenske metody

    Clenska metoda (oznacena static) nema jako svuj prvnimplicitn parametr this. Je to logicke, protoze nen jasnepro ktery objekt je volana (nen parametr this).V tele metody lze pracovat jen se statickymi atributy ametodami trdy.Lze ji take zavolat, aniz by existovala nejaka instance danetrdy.

    1 static int vratPocetInstanci () {

    2 return pocetInstanci;

    3 }

  • Static Strana 46 / 53

    Jine vyuzit static

    Je-li static globaln promenna (nebo funkce), je viditelnapouze v danem souboru zdrojoveho textu (modulu).Je-li static lokaln promenna funkce, potom jej hodnota jeuchovavana mezi jednotlivym volanm (zanika pri ukoncenprogramu)

  • Override a final Strana 47 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Override a final Strana 48 / 53

    Override (C++11)

    Explicitn stanoven prekryt virtualn metody.1 class Father {

    2 virtual void A(float age);

    3 virtual void B() const;

    4 virtual void C();

    5 void D();

    6 virtual void E();

    7 };

    8

    9 class Son: public Father {

    10 virtual void A(int age) override; // zmena typu

    11 virtual void B() override; // predkovi const

    12 virtual void C() override; // korekni prekryti

    13 void D() override; // neni v predkovi virt.

    14 void E() override; // korektni prekryti

    15 };

  • Override a final Strana 49 / 53

    Final (C++11)

    Klcovym slovem final oznacujeme metody nebo trdy, kterenesm byt pouzity pro deden.

    1 class Father {

    2 virtual void A() final; // nelze prekryvat

    3 };

    4

    5 class Son: public Father {

    6 virtual void A(); // chyba prekladace

    7 };

    V prpade trdy nelze vytvaret potomka teto trdy.

    1 class Father final {};

    2

    3 class Son: public Father {}; // chyba prekladace

  • Override a final Strana 50 / 53

    struct vs. class

    struct znamena v praxi temer presne totez, co class.U stuct, pokud nen receno jinak, jsou slozky verejne.Struktura muze byt predkem trdy a opacne.

    1 struct Trida{

    2 ...

    3 };

    4

    5 class Trida{

    6 public:

    7 ...

    8 };

  • Override a final Strana 51 / 53

    Vyctova trda (enumerate class)

    Nahrazuje zastarale vyctove typy, ktere hodnoty vnitrnereprezentovaly jako inty.To vedlo na moznost porovnan nesouvisejcch hodnot.

    1 enum class Color{

    2 Red , Blue

    3 };

    4

    5 enum class Fruit{

    6 Banana , Apple

    7 };

    8

    9 Color a = Color ::Red; // musime pouzit predponu tridy

    10 Fruit b = Fruit :: Banana;

    11 if (a == b) // zde bude chyba , coz je dobre

  • Oddechnut Strana 52 / 53

    Obsah prednasky

    1 Historie C++: od Fortranu po C++11

    2 Pripomenut zakladu OOP v C++

    3 Preklad aplikace

    4 Promenne a prace s nimi

    5 Stabn kultura

    6 Const

    7 Static

    8 Override a final

    9 Oddechnut

  • Oddechnut Strana 53 / 53

    Hello World!

    Historie C++: od Fortranu po C++11Pripomenut zkladu OOP v C++Preklad aplikacePromenn a prce s nimitbn kulturaConstStaticOverride a finalOddechnut