Moje začátky v C++

Aneb jak jsem s pomocí znalostí Javy a Céčka (které už si moc nevzpomínám) učil C++. Malá poznámka na začátek – používám vývojové prostředí Microsoft Visual Studio 2005, ale myslím, že moje zkušenosti půjdou použít i jinde.

Vstup a výstup

Z jazyka C si ještě pamatuji, že jsem standardní vstup a výstup na obrazovku řešil pomocí scanf a printf. V C++ však přibyly dvě přívětivé funkce cin a cout. Výhoda spočívá v tom, že tyto funkce samy rozpoznají datový typ proměnné a tudíž odpadá ruční zadávání (např. "%d" pro celé číslo).

Abychom mohli používat tyto funkce, musíme nejprve na začátku deklarovat hlavičkový soubor iostream a použít jmenný prostor std. Tady jsem poprvé natrefil na namespace, je to „novinka“ C++ a když ji zapomenete napsat, tak se možná budete hodně divit, když to bude psát, že funkci cin vůbec nezná. Je to tím, že funkce cin a další její kolegové jsou deklarovány v jmenném prostoru std. Pokud si na začátku programu nepomůžeme kouzelným slovíčkem using namespace, tak v programu budeme muset používat zápis std::cin nebo std::cout.

Jako příklad uvedu jednoduché načtení čísla zadaného uživatelem (ze vstupu) do proměnné cislo a následné vypsání tohoto čísla na obrazovku (na výstup):

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int cislo;

    cout << "Napiste nejake cislo: ";
    cin >> cislo;
    cout << "Zadane cislo: " << cislo << endl;

    return 0;
}

Třídy

Nebudu rozebírat, co je třída nebo objektově orientované programování, ale chci poukázat na to, jak se třídy v jazyku C++ píší. Jedna třída se oproti Javě zapíše do dvou souborů a to do hlavičkového souboru (.h), kde jsou pouze deklarace proměnných a funkcí (prototypů), a do zdrojového souboru (.cpp), kde už přímo píšeme funkce této třídy. Kromě prototypů můžeme do hlavičkového souboru psát i tzv. inline funkce – to znamená, že můžeme obsah funkce zapsat přímo k deklaraci funkce. Více vysvětlí příklad:

Soubor Trida.h:

#pragma once
/*
    #pragma once zajisti, aby byla tato hlavicka
    nactena do pameti jenom jednou i pri vice pouziti
    #include "Trida.h"
*/

class Trida
{
/*
    v Jave se psalo private nebo public
    pred kazdou promennou nebo funkci, ale
    v C++ se to pise takto do bloku:
*/
private:
    int a, b;
    int soucin;
public:
    Trida(int a = 0, int b = 0); // konstruktor se dvema parametry
    int vrat_a() { return a; } // vlozena (inline) funkce
    int vrat_b() { return b; }
    void nastav_a(int cislo);
    void nastav_b(int cislo);
    int vysledek() { return soucin; }
    /*
        takto se pise destruktor:
        ~Trida(void);
    */
}; // pozor - tady patri strednik !

Soubor Trida.cpp:

#include "StdAfx.h"
#include "Trida.h"

/*
    pokud bych volal konstruktor bez parametru (např. Trida test),
    tak promenne a, b zustanou v nule a soucin vynuluji v konstruktoru
*/
Trida::Trida(int a, int b)
{
    /*
        tady jsem schvalne deklaroval stejne nazvy promennych
        jako ma tato trida, abych ukazal pouziti this, ktery
        slouzi jako ukazatel na tuto tridu
    */
    this->a = a;
    this->b = b;
    if (a > 0 && b > 0)
        soucin = a * b;
    else
        soucin = 0;
}
void Trida::nastav_a(int cislo)
{
    if (cislo > 0)
        a = cislo;
}

void Trida::nastav_b(int cislo)
{
    if (cislo > 0)
        b = cislo;
}

A nakonec ukázka použití mojí nové třídy:

#include "stdafx.h"
#include <iostream>
using namespace std;

// tady deklaruji hlavickovy soubor moji tridy,
// abych ji mohl pouzivat
#include "Trida.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Trida test(3, 4);

    cout << "A je " << test.vrat_a() << " a B je " << test.vrat_b() << endl;
    cout << "Vysledek: " << test.vysledek() << endl;

    return 0;
}

Sice je naprosto nezvyklé dělat násobení dvou čísel tak složitým způsobem, ale jako příklad to myslím poslouží dobře.

Visual Studio 2005

V tomto vývojovém prostředí se takovéto jednoduché aplikace, které běží jenom na příkazovém řádku dělají tak, že při vytváření nového projektu vyberete „Win32 Console Application“. Pak pro kompilaci a spuštění napsaného kódu je dobré stisknout kombinaci CTRL + F5, protože po vykonání kódu nedojde k ukončení aplikace a zavření okna s příkazovým řádkem, ale čeká se na stisk klávesy.

Toť vše, co jsem chtěl v tomto článku sdělit. Uvítám jakékoliv hodnocení v komentářích. Pokud vše půjde hladce, tak bych chtěl z tohoto příspěvku udělat seriál více článků.

Vloženo: 8. 12. 2006 21.22RSS komentářů tohoto článku

Komentáře:

[1] Radek Tomášek 9. 12. 2006 12.20

Zdravím Martine,

pročetl jsem tvůj článek a musím říci, že se ti povedl..S C++ pracuji už nějakou dobu a myslím, že pro úplné začátečníky to bude skvělý pomocník…Akorát bych přece jen měl jednu drobnou výtku a to ke konstruktoru… Spíše jde o ten implicitní..Proč ho neudělat zvlášť?

hned uvedu jak jsem to myslel

máš tam řádek v hlavičkovém souboru

Trida(int a = 0, int b = 0);

já bych to udělal takhle

Trida();

Trida(int a, int b);

a v tom dalším souboru bych pak definoval, co má přesně dělat ten implictiní konstruktor..

Jinak ten destruktor se neboj psát normálně do definice…Program pak sam ví, kdy ho má zavolat..

Jinak to je úplně v pohodě..Jinak jako alternativu skvělému Visual Studiu doporučuji DevCpp :o)..


[2] Martin Grames (martin.grames@chapadlo.cz) 9. 12. 2006 12.58

[1] Radek Tomášek: pokud se nemýlím, tak stylem

Trida();
Trida(int a, int b);

se to dělalo v Javě. Zrovna na minulém cvičení z C++ nám vykládal, že v Javě bychom udělali něco takového:

Trida(int jedna);
Trida(int jedna, int dve);
Trida(int jedna, int dve, int tri);

Ale v C++ se to udělá jednoduše takto:

Trida(int jedna, int dve = 0, int tri = 0);

Mě se tento způsob zdá lepší.


[3] BarrBarr 9. 5. 2007 13.04

Tak pro oprawdový začátečníky je kámo twůj text úplně na howno, když tady začneš mávat ukazatelama a přitom neřekneš co to je nebo apoň jak to funguje jak si podle toho má někdo udělat prgram?? to samý je s konstruktorem a destruktorem.. když tam nedáš proč to tam je, co to dělá a co se stane když to tam nedáš tak si myslim že celej ten text je na howno.. tady si člowěk může akorát tak zkopírowat zdroják a koukat co to dělá – a z toho moc lidí chytrejch nebude..


[3] BarrBarr: Máš naprostou pravdu, ale vysvětlení principů objektově orientovaného programování by bylo na samostatnou kapitolu v knize a o to jsem se rozhodně nesnažil – možná někdy jindy ;-)


[5] NoName 22. 10. 2007 21.11

Zdravim. Osobne se povazuji za zacatecnika a musim rict ze tenhle spusob vykladu mi plne vyhovuje… A ze tady neco neni? No a?! Je tady neco co jinde neni… hezky okomentovany zdrojak… Jednu namitku (jako zacatecnik) mam ale taky… Proc je destruktor zakomentovany? Tak ci onak rozhodne se tesim na dalsi dil.


[6] Martin Grames (martin.grames@chapadlo.cz) 23. 10. 2007 15.09

[5] NoName: Destruktor je zakomentovaný, protože ho nepoužívám – je to pouze ukázka, jak se píše…


[7] mike (mothy@seznam.cz) 12. 11. 2008 16.45

Je to super, kdy bude dalsi dil?? Uz se moc tesim :-)


[8] Bob (303ika@gmail.com) 2. 12. 2008 11.11

Právě že bys měl destruktory používat a mazat vše dynamicky vytvořené(vše vytvořené přes new – vytvari se az za behu programu a ne pred jeho spustenim),bo si zasereš paměť ani nevíš jak. Destruktory ti pohodlne umozni uklidit svincik po vsech hodnotach co uz nepotrebujes. P.s : nemám rád garbage collector a jiné vynálezy co dělají z programátora opici :D


[9] Martin Grames (martin.grames@chapadlo.cz) 8. 12. 2008 21.11

[8] Bob: Ano, máš pravdu, i když u objektů, které se ukončují až s ukončením celého programu, se může na čištění kašlat a nechat to na systému, on už se s tím nějak popere :-)

Dělám teď delší dobu v čistém céčku a někdy se mi po garbage collectoru zasteskne. Lidé nejsou dokonalí, tak se snadno stane, že se nevyřeší všechny případy, které mohou nastat nebo se něco špatně napíše a hned je na světě pointer ukazující úplně na jiné místo v paměti, než jsem zamýšlel. A takové chyby se většinou hledají špatně… S garbage collectorem je život přece jenom jednodušší ;-)


[10] Swet 4. 9. 2009 16.03

Sem uplnej zacatecnik a docela by se mi hodil nejaky odkaz, kde by bylo opravdu „jako“ v knižce popsany jednotlive veci. Kdyby jste nekdo vedel hodte mi to sem pls. Jinak hezky clanek. Dik.


[11] PuTTy (Puttty@email.cz) 10. 12. 2009 10.52

Zdravím, Jsem „trochu“ pokročilý v C++. Kdyby nějaký začátečník chtěl pomoci s „základy“ (knihovna <iostream>). Tak bez problému můžu pomoci, když budu vědet. Kontakt na mně viz. email.


Přidat komentář