Gyakorló feladatok (4. hét)
Fontosabb kulcsszavak, fogalmak
- inicializáló lista
- másoló konstruktor, értékadó operátor
- destruktor
- operátorok túlterhelése
- implicit tagfüggvények és azok átdefiniálása
- statikus adattagok és tagfüggvények
Javasolt gyakorló feladatok
- Bevezető feladat: egyszerű osztály megvalósítása.
Példa: Készítsen kör osztályt az alábbi műveletekkel:- inicializálható a sugár megadásával,
- sugár lekérdezése/beállítása
- kerület lekérdezése
- terület lekérdezése, osztályon kívüli definícióval
- kiírás ostream-re (pl. cout<<c)
- + operátor, amelynek eredménye egy olyan kör, amelynek területe a két operandus területének összege.
- A statikus tag alkalmazása.
Példa: Asztalokat akarunk nyilvántartani és minden pillanatban szeretnénk tudni, hogy hány asztalunk van. A feladat megoldásában használjuk a korábban készített String osztályt, vagy használhatjuk az STL-ből (Standard Template Library). - Dinamikus adattagú osztály.
Példa: Készítsen vektor osztályt, ami valósakat tárol dinamikusan. (Lásd az előadáson elhangzott KomplexTar.) Műveletek:- konstruktor az elemszám és elemek kezdőértéke megadásával (utóbbi elhagyható, ekkor 0 a kezdőérték)
- másoló konstruktor
- értékadó operátor
- destruktor
- indexelő ([]) operátor, túl-/alulindexelés elleni védelemmel
- String rejtvény a 4. heti előadásról: Milyen függvények hívódnak meg, milyen sorrendben?
class String { char *p; int size; public: String( ); // 1 String(const char *); // 2 String(String&); // 3 ~String( ); // 4 String operator+(String&); // 5 char& operator[](int); // 6 String& operator=(const String&); // 7 -- alternatív: értékparaméterrel }; int main() { String s1("rejtvény"); String s2; String s3=s2; char c = s3[3]; s2 = s3; s2 = s3 + s2 + s1; }
A C++ szabvány megengedi, hogy hatékony működés érdekében ne hívódjon másoló konstruktor olyan ideiglenes objektumok esetében, amelyeknek szerepe csupán egy másik objektum inicializálása. Emiatt a ténylegesen meghívott függvények eltérhetnek a várttól. Ezt a viselkedést GCC használata esetén a g++ -fno-elide-constructors kapcsolójával ki lehet kapcsolni. -
Másik rejtvény: Mit ír ki a program a main() függvény egyes sorainak hatására?
class A { int k; public: A(const int i = 0) :k(i){ cout << 'k'; } A(const A& a) { k = a.k; cout << 'c'; } void operator=(A& a) { k = a.k; f(a); cout << 'e'; } A& operator*(int i) { cout << i*100; return *this; } void f(A a) { k++; cout << 'f'; } ~A() { cout << 'd'; } }; A& operator*( int i, A& a ) { cout << i; return a; } int main() { A a = A(1); cout << '\n'; // ______ a = a * 2; cout << '\n'; // ______ a = 3 * a; cout << '\n'; // ______ } // ______
Utolsó frissítés: 2018-03-01 20.22