Ugrás a tartalomhoz

subscript operator

A Wikiszótárból, a nyitott szótárból


Főnév

subscript operator (tsz. subscript operators)

  1. (informatika) A subscript operator (operator[]) C++-ban egy túlterhelhető operátor, amelyet arra használunk, hogy egy objektumból index alapján elérjük egy elemét, mintha tömb lenne. A [] operátor segítségével saját osztályainkat is tömbszerűen használhatóvá tehetjük.



🧠 Alap szintaxis

Beépített típusnál (pl. tömb):

int arr[5] = {1, 2, 3, 4, 5};
std::cout << arr[2];  // Kiírja: 3

Saját típusnál:

class SajatTomb {
    int data[10];
public:
    int& operator[](int index) {
        return data[index];
    }
};

🎯 Célja

A [] operátor túlterhelésével az osztályunk viselkedhet úgy, mint egy tömb vagy térkép:

SajatTomb t;
t[3] = 42;
std::cout << t[3];  // 42

🧱 Alapvető forma

T& operator[](int index);
const T& operator[](int index) const;
  • nem-const verzió: írható referencia (pl. balértékként használható)
  • const verzió: csak olvasható



🔐 Példa: saját vektor

class IntVector {
    int* data;
    int size;
public:
    IntVector(int n): size(n) {
        data = new int[n]{};
    }

    ~IntVector() {
        delete[] data;
    }

    int& operator[](int i) {
        if (i < 0 || i >= size) throw std::out_of_range("index out of range");
        return data[i];
    }

    const int& operator[](int i) const {
        if (i < 0 || i >= size) throw std::out_of_range("index out of range");
        return data[i];
    }
};

✅ Használat

IntVector v(5);
v[2] = 99;
std::cout << v[2];  // 99

⚠️ Fontos megjegyzések

Szempont Megjegyzés
Hibatűrés Nem kötelező bounds check, de ajánlott (throw std::out_of_range)
const helyzet const objektumokon csak a const verzió hívható
Referenciát ad vissza Így lehet értéket módosítani: v[1] = 7;
Bármilyen index típus lehet nem csak int, lehet pl. std::string is map-szerű osztálynál



🗂️ Haladó példa – asszociatív indexelés

#include <map>
#include <string>

class Config {
    std::map<std::string, std::string> data;
public:
    std::string& operator[](const std::string& key) {
        return data[key];
    }

    const std::string& operator[](const std::string& key) const {
        return data.at(key); // dob kivételt ha nem létezik
    }
};

🧪 STL és operator[]

  • std::vector, std::array, std::map, std::unordered_map, std::string stb. mind túlterhelik az operator[]-t.
  • Viselkedésük típusonként eltér:
Típus Viselkedés
std::vector nincs bounds check
std::map ha nem létezik kulcs, új elemet hoz létre
std::string nincs bounds check



🔁 Különbség [] és .at() között

Művelet Hibakezelés
v[i] nincs ellenőrzés
v.at(i) dob out_of_range kivételt



🧾 Összegzés

  • Az operator[] túlterhelés lehetővé teszi, hogy osztályainkat indexelhető objektumként kezeljük.
  • Két verziója szokásos: íráshoz és csak olvasáshoz.
  • Hasznos saját vektor, mátrix, kulcs-érték alapú adattárolók esetén.
  • Használatánál figyelni kell a bounds checking-re és a referenciákra.