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