C++ Academy · Oppitunti

Rajattu enum class

Tyyppiturvalliset luettelot

Oppitunti 1/413 vaihetta

Rajattu enum class on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.

Tavalliset enum-tyypit vuotavat nimet

Perinteinen C-tyylinen enum tuo nimensä ympäröivään näkyvyysalueeseen ja muuntuu hiljaisesti int-tyypiksi. Tämä tekee nimien yhteentörmäyksistä ja tahattomista vertailuista helppoja.

  • enum class ratkaisee molemmat ongelmat.
  • Arvot ovat rajattuja ja vahvasti tyypitettyjä.
#include <iostream>
enum Color { Red, Green, Blue };
int main() {
    Color c = Green;
    int x = c; // implicit conversion to int
    std::cout << x << "\n";
}

Rajatun enum-tyypin määrittäminen

Lisätkää class- tai struct-avainsana, jotta luotte rajatun enum-tyypin. Tämän jälkeen jokainen arvo on määritettävä enum-tyypin nimellä.

#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Green;
    if (c == Color::Green) std::cout << "green\n";
}

Ei implisiittistä muunnosta

Rajattu enum-tyyppi ei muunnu implisiittisesti int-tyypiksi. Tämä estää virheet, joissa enum-tyyppiä käytetään vahingossa aritmetiikassa.

  • Saadaksenne numeron teidän on käytettävä eksplisiittistä muunnosta.
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Blue;
    int n = static_cast<int>(c); // explicit
    std::cout << n << "\n"; // prints 2
}

Taustalla oleva tyyppi

Oletusarvoinen taustalla oleva tyyppi on int, mutta voitte valita pienemmän tai tietyn kokonaislukutyypin tilan säästämiseksi tai protokollan mukaisesti.

#include <iostream>
#include <cstdint>
enum class Status : std::uint8_t { Ok = 0, Warn = 1, Error = 2 };
int main() {
    Status s = Status::Warn;
    std::cout << static_cast<int>(s) << "\n";
}

Mukautetut arvot

Voitte määrittää enum-arvoille eksplisiittiset arvot. Eksplisiittistä arvoa seuraavat arvot jatkavat laskemista siitä eteenpäin.

#include <iostream>
enum class Http { Ok = 200, NotFound = 404, ServerError = 500 };
int main() {
    Http h = Http::NotFound;
    std::cout << static_cast<int>(h) << "\n";
}

Enumin käsittely switch-lauseella

Enum-tyypit ovat parhaimmillaan switch-lauseissa. Jokaisen tapauksen luetteleminen tekee tarkoituksesta selvän ja antaa kääntäjälle mahdollisuuden varoittaa puuttuvista tapauksista.

#include <iostream>
enum class Dir { North, East, South, West };
const char* name(Dir d) {
    switch (d) {
        case Dir::North: return "N";
        case Dir::East:  return "E";
        case Dir::South: return "S";
        case Dir::West:  return "W";
    }
    return "?";
}
int main() { std::cout << name(Dir::East) << "\n"; }

Enum-tyypit funktioargumentteina

Rajatun enum-tyypin välittäminen ilmaisee tarkoituksen paljon paremmin kuin paljaan int- tai bool-arvon välittäminen. Kääntäjä varmistaa, että käytössä ovat vain kelvolliset enum-arvot.

#include <iostream>
enum class Align { Left, Center, Right };
void render(const char* text, Align a) {
    std::cout << text << " aligned " << static_cast<int>(a) << "\n";
}
int main() { render("Hi", Align::Center); }

Enum-arvojen vertaileminen

Rajatut enum-tyypit tukevat suoraan operaattoreita == ja !=. Myös vertailuoperaattorit (<, >) toimivat, koska arvot ovat järjestettyjä.

#include <iostream>
enum class Level { Low, Medium, High };
int main() {
    Level l = Level::High;
    std::cout << (l > Level::Low ? "above low\n" : "low\n");
}

Käsitteellinen läpikäynti

Enum-tyypit eivät ole automaattisesti iteroitavia, mutta yleinen tapa on muuntaa arvot taustalla oleviksi kokonaisluvuiksi. Käyttäkää päätearvoa, kuten Count, alueen määrittämiseen.

#include <iostream>
enum class Coin { Penny, Nickel, Dime, Count };
int main() {
    for (int i = 0; i < static_cast<int>(Coin::Count); ++i)
        std::cout << i << " ";
    std::cout << "\n";
}

Miksi tyyppiturvallisuus on tärkeää

Kahta toisiinsa liittymätöntä rajattua enum-tyyppiä ei voi koskaan yhdistää vahingossa, vaikka molemmissa olisi arvo nimeltä None. Kääntäjä käsittelee niitä erillisinä tyyppeinä.

#include <iostream>
enum class Fruit { None, Apple };
enum class Tool  { None, Hammer };
int main() {
    Fruit f = Fruit::None;
    // Tool t = f; // would NOT compile
    std::cout << (f == Fruit::None) << "\n";
}

Milloin tavallisia enum-tyyppejä käytetään

Tavallisia enum-tyyppejä esiintyy edelleen vanhoissa rajapinnoissa ja bittilippukoodissa, jossa implisiittinen int-muunnos on kätevä. Uudessa koodissa suosikaa enum class -tyyppiä, ellei teillä ole erityistä syytä toimia toisin.

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte rajattuja enum-tyyppejä.

Kertaus

Opitte rajatuista enum-tyypeistä:

  • enum class rajaa arvot ja estää implisiittisen int-muunnoksen.
  • Käyttäkää static_cast<int>-muunnosta numeron lukemiseen.
  • Valitkaa taustalla oleva tyyppi käyttäen määrettä : type.
  • Suosikaa enum class -tyyppiä tyyppiturvalliseen ja itsensä dokumentoivaan koodiin.
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 ”Rajattu enum class” ilmainen?

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

Tyyppiturvalliset luettelot 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 1/4.

Kuinka kauan ”Rajattu enum class”-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. Rajattu enum class
  2. Unionit ja niiden riskit
  3. std::variant
  4. std::visit
← Takaisin: C++ Academy