C++ Academy · Oppitunti

Arvon välitys ja viitteen välitys

Vertaa arvon ja viitteen välittämisen semanttisia ja suorituskykyyn liittyviä eroja.

Oppitunti 2/413 vaihetta

Arvon välitys ja viitteen välitys 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.

Arvon välityksen kertaus

Kun välität argumentin arvona, funktio saa kopion. Funktion sisällä tehdyt muutokset eivät vaikuta kutsujaan.

void increment(int x) {
    x++;          // modifies the copy
}

int n = 5;
increment(n);
std::cout << n;   // still 5

Viitteen välitys

Välittäkää viitteenä käyttämällä parametriluettelossa merkkiä &. Funktio käsittelee kutsujan muuttujaa suoraan.

void increment(int& x) {
    x++;
}

int n = 5;
increment(n);
std::cout << n;   // now 6

Miksi välittää viitteenä?

Kaksi syytä:

  • Kopioinnin välttäminen suurille olioille (suorituskyky)
  • Kutsujan muuttujan muokkaaminen (semantiikka)

Const-viite: molempien parhaat puolet

const-viite välttää kopioinnin antamatta funktiolle lupaa muokata arvoa. Käyttäkää sitä ei-triviaalien syöteparametrien kanssa.

void printName(const std::string& name) {
    std::cout << name;
}

Nyrkkisäännöt

Funktioiden parametreille:

  • Helposti kopioitava (int, double, osoitin) → välittäkää arvona
  • Hitaasti kopioitava ja vain luettava → const T&
  • Funktio muokkaa kutsujan tietoja → T&

Osoittimen välitys

Osoittimilla voi myös muokata kutsujan muuttujaa, mutta kutsujan on otettava osoite eksplisiittisesti merkillä &, jolloin tarkoitus on näkyvissä.

void increment(int* x) {
    (*x)++;
}

int n = 5;
increment(&n);

Viite- ja osoitinparametri

Viitteet ovat parempi vaihtoehto, kun arvo tarvitaan aina. Osoittimet sopivat, kun argumentti on valinnainen — välittäkää nullptr, jos haluatte ohittaa sen.

Palauttaminen arvona

Arvona palauttaminen on oletus. RVO:n (Return Value Optimization) ja siirtosemantiikan ansiosta se on yleensä yhtä nopeaa kuin viitteenä palauttaminen ja lisäksi turvallisempaa.

Palauttaminen viitteenä

Palauttakaa viite, kun funktio palauttaa olemassa olevan olion, joka säilyy funktion kutsua pidempään, esimerkiksi säilön jäsenen. Älkää koskaan palauttako viitettä paikalliseen muuttujaan.

Välitystapojen yhdistäminen malleissa

Malleissa käytetään usein universaaleja viitteitä (T&&) ja std::forward-toimintoa arvokategorioiden säilyttämiseen. Käsittelemme tämän Move Semantics -kurssilla.

Yleinen virhe: osan leikkautuminen

Välittäkää johdetut luokat viitteenä tai osoittimena kantaluokan parametrille. Arvona välittäminen leikkaa olion johdetun osan pois.

class Base { /* virtual */ };
class Derived : public Base { /* members */ };

void takeByValue(Base b);    // SLICES Derived!
void takeByRef(Base& b);     // OK

Pikatarkistus

Miten suuri std::string kannattaa välittää funktiolle, joka vain lukee sitä?

Kertaus

Arvona välittäminen kopioi, viitteenä välittäminen jakaa saman olion. Käyttäkää const T&-tyyppiä suurille vain luku -olioille, T&-tyyppiä kutsujan tietojen muokkaamiseen ja pieniä sisäänrakennettuja tyyppejä arvona.

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 ”Arvon välitys ja viitteen välitys” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Arvon välitys ja viitteen välitys”. 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 ”Arvon välitys ja viitteen välitys”?

Vertaa arvon ja viitteen välittämisen semanttisia ja suorituskykyyn liittyviä eroja. 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 ”Arvon välitys ja viitteen välitys”-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. Miksi viitteet ovat muuttujien aliaksia
  2. Arvon välitys ja viitteen välitys
  3. const-viitteet ja niiden käyttötarkoitus
  4. Viitteiden elinikä ja roikkuvat viitteet
← Takaisin: C++ Academy