Konstruktor / Destruktor – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Konstruktor / Destruktor – C / C++ – Fórum – Programujte.comKonstruktor / Destruktor – C / C++ – Fórum – Programujte.com

 

Minko0
Newbie
7. 5. 2011   #1
-
0
-

Ahoj mám trochu nejasno vo funkcii konstruktorov.Viem o nich asi toľko ,že môžu obsahovať parametre a že ak nemam konstruktor tak kompiler si ho sam vloži.. ako default. O destruktoroch viem že sa použivaju bez parametrov a nerobia nic.

Ale neviem aky je dôvod použivania konstruktorov a ani ako sa maju správne vytvárať , kedy s parametrom a kedy zas nie.

Mám tu jeden kód v ktorom nechápem prečo je v konstruktore triedy jejVek = iniVek; a tiež prečo sme tam použili konstruktor s parametrom int iniVek;


Ďakujem za každu pomoc tu je kód:

#include <iostream>


class Macka
{
public:
Macka(int iniVek);//konstruktor
~Macka();//destruktor

int ZiskajVek();
void NastavVek (int vek);
void Mnau();
private:
int jejVek;

};

/* konstruktor triedy Macka */

Macka::Macka(int iniVek)
{
jejVek = iniVek;
}

/* destruktor triedy Macka */
Macka::~Macka()
{
//žiadna akcia
}





Nahlásit jako SPAM
IP: 88.212.32.–
KIIV
~ Moderátor
+43
God of flame
7. 5. 2011   #2
-
0
-

To Minko : Konstruktor pozna jestli ma brat parametry podle toho, jestli mu nejake das (ve zkratce)

Destruktor samozrejme taky neco dela ... ale az kdyz pracujes s dynamickou pameti - ma za ukol po sobe cistit (brzy) smeti - at uz pri skonceni platnosti objektu nebo podobne.

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Minko0
Newbie
7. 5. 2011   #3
-
0
-

To KIIV : Aha takže ak tomu chápem je to akoby inicializovanie premennej objektu danej triedy v tomto prípade Macka. ?

takže príklad by nasledoval asi takto ?

Macka Sisi(5); // 5 - hodnota veku..

Nahlásit jako SPAM
IP: 88.212.32.–
KIIV
~ Moderátor
+43
God of flame
8. 5. 2011   #4
-
0
-

To Minko : tak tak

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Minko0
Newbie
8. 5. 2011   #5
-
0
-

Ďakujem pekne za pomoc :)

Nahlásit jako SPAM
IP: 88.212.32.–
XNickX
~ Anonymní uživatel
8 příspěvků
22. 6. 2011   #6
-
0
-

Sorry že vytahuji staré téma....ale stále ješte nechápu konstruktory a destrukory...
To misto toho Macka(int iniVek) nemohl napsat normalne int iniVek; ?
Prosím o pomoc... :(

Nahlásit jako SPAM
IP: 217.115.249.–
nervak0
Věrný člen
22. 6. 2011   #7
-
0
-

Co nechápeš? Při vytváření objektu se zavolá konstruktor a při rušení destruktor. Když chceš vytvořit objekt s nějakými parametry, tak je nastavíš hned v konstruktoru a nemusíš to dělat potom.

Nahlásit jako SPAM
IP: 213.211.51.–
RePRO0
Super člen
22. 6. 2011   #8
-
0
-

Ty si jednoduše potřebuješ zinicializovat privátní proměnnou.

class Macka 

{
public:
Macka(int iVek);

private:
int Vek;
};

// třeba Ti pomůže tento příklad
Macka::Macka(int Vek)
{
this->Vek = Vek;
}

// destruktor triedy Macka
Macka::~Macka()
{

}

Nahlásit jako SPAM
IP: 83.240.104.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
XNickX
~ Anonymní uživatel
8 příspěvků
23. 6. 2011   #9
-
0
-

A to tu proměnnou můžu inicializovat i pomocí funkce ne? V čem je lepší konstruktor?
Nebo zrovna dát:

class Macka 

{
private:
int Vek=5;
};


Stále mi to ještě jaksi nejde do hlavy.. :/

Nahlásit jako SPAM
IP: 217.115.249.–
liborb
~ Redaktor
+18
Guru
23. 6. 2011   #10
-
0
-

Samozřejmě, že to můžeš inicializovat ve funkci. Dokonce je to běžné, jenom se ta funkce většinou volá z konstruktoru :). A to, co si napsal int Vek=5; napsat nemůžeš, protože to je deklarace nestatické nekonstantní proměnné třídy a tam inicializaci dát nemůžeš. Vlastně proto je konstruktor, protože když uděláš inicializaci v konstruktoru, tak máš jistotu, že se to provede při vytvoření objektu. Prostě konstruktor se volá automaticky jako první při vytvoření objektu (těsně po jeho vytvořením). A destruktor se volá automaticky jako poslední při rušení objektu (těsně před jeho zrušením).

Nahlásit jako SPAM
IP: 78.80.52.–
cerf
~ Anonymní uživatel
4 příspěvky
23. 6. 2011   #11
-
0
-

V čem je lepší konstruktor? Ve všem :) Konstruktor slouží k počáteční inicializaci objektu. Pokud vytváříš objekt,
měl bys vždycky implementovat také vlastní konstruktor. Funkce Set() a pod. se používají na změnu hodnoty, ne k její inicializaci.
Inicializace probíhá při vytváření proměnné:

int a = 0;	//je inicializce

int b;
b = 0; //není inicializace ale přiřazení

Pokud neimplementuješ konstruktor, bude program, kromě jiného, náchylný k chybám. Můžeš se pak dopustit například následující chyby:
Macka kocka;

int vek = kocka.GetVek(); //vrací hodnotu Vek objektu kocka, které není přiřazena žádná hodnota

Pokud však vytvoříš bezparametrický konstruktor, který proměnné Vek přiřadí hodnotu 0, předchozí příklad bude fungovat správně:
//konstruktor

Macka::Macka()
{
Vek = 0;
}

Dále si představ, že by třída Macka obsahovala také jméno kočky, které by bylo reprezentováno jako pole type char:
char *m_jmeno;

Třída by také pomocí metody SetJmeno umožňovala změnu jména. Implementace funkce by mohla vypadat následovně:
void Macka::SetJmeno(const char *jmeno)

{
delete [] m_jmeno;
m_jmeno = new char[strlen(jmeno) + 1];
strcpy(m_jmeno, jmeno);
}

Pokud bys nevytvořil vlastní konstruktor, následující program by vygeneroval chybu:
Macka liza;

liza.SetJmeno("liza"); //CHYBA

Mělo by to být jasné. Ukazatel m_jmeno obsahuje náhodnou hodnotu, protože nebyl při vytvoření objektu inicializován. Použití operátoru delete [] proto skončí chybou. Avšak použití operátoru delete na nulový ukazatel je zcela bezpečné.
Proto stačí vytvořit vlastní konstruktor, který inicializuje ukazatel na hodnotu NULL (popř. 0)
Macka::Macka()

{
Vek = 0;
m_jmeno = NULL;
}

Samozřejmě by bylo možné vytvořit "inicializační funkci", která by se starala o totéž jako konstruktor. Ale jaký by byl k tomu důvod, když se konstruktor volá automaticky, zatímco takovou funkci bychom museli volat explicitně?
Macka kocka;

kocka.Init(); //??? Jaký to má smysl ???

Nahlásit jako SPAM
IP: 188.246.100.–
XNickX
~ Anonymní uživatel
8 příspěvků
24. 6. 2011   #12
-
0
-

Opravdu hodně díky...
Teď už to chápu :)

Nahlásit jako SPAM
IP: 217.115.249.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Destruktor — založil Gadael

Destruktor třídy — založil Blujacker

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý