C++ Academy · Lektion

Indeks- og funktionskaldsoperatorer

Overload [] og (), så typer opfører sig som containere eller callable-objekter

Lektion 3 af 413 trin

Indeks- og funktionskaldsoperatorer er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

operator[] — Indekseret adgang

Overbelast [], så din type kan bruges som et array. Det er nyttigt til containere, matricer og billedklasser.

class Vec {
    std::vector<double> data_;
public:
    double& operator[](size_t i) { return data_[i]; }
    double  operator[](size_t i) const { return data_[i]; }
};

To overbelastninger: const og ikke-const

Lever begge. Et kald på en const-instans vælger const-overbelastningen, mens en ikke-const-instans tillader tildeling.

Kontrol af grænser

operator[] kontrollerer normalt ikke grænser. Lever en separat at()-metode, der kaster en undtagelse — ligesom standardbiblioteket.

double& at(size_t i) {
    if (i >= data_.size()) throw std::out_of_range("");
    return data_[i];
}

Flerdimensionel indeksering (C++23)

C++23 tilføjede indeksering med kommaseparerede argumenter: m[i, j]. I tidligere versioner skal du bruge et funktionskald eller kædede indekseringer.

// C++23
double& operator[](size_t i, size_t j);

// Pre-C++23 workaround
double& operator()(size_t i, size_t j);

operator() — Funktionskald

Overbelast (), så instanser kan kaldes. Det bruges til funktorer, matrixindeksering og konfigurerbare prædikater.

struct Square {
    int operator()(int x) const { return x * x; }
};

Square sq;
std::cout << sq(5);   // 25

Funktorer med tilstand

Funktionskaldsoperatoren fungerer sammen med medlemsvariable og giver et kaldbart objekt med tilstand.

struct GreaterThan {
    int threshold;
    bool operator()(int x) const { return x > threshold; }
};

GreaterThan over10{10};
std::cout << over10(15);   // true

Brug med STL-algoritmer

Giv funktorinstanser til algoritmer i stedet for funktioner.

std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});

Operatorer med flere argumenter

Både [] (før C++23) og () kan overbelastes med et vilkårligt antal argumenter. () er det mere fleksible valg til matrixlignende adgang før C++23.

Returnering af referencer kontra værdier

Returnér en reference, så det er muligt at tildele gennem indekseringen. Returnér en værdi for skrivebeskyttede typer.

Proxyobjekter

Hvis operator[] skal returnere et komplekst objekt (f.eks. et bitfelt), skal du returnere en lille proxyklasse med konverterings- og tildelingsoperatorer.

Eksempler fra virkeligheden

Almindelige anvendelser:

  • std::vector::operator[]
  • std::map::operator[] — indsætter ved manglende nøgler
  • Matrixklasser: m(i, j)
  • Funktorer til algoritmer

Hurtigt tjek

Hvordan gør du instanser af en klasse kaldbare som en funktion?

Opsummering

Overbelast [] til indekseret adgang (lever const- og ikke-const-overbelastninger). Overbelast (), så instanser kan kaldes — det er grundlaget for funktorer og lambdaer.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Indeks- og funktionskaldsoperatorer” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Indeks- og funktionskaldsoperatorer”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Indeks- og funktionskaldsoperatorer”?

Overload [] og (), så typer opfører sig som containere eller callable-objekter Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Indeks- og funktionskaldsoperatorer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Aritmetiske operatorer og sammenligningsoperatorer
  2. Operatorer til streamindsættelse og -udtræk
  3. Indeks- og funktionskaldsoperatorer
  4. Trevejs-sammenligningsoperatoren i C++20
← Tilbage til C++ Academy