0Pricing
C++ Academy · Lekcja

Operatory arytmetyczne i porównania

Przeciążaj +, -, *, /, ==, < i operatory pokrewne zgodnie z dobrymi praktykami

Operatory arytmetyczne i porównania to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Dlaczego przeciążać operatory?

Przeciążanie operatorów pozwala typom zachowywać się jak typy wbudowane — zapis v1 + v2 jest czytelniejszy niż v1.add(v2). Należy stosować je w przypadku typów wartości, takich jak wektory, liczby zespolone czy kwoty pieniężne.

Definiowanie operator+

Operator + można przeciążyć jako składową klasy albo funkcję niezależną. Funkcje niezależne są bardziej symetryczne.

struct Vec2 {
    double x, y;
    Vec2 operator+(const Vec2& other) const {
        return {x + other.x, y + other.y};
    }
};

Postać funkcji niezależnej

Funkcja niezależna nadaje obu operandом taki sam status — jest to przydatne, gdy konwersja może mieć zastosowanie do dowolnej strony.

Vec2 operator+(const Vec2& a, const Vec2& b) {
    return {a.x + b.x, a.y + b.y};
}

Operatory przypisania złożonego

Najpierw należy zaimplementować +=, a następnie zbudować na nim +. Jest to kanoniczny idiom.

Vec2& operator+=(const Vec2& other) {
    x += other.x;
    y += other.y;
    return *this;
}

Vec2 operator+(Vec2 lhs, const Vec2& rhs) {
    lhs += rhs;
    return lhs;
}

Operatory jednoargumentowe

Niektóre operatory są jednoargumentowe: -x, +x, !x, ~x, ++x, --x.

Vec2 operator-() const { return {-x, -y}; }

Inkrementacja prefiksowa a postfiksowa

Wersja prefiksowa nie przyjmuje parametru, a wersja postfiksowa przyjmuje fikcyjny parametr typu int w celu rozróżnienia obu wersji.

Counter& operator++();        // prefix
Counter  operator++(int);     // postfix

Operatory porównania

Operatory porównania zwracają wartość typu bool. Dla zachowania spójności najlepiej sprawdzają się funkcje niezależne.

bool operator==(const Vec2& a, const Vec2& b) {
    return a.x == b.x && a.y == b.y;
}
bool operator!=(const Vec2& a, const Vec2& b) { return !(a == b); }

Mniejsze niż na potrzeby porządkowania

Jeśli typ ma być sortowany lub używany jako klucz mapy, należy zdefiniować operator<. Pozostałe operatory relacyjne wynikają z jego definicji.

Symetryczne operatory dla różnych typów

Aby obsługiwać zarówno 3 + vec, jak i vec + 3, należy zdefiniować obie wersje albo użyć funkcji niezależnej wykonującej konwersję.

Unikanie niespodzianek

Przeciążone operatory powinny zachowywać się intuicyjnie. Nie należy redefiniować znaczenia + jako odejmowania. Należy trzymać się konwencjonalnej algebry danego operatora.

Operatorów, których nie można przeciążać

Niektórych operatorów nie można przeciążać:

  • ?: — operator trójargumentowy
  • . — dostęp do składowej (ale -> można przeciążać)
  • :: — kwalifikator zakresu
  • sizeof, alignof, typeid

Szybkie sprawdzenie

Jaki jest kanoniczny sposób implementacji operator+ dla typu użytkownika?

Podsumowanie

Przeciążanie operatorów sprawia, że typy użytkownika zachowują się jak typy wbudowane. Najpierw należy zaimplementować operator przypisania złożonego, a dopiero potem zwykłe operatory arytmetyczne. Operatory porównania najlepiej definiować jako funkcje wolnostojące. Należy trzymać się konwencjonalnej semantyki — nieoczekiwane działanie jest błędem.

Często zadawane pytania

Czy lekcja „Operatory arytmetyczne i porównania” jest bezpłatna?

Tak — pełny tekst „Operatory arytmetyczne i porównania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Operatory arytmetyczne i porównania”?

Przeciążaj +, -, *, /, ==, < i operatory pokrewne zgodnie z dobrymi praktykami Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Operatory arytmetyczne i porównania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Operatory arytmetyczne i porównania
  2. Operatory wstawiania i ekstrakcji ze strumienia
  3. Operatory indeksowania i wywołania funkcji
  4. Operator porównania trójstronnego w C++20
← Powrót do C++ Academy