Co to jest przeciążanie operatorów?
Używając przeciążania operatorów w C ++, możesz określić więcej niż jedno znaczenie dla operatora w jednym zakresie. Celem przeciążenia operatora jest zapewnienie specjalnego znaczenia operatora dla typu danych zdefiniowanego przez użytkownika.
Za pomocą przeciążania operatorów można przedefiniować większość operatorów C ++. Przeciążanie operatorów można również używać do wykonywania różnych operacji przy użyciu jednego operatora.
W tym samouczku C ++ nauczysz się:
- Co to jest przeciążanie operatorów?
- Składnia
- Różne podejścia do przeciążania operatorów w C ++
- Czy wszystkie operatory C ++ mogą być przeciążone?
- Rzeczy do zapamiętania:
- Zasady dotyczące przeciążania operatorów:
- Jak przeciążać operatora:
Składnia
Aby przeciążyć operator C ++, należy zdefiniować specjalną funkcję wewnątrz klasy w następujący sposób:
class class_name{… publicreturn_type operator symbol (argument(s)){… }… };
Oto wyjaśnienie powyższej składni:
- Return_type to typ zwracany przez funkcję.
- Następnie wspomnij o słowie kluczowym operatora.
- Symbol oznacza przeciążony symbol operatora. Na przykład +, -, <, ++.
- Argument (y) można przekazać do funkcji operatora w taki sam sposób jak funkcje.
Przykład 1:
#includeusing namespace std;class TestClass {private:int count;public:TestClass() : count(5) {}void operator --() {count = count - 3;}void Display() {cout << "Count: " << count; }};int main() {TestClass tc;--tc;tc.Display();return 0;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołączanie pliku nagłówkowego iostream do naszego kodu, aby używać jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
- Utwórz klasę o nazwie TestClass.
- Użyj modyfikatora dostępu prywatnego, który oznacza element członkowski klasy jako dostępny prywatnie.
- Utwórz liczbę całkowitą zmiennej. Ta zmienna będzie dostępna prywatnie.
- Użyj modyfikatora dostępu publicznego, który oznacza element członkowski klasy jako dostępny prywatnie.
- Użyj konstruktora klasy, aby zainicjować licznik zmiennej na 5.
- Przeciąż znaczenie operatora -.
- Operator zmniejszy wartość zmiennej x o 1.
- Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
- Definiowanie funkcji o nazwie Display ().
- Wyświetla wartość zmiennej count wraz z innym tekstem na konsoli, gdy wywoływana jest funkcja Display (). Znak} oznacza koniec treści funkcji Display ().
- Koniec treści klasy.
- Wywołaj funkcję main (). W ramach tej funkcji należy dodać logikę programu.
- Utwórz instancję klasy TestClass i nadaj jej nazwę tc.
- Spowoduje to wywołanie funkcji void operator - ().
- Użyj stanowiska klasy TestClass, aby wywołać funkcję Display ().
- Funkcja musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main ().
Różne podejścia do przeciążania operatorów w C ++
Przeciążanie operatorów można wykonać, implementując dowolny z następujących typów funkcji:
- Funkcja członka
- Funkcja niebędąca członkiem
- Funkcja znajomego
- Funkcja przeciążania operatora może być funkcją składową, gdy lewy operand jest obiektem Class.
- Gdy lewy operand jest inny, funkcja przeciążania operatora powinna być funkcją niebędącą składową.
Funkcję przeciążania operatora można uczynić funkcją zaprzyjaźnioną, jeśli potrzebuje dostępu do prywatnych i chronionych elementów członkowskich klasy.
Czy wszystkie operatory C ++ mogą być przeciążone?
Nie. Istnieją operatory C ++, których nie można przeciążać.
Zawierają:
- :: -Scope Operator rozdzielczości
- ?: - operator zewnętrzny.
- . - selektor członków
- Operator rozmiaru
- * -member wskaźnik selektora
Rzeczy do zapamiętania:
- Dzięki przeciążeniu operatorów możesz przedefiniować sposób działania operatora tylko dla typów zdefiniowanych przez użytkownika (obiekty, struktury). Nie można go używać do typów wbudowanych (float, char, int itp.).
- Operatory = i & C ++ są domyślnie przeciążone. Na przykład możesz skopiować obiekty tej samej klasy bezpośrednio za pomocą operatora =.
- Pierwszeństwo operatorów nie zmienia asocjacyjności i pierwszeństwa operatorów. Możesz jednak zmienić kolejność oceny, używając nawiasów.
- Istnieją cztery operatory, których nie można przeciążać w C ++. Obejmują one operator rozpoznawania zakresu (: :), operator wyboru elementu (.), Wybór elementu przez wskaźnik do operatora funkcji (. *) I operator trójskładnikowy (? :).
Zasady dotyczące przeciążania operatorów:
Oto zasady dotyczące przeciążania operatorów:
- Aby to działało, co najmniej jeden operand musi być obiektem klasy zdefiniowanym przez użytkownika.
- Możesz przeciążać tylko istniejących operatorów. Nie możesz przeciążać nowych operatorów.
- Niektórych operatorów nie można przeciążać za pomocą funkcji znajomego. Jednak takie operatory mogą być przeciążane przy użyciu funkcji składowej.
Jak przeciążać operatora:
Przykład 1:
#includeusing namespace std;class OperatorOverload {private:int x;public:OperatorOverload() : x(10) {}void operator ++() {x = x + 2;}void Print() {cout << "The Count is: " << x;}};int main() {OperatorOverload ov;++ov;ov.Print();return 0;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołączanie pliku nagłówkowego iostream do naszego kodu, aby używać jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
- Utwórz klasę o nazwie OperatorOverload.
- Użyj modyfikatora dostępu prywatnego, który oznacza element członkowski klasy jako dostępny prywatnie.
- Utwórz zmienną całkowitą x. Ta zmienna będzie dostępna prywatnie.
- Użyj modyfikatora dostępu publicznego, który oznacza element członkowski klasy jako dostępny prywatnie.
- Użyj konstruktora klasy, aby zainicjować zmienną x do 10.
- Przeciąż znaczenie operatora ++.
- Operator zwiększy wartość zmiennej x o 2.
- Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
- Wywołanie funkcji Print ().
- Wyświetla wartość zmiennej x obok innego tekstu na konsoli, gdy wywoływana jest funkcja Print ().
- Koniec treści funkcji Print ().
- Koniec treści klasy.
- Wywołaj funkcję main (). W ramach tej funkcji należy dodać logikę programu.
- Utwórz wystąpienie klasy OperatorOverload o nazwie ov.
- Spowoduje to wywołanie funkcji void operator ++ ().
- Użyj stanowiska klasy OperatorOverload, aby wywołać funkcję Print ().
- Funkcja musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main ().
Przykład 2:
#includeusing namespace std;class TestClass {private:int real, over;public:TestClass(int rl = 0, int ov = 0) {real = rl;over = ov;}TestClass operator + (TestClass const &obj) {TestClass result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){TestClass c1(9, 5), c2(4, 3);TestClass c3 = c1 + c2;c3.print();}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołączanie pliku nagłówkowego iostream do naszego programu w celu wykorzystania jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jego klas bez wywoływania jej.
- Utwórz klasę o nazwie TestClass. {Oznacza początek treści klasy.
- Użyj modyfikatora dostępu prywatnego, aby oznaczyć zmienne jako prywatne, co oznacza, że można uzyskać do nich dostęp tylko z poziomu klasy.
- Zdefiniuj dwie zmienne całkowite, rzeczywistą i wyższą.
- Użyj modyfikatora dostępu publicznego, aby oznaczyć konstruktor jako publiczny, co oznacza, że będzie dostępny nawet poza klasą.
- Tworzenie konstruktora klasy i inicjalizacja zmiennych.
- Zainicjuj wartość zmiennej real.
- Zainicjuj wartość zmiennej powyżej.
- Koniec treści konstruktora.
- Zastąp znaczenie operatora +.
- Utwórz wynik typu danych typu TestClass.
- Użyj operatora + na liczbach zespolonych. Ta linia doda część rzeczywistą liczby do części rzeczywistej innej liczby.
- Użyj operatora + na liczbach zespolonych. Ta linia doda urojoną część liczby do urojonej części innej liczby.
- Program zwróci wartość wyniku zmiennej po pomyślnym wykonaniu.
- Koniec definicji nowego znaczenia operatora +, czyli przeciążenia.
- Wywołaj metodę print ().
- Wydrukuj nową liczbę zespoloną po dodaniu na konsoli.
- Koniec treści funkcji print ().
- Koniec treści klasy TestClass.
- Wywołanie funkcji main ().
- Przekazywanie wartości zarówno rzeczywistych, jak i złożonych części do dodania. Pierwsza część c1 zostanie dodana do pierwszej części c2, czyli 9 + 4. Druga część c1 zostanie dodana do drugiej części c, czyli 5 + 3.
- Wykonywanie operacji przy użyciu przeciążonego operatora + i przechowywanie wyniku w zmiennej c3.
- Wydruk wartości zmiennej c3 na konsoli.
- Koniec treści funkcji main ().
Podsumowanie:
- W jednym zakresie można określić więcej niż jedno znaczenie dla operatora C ++.
- Nazywa się to przeciążeniem operatora.
- Przeciążanie operatorów zapewnia specjalne znaczenie operatora dla typu danych zdefiniowanego przez użytkownika.
- Większość operatorów języka C ++ można przedefiniować za pomocą przeciążania operatorów.
- Nie wszystkie operatory C ++ mogą być przeciążone.
- Aby operator został przeciążony, co najmniej jeden z operandów musi być obiektem zdefiniowanym przez użytkownika.
- Przeciążać można tylko istniejących operatorów. Nie możesz przeciążać nowych operatorów.