IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 6. diel - Bojovník do arény - Zapuzdrenie

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:2.1.2018 21:07

Dobrý, v prvom rade musím pochváliť výbornú sériu aj článok, ale okrem toho by som rád dve veci :-)

1 - V časti Metody - A jak víme z "předchozí lekce":{PREVI­OUS_URL}, …

2 - K tej istej časti by som mal aj otázku. Ak som ten zápis ako tomu hovoríte inicializácie parametrov (hlavne referencie na kocku) pochopil správne, tak ten zápis

konstruktor(T1 p1, T2 p2, …) : p1(p1), p2(p2), …

nie sú delegované konštruktory, ale vlastne to je ekvivalent zápisu

this->p1 = p1; this->p2 = p2; …,

ktorý "len" prebehne pred zavolaním tela konštruktoru inicializovaného objektu?

Za odpoveď vopred ďakujem.

Editované 2.1.2018 21:09
Odpovedať
2.1.2018 21:07
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovedá na Martin Petrovaj
Patrik Valkovič:2.1.2018 21:23

Ahoj,
díky opraveno.
V principu ano, a je to právě z důvodu referencí. Když bude atribut reference, tak volání this->p1 nepůjde. Reference totiž musí být inicializovaná ještě před spuštěním konstruktoru. To obstarává právě tento zápis (vlastně se jedná o inicializaci proměnných). Podobně pokud by byl atributem třída, která nemá výchozí konstruktor (tedy bezparametrický), muselo by se postupovat tímto způsobem, protože atribut musí být nějak inicializován ještě před vykonáváním konstruktoru.

Odpovedať
2.1.2018 21:23
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovedá na Patrik Valkovič
Martin Petrovaj:2.1.2018 22:09

Ďakujem za dovysvetlenie. Ešte by som sa ale pre úplné pochopenie chcel spýtať, čo presne sa vlastne deje, keď napr. v našom prípade inicializujeme týmto spôsobom referenciu na objekt typu Kocka. Hlavne mi nejde do hlavy ten zápis - kocka(kocka) (alebo radšej všeobecne atribut(parame­ter)), jednak sa mi zdá zvláštne inicializovať objekt volaním niečoho (predpokladám že nejakého špeciálneho konštruktora? Toť prvá otázka) na kvázi inštancii.

Ak sa takto volá konštruktor, tak to je nejaký automagicky vygenerovaný alebo zvláštny druh? Som z toho trochu mimo preto, lebo mi Visual Studio ponúka (a vlastne aj využívame) overloady s parametrami, ktoré som explicitne nikde nezadefinoval.

Alebo som úplne mimo a zbytočne som sám seba zmiatol a v skutočnosti je to len nejaká osobitná syntax pre poslanie referencie z parametra atribútu inicializovaného objektu? Prepáčte, asi robím z papierovej vlaštovky balistickú strelu, ale snažím sa čo najlepšie a najdetailnejšie pochopiť spôsoby cpp aby som vedel kedy, čo a ako použiť, ale čím ďalej nad tým rozmýšľam, tým viac ma skúsenosti z vyšších jazykov mätú ;-( :-)

No a aby som položil aj jednoduchú otázku dokonca priamo k tomuto článku - cpp asi nemá nič na spôsob vlastností (properties), ako ich poznáme napr. v C#, že? Všetko cez get/setPremenna()

Odpovedať
2.1.2018 22:09
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovedá na Martin Petrovaj
Patrik Valkovič:2.1.2018 22:44

Ahoj, C++ properties jako C# nemá (jako getter a setter). Musíš explicitně použít getAtribut a setAtribut.
Co se to toho konstruktoru týče. Konstruktor je prostě metoda, která se zavolá při vytvoření. Problém je, že před tím, než se volá metoda, musíš mít nějakou hodnotu atributů. Představ si tento příklad:

class A{
private:
        int atribut;
public:
        A(){
                cout << this->atribut << endl;
        }
}

Jakou hodnotu program vypíše? Nejspíše nedefinovanou (podle toho co zrovna bylo v paměti). To je ale jen důsledek toho, že typ int nemusí být inicializovaný. Co když ale bude atribut typu třídy.

class A{
public:
        int atribut;
}
class B{
public:
        A instance;
        A(){
                cout << this->instance->atribut << endl;
        }
}

Program pořád půjde spustit, protože se použije výchozí hodnota typu int (nedefinováno) a na třídě A se zavolá bezparametrický konstruktor. Co když ale bude existovat pouze parametrický konstruktor?

class A{
public:
        int atribut;
        A(int val){
                this->atribut = val;
        }
}

Jak bys nyní zavolal tento konstruktor ve třídě B?

class B{
public:
        A instance;
        A(){
                this->instance = new A(5); //není ukazatel
                this->instance = A(5); //volá přiřazovací operátor, ne konstruktor
                this->instance(5); //volá () operátor, ne konstruktor
        }
}

Problém je právě v tom, že instance musí být jednoznačně vytvořena (inicializována) ještě před tím, než se konstruktor zavolá. Potřebujeme tedy zavolat konstruktory atributů. A k tomu je právě ona syntaxe.

class B{
public:
        A instance;
        A() :instance(5) { //vol8n9 konstruktor atributu instance
                cout << this->instance->atribut << endl; //vypise 5
        }
}

Stejný případ je to v případě referencí.
Pokud inicializaci atributu nepoužiješ, použije se by default bezparametrický konstruktor (druhý kód). V případě int to znamená náhodnou hodnotu, nicméně můžeš takto inicializovat i int.

class A{
private:
        int atribut;
public:
        A(): atribut(5) {
                cout << this->atribut << endl; //vypíše 5
        }
}
Odpovedať
2.1.2018 22:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Neaktivní uživatel:9.11.2019 13:32

Ahoj.
V článku by se hodil odkaz na initializer list, v místě kde je použit.
(jaký je rozdíl mezi initializer listem a přiřazením, proč se používá)

Odpovedať
9.11.2019 13:32
Neaktivní uživatelský účet
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!