Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C++ Alokacia a dealokacia pamati

Skusim ti nacrtnut jak sa v C++ robi s triedami normalne, zaklady (ziadne pokricle hardcore). Trieda je len sablona (informacia pre compiler) ktora popisuje ako budu vypadat objekty danej triedy. Trieda samotna (ten popis class blablabla) pri vykonavani programu nezabera ziadnu pamat, je to len navod ako vytvarat objekty. Napr. zadefinujem si triedu

class Motorka {
 protected:
  int kubatura;
 public:
  Motorka() {kubatura = 0;}  // defaultny konstruktor
  Motorka(int k) {kubatura = k;} // konstruktor s parametrom
...tu budu nejake funkcie dalsie apod...
};
- teraz este neni alokovana ziadna pamat.

A mozem napr. vytvorit objekt v ramci jednej fcie, objekt pri navrate z funkcie bude zniceny, stejne jak ostatne lokalne premenne, napr. jak to int i
void funkcia()
{
 int i;
 Motorka moje_faro(3000); // vytvori sa objekt moje_faro a zavola vola sa konstruktor s parametrom 3000
 Motorka ine_faro; // vytvori sa objekt ine_faro a zavola vola sa defaultny konstruktor

... nieco robim s objektami moje_faro a ine_faro...
 moje_faro.VypisJakeMamFajneFaro();
...
} // tu sa objekty znicia stejne tak jak premenna i.
Alebo mozem napr. definovat objekt ako sucast ineho objektu v inej triede, napr.
class Zoznam100Motoriek {
  Motorka zoznam[100];
...tu budu nejake funkcie dalsie apod...
};
- ked niekto vytvori objekt tejto triedy, tak sa v pamati vpodstate vytvori 100objektov triedy Motorka.

Alebo mozem definovat pointer na objekt (tym sa nevytvori objekt samotny!) a potom si do neho priradit nejaku adresu, ak si vytvorim objekt alebo alokujem dynamicke pole pre vela objektov apod.
Motorka* vytvaracia_funkcia()
{
 Motorka* p=NULL;

...
 p = new Motorka; // zavola sa default konstruktor lebo je to bez parametra
...

 return(p); //mozem vratit pointer ptz objekt nezanikne na konci fcie
}; // tu sa znici premenna p, objekt ostane v pamati.

void main(void)
{
 Motorka* m;
 if(m = vytvaracia_funkcia() != NULL) {
  m->VypisJakeMamFajneFaro();
  delete(m); // ked uz objekt viac nepotrebujem tak delete objektu.
 }
}
Apod. Na presun medzi funkciami nemusis pouzivat smerniky, objekty sa daju presuvat ako navratova hodnota aj hodnotou, vtedy aj objekt alokovany zo stacku na konci funkcie akokeby nezanikol (on zanikne ale skopiruje sa do ineho objektu vo volajucej funkcii):
Motorka vytvaracia_funkcia()
{
 Motorka x(1000);
...
 return(x); //mozem vratit objekt hodnotou (skopiruje sa, BTW.: moze byt pomale)
}; // tu sa znici objekt x, ale bol predtym skopirovany do volajucej fcie.

void main(void)
{
 Motorka m;
 m = vytvaracia_funkcia();
 m.VypisJakeMamFajneFaro();
} // tu sa znici objekt m.
Alebo presuvas parametre odkazom, to je vpodstate stejne jak to s pointrom, len sa nepise pointer ale Motorka& a pouziva sa akokeby objekt, t.j. ne m->Neco ale m.Neco

P.S. zapis Trieda() ktore si dal v dotaze je z principu nezmysel, je to defakto kontruktor triedy ktory akokeby volas, a ziaden objekt neexistuje. Ak to compiler pochopi tak OK, ale je to neskutocne matuci a nelogicky zapis.

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny