Przeciążanie operatorów C ++ przykładami

Spisie treści:

Anonim

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:

#include using 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:

  1. Dołączanie pliku nagłówkowego iostream do naszego kodu, aby używać jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
  3. Utwórz klasę o nazwie TestClass.
  4. Użyj modyfikatora dostępu prywatnego, który oznacza element członkowski klasy jako dostępny prywatnie.
  5. Utwórz liczbę całkowitą zmiennej. Ta zmienna będzie dostępna prywatnie.
  6. Użyj modyfikatora dostępu publicznego, który oznacza element członkowski klasy jako dostępny prywatnie.
  7. Użyj konstruktora klasy, aby zainicjować licznik zmiennej na 5.
  8. Przeciąż znaczenie operatora -.
  9. Operator zmniejszy wartość zmiennej x o 1.
  10. Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
  11. Definiowanie funkcji o nazwie Display ().
  12. Wyświetla wartość zmiennej count wraz z innym tekstem na konsoli, gdy wywoływana jest funkcja Display (). Znak} oznacza koniec treści funkcji Display ().
  13. Koniec treści klasy.
  14. Wywołaj funkcję main (). W ramach tej funkcji należy dodać logikę programu.
  15. Utwórz instancję klasy TestClass i nadaj jej nazwę tc.
  16. Spowoduje to wywołanie funkcji void operator - ().
  17. Użyj stanowiska klasy TestClass, aby wywołać funkcję Display ().
  18. Funkcja musi zwrócić wartość po pomyślnym zakończeniu.
  19. 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:

  1. Funkcja członka
  2. Funkcja niebędąca członkiem
  3. 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:

  1. 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.).
  2. Operatory = i & C ++ są domyślnie przeciążone. Na przykład możesz skopiować obiekty tej samej klasy bezpośrednio za pomocą operatora =.
  3. Pierwszeństwo operatorów nie zmienia asocjacyjności i pierwszeństwa operatorów. Możesz jednak zmienić kolejność oceny, używając nawiasów.
  4. 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:

#include using 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:

  1. Dołączanie pliku nagłówkowego iostream do naszego kodu, aby używać jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
  3. Utwórz klasę o nazwie OperatorOverload.
  4. Użyj modyfikatora dostępu prywatnego, który oznacza element członkowski klasy jako dostępny prywatnie.
  5. Utwórz zmienną całkowitą x. Ta zmienna będzie dostępna prywatnie.
  6. Użyj modyfikatora dostępu publicznego, który oznacza element członkowski klasy jako dostępny prywatnie.
  7. Użyj konstruktora klasy, aby zainicjować zmienną x do 10.
  8. Przeciąż znaczenie operatora ++.
  9. Operator zwiększy wartość zmiennej x o 2.
  10. Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
  11. Wywołanie funkcji Print ().
  12. Wyświetla wartość zmiennej x obok innego tekstu na konsoli, gdy wywoływana jest funkcja Print ().
  13. Koniec treści funkcji Print ().
  14. Koniec treści klasy.
  15. Wywołaj funkcję main (). W ramach tej funkcji należy dodać logikę programu.
  16. Utwórz wystąpienie klasy OperatorOverload o nazwie ov.
  17. Spowoduje to wywołanie funkcji void operator ++ ().
  18. Użyj stanowiska klasy OperatorOverload, aby wywołać funkcję Print ().
  19. Funkcja musi zwrócić wartość po pomyślnym zakończeniu.
  20. 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:

  1. Dołączanie pliku nagłówkowego iostream do naszego programu w celu wykorzystania jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby używać jego klas bez wywoływania jej.
  3. Utwórz klasę o nazwie TestClass. {Oznacza początek treści klasy.
  4. 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.
  5. Zdefiniuj dwie zmienne całkowite, rzeczywistą i wyższą.
  6. Użyj modyfikatora dostępu publicznego, aby oznaczyć konstruktor jako publiczny, co oznacza, że ​​będzie dostępny nawet poza klasą.
  7. Tworzenie konstruktora klasy i inicjalizacja zmiennych.
  8. Zainicjuj wartość zmiennej real.
  9. Zainicjuj wartość zmiennej powyżej.
  10. Koniec treści konstruktora.
  11. Zastąp znaczenie operatora +.
  12. Utwórz wynik typu danych typu TestClass.
  13. Użyj operatora + na liczbach zespolonych. Ta linia doda część rzeczywistą liczby do części rzeczywistej innej liczby.
  14. Użyj operatora + na liczbach zespolonych. Ta linia doda urojoną część liczby do urojonej części innej liczby.
  15. Program zwróci wartość wyniku zmiennej po pomyślnym wykonaniu.
  16. Koniec definicji nowego znaczenia operatora +, czyli przeciążenia.
  17. Wywołaj metodę print ().
  18. Wydrukuj nową liczbę zespoloną po dodaniu na konsoli.
  19. Koniec treści funkcji print ().
  20. Koniec treści klasy TestClass.
  21. Wywołanie funkcji main ().
  22. 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.
  23. Wykonywanie operacji przy użyciu przeciążonego operatora + i przechowywanie wyniku w zmiennej c3.
  24. Wydruk wartości zmiennej c3 na konsoli.
  25. 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.