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); // postfixOperatory 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 zakresusizeof,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
- Operatory arytmetyczne i porównania
- Operatory wstawiania i ekstrakcji ze strumienia
- Operatory indeksowania i wywołania funkcji
- Operator porównania trójstronnego w C++20