Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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é
Odpovedať
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ť
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ť
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ť
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ť
Neaktivní uživatelský účet
Avatar
Jiří Izer
Člen
Avatar
Jiří Izer:8. apríla 21:22

Ahoj, vzhledem k tomu, že u této kapitoly nelze potvrdit prostudování, tak až do konce kurzu budou všechny další části neodfajfkované 😞 . Řeší to někdo z IT Network? Díky

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.

Zobrazené 6 správy z 6.