C++ Academy · Oppitunti

const-jäsenfunktiot

Merkitse vain lukuun tarkoitetut metodit

Oppitunti 2/413 vaihetta

const-jäsenfunktiot on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on const-jäsenfunktio

const-määreellä merkitty jäsenfunktio lupaa olla muuttamatta olion havaittavaa tilaa. Avainsana sijoitetaan parametriluettelon jälkeen.

#include <iostream>

class Counter {
    int n = 0;
public:
    int value() const { return n; }   // read-only
    void inc() { ++n; }
};

int main() {
    Counter c;
    c.inc();
    std::cout << c.value() << "\n";
}

const-oliot kutsuvat const-metodeja

const-oliolle voi kutsua vain const-jäsenfunktioita. Ei-const-metodien kutsuminen on kielletty.

#include <iostream>

class Counter {
    int n = 0;
public:
    int value() const { return n; }
    void inc() { ++n; }
};

int main() {
    const Counter c;
    std::cout << c.value() << "\n";   // OK
    // c.inc();                        // ERROR
}

this muuttuu const-osoittimeksi

Const-jäsenfunktion sisällä this on osoitin const-arvoon, joten kääntäjä hylkää kaikki yritykset muuttaa jäseniä.

Merkitkää kaikki vain lukevat metodit const-määreellä

Getterien, kyselyfunktioiden ja tulostusfunktioiden tulisi kaikkien olla const-funktioita. Näin ne toimivat const-olioiden ja const-viitteiden kanssa.

const-ylikuormitus

Metodista voi tarjota sekä const- että ei-const-version; kääntäjä valitsee version sen perusteella, onko olio const.

#include <iostream>
#include <vector>

class Box {
    std::vector<int> v{1, 2, 3};
public:
    int& at(int i) { return v[i]; }              // mutable access
    const int& at(int i) const { return v[i]; }  // read-only access
};

int main() {
    Box b;
    b.at(0) = 99;
    std::cout << b.at(0) << "\n";
}

mutable-avainsana

mutable-jäsenet voivat muuttua myös const-metodin sisällä — tämä on hyödyllistä välimuisteille tai laskureille, jotka eivät kuulu loogiseen tilaan.

#include <iostream>

class Cache {
    mutable int hits = 0;
    int data = 42;
public:
    int get() const { ++hits; return data; }   // hits is mutable
    int hitCount() const { return hits; }
};

int main() {
    Cache c;
    c.get(); c.get();
    std::cout << c.hitCount() << "\n";
}

Looginen ja fyysinen const

const suojaa olion loogista tilaa; mutable sallii toteutuksen yksityiskohtien, kuten välimuistien, muuttua rikkomatta tätä lupausta.

const-metodit ja const-viitteet

const&-parametrin vastaanottava funktio voi kutsua sen kautta vain const-metodeja — tämä on yksi syy merkitä kyselyfunktiot const-funktioiksi.

#include <iostream>

class Counter {
    int n = 5;
public:
    int value() const { return n; }
};

void report(const Counter& c) {
    std::cout << c.value() << "\n";   // needs value() to be const
}

int main() { Counter c; report(c); }

const-viitteiden palauttaminen

Const-aksessorit palauttavat usein const&-viitteen, jotta jäsenet voidaan tuoda saataville ilman, että niitä voi muuttaa tai kopioida.

Älkää poistako const-määrettä valumuunnoksella

const_cast-muunnoksen käyttäminen aidosti const-olion muuttamiseen johtaa määrittelemättömään toimintaan. Käyttäkää sen sijaan mutable-määrettä oikeutettuihin poikkeuksiin.

const-oikeelliset luokat

Hyvin suunnitellussa luokassa kaikki tilaa muuttamattomat metodit merkitään const-määreellä, joten luokka toimii saumattomasti const-konteksteissa kaikkialla ohjelmassa.

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte const-jäsenfunktioita.

Kertaus

Opitte merkitsemään vain lukevat metodit const-määreellä, että const-oliot kutsuvat vain const-metodeja, miten const-määreen perusteella voidaan ylikuormittaa sekä miten mutable sallii toteutuksen yksityiskohtien muuttamisen. Välttäkää const_cast-muunnosta ja suunnitelkaa luokat const-oikeellisiksi heti alusta alkaen.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”const-jäsenfunktiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “const-jäsenfunktiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”const-jäsenfunktiot”?

Merkitse vain lukuun tarkoitetut metodit Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”const-jäsenfunktiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. const-muuttujat ja -parametrit
  2. const-jäsenfunktiot
  3. constexpr ja käännösaika
  4. consteval ja constinit
← Takaisin: C++ Academy