C++ Akademie SH Za áte níci C++ 2. kv tna 2011
Obsah 1 Objektov orientované programování
Obsah Objektov orientované programování 1 Objektov orientované programování
P et ºování Jev, díky kterému m ºeme denovat metody nebo funkce se stejným jménem. P íklad - 01.cpp: int secti(int a, int b){ cout << "Scitani typu int." << endl; return a + b; } double secti(double a, double b){ cout << "Scitani typu double." << endl; return a + b; }
S ítání vlastních objekt - bez p et ºování Pokud máme n jakou vlastní t ídu m ºeme si napsat podobnou funkci se ti. Ov²em narazíme na n kolik problém. P íklad - 02.cpp: Complex secti(complex a, Complex b){ Complex v(0,0); cout << "Scitani typu Complex ("; a.vypis(); cout << ") + ("; b.vypis(); cout << ")." << endl; //problematicky vypis v.setre(a.getre() + b.getre()); //prebytecne setry, getry v.setim(a.getim() + b.getim()); } return v;
S ítání vlastních objekt - s p et ºování Lep²í e²ení je pomocí p et ºování operátor. P íklad - 03.cpp: class Complex{ public: Complex(int, int); Complex operator+(complex) const; friend Complex operator-(complex, Complex); friend ostream& operator<<(ostream &,const Complex &); private: int m_re; int m_im; };
Pokud si vytvo íme objekt a nep edenujeme mu operátor =. Vytvo í se implicitní operátor =, který provádí m lkou kopii. M lká kopie M lká kopie vytvo í p esnou kopii, v²e co bylo ve starém objektu bude nyní v novém. Problém s ukazateli - 04.cpp: Pokud v na²em objektu byl n jaký ukazatel, který ukazoval na dynamicky alokovanou pam, zkopíruje se také, a poté ukazují dva ukazatelé z r znýcho objekt na stejný blok pam ti.
Hluboká kopie Hluboká kopie nám správn zkopíruje i ukazatele. Vytvo í se nové místo v pam t, na toto místo se zkopíruje pot ebná data a správn se nastaví ukazatel na nový blok pam ti. P íklad - 05.cpp: Pokud pot ebujeme v objektu vyuºít hlubokou kopii. Musíme p etíºit operátor =. Array & Array::operator=(const Array & x){ if(this == &x)return *this; delete [] m_pole; prvku = x.prvku; m_pole = new int[10]; for(int i = 0; i < x.prvku; i++) m_pole[i] = x.m_pole[i]; return *this; }
Aby bylo v²e úpln správn musíme je²t o²et it moºnost, kdy je objektu p i azen jiný objekt jiº p i jeho vytvá ení. P íklad Array pole 2 = pole1; Pokud není kopírující konstruktor vytvo en, op t se vytvo í implicitní, který prování m lkou kopii. - 06.cpp: Array::Array(const Array & x){ prvku = x.prvku; m_pole = new int[10]; } for(int i = 0; i < x.prvku; i++) m_pole[i] = x.m_pole[i];
Konec Objektov orientované programování Konec D kuji za pozornost!