C++ Operator Przeciążanie przykładami
Co to jest OperaTor Przeciążenie?
Korzystanie z przeciążenie operatora in C++, możesz określić więcej niż jedno znaczenie operatora w jednym zakresie. Celem przeciążania operatora jest zapewnienie specjalnego znaczenia operatora dla typu danych zdefiniowanego przez użytkownika.
Za pomocą przeciążania operatorów możesz zdefiniować na nowo większość C++ operatorzy. Możesz również użyć przeciążania operatorów, aby wykonać różne operacje za pomocą jednego operatora.
Składnia
Aby przeciążyć A C++ operator, należy zdefiniować specjalną funkcję wewnątrz klasy w następujący sposób:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
Oto wyjaśnienie powyższej składni:
- Typ_powrotu jest typem zwracanym przez funkcję.
- Następnie należy wspomnieć o słowie kluczowym operator.
- Symbol oznacza symbol operatora, który ma zostać przeciążony. Na przykład +, -, <, ++.
- Argument(y) można przekazać do funkcji operatora w taki sam sposób jak funkcje.
1 przykład
#include <iostream> 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; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
- Utwórz klasę o nazwie TestClass.
- Użyj modyfikatora dostępu prywatnego, który oznacza członka klasy jako dostępnego prywatnie.
- Utwórz liczbę zmiennych całkowitych. Ta zmienna będzie dostępna prywatnie.
- Użyj modyfikatora dostępu publicznego, który oznacza członka klasy jako dostępnego prywatnie.
- Użyj konstruktora klasy, aby zainicjować licznik zmiennej na 5.
- Przeciążenie znaczenia operatora —.
- Operator zmniejszy wartość zmiennej x o 1.
- Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
- Definiowanie funkcji o nazwie Display().
- Wydrukuj wartość licznika zmiennych wraz z innym tekstem na konsoli, gdy zostanie wywołana funkcja Display(). Znak } oznacza koniec treści funkcji Display().
- Koniec treści zajęć.
- 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 operatora void –().
- Użyj stanowiska klasy TestClass, aby wywołać funkcję Display().
- Funkcja musi zwracać wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main().
Różne podejścia do Operator Przeciążanie w C++
Przeciążanie operatora można wykonać poprzez implementację dowolnego z następujących typów funkcji:
- Funkcja członkowska
- Funkcja niebędąca członkiem
- Funkcja przyjaciela
- Funkcja przeciążania operatora może być funkcją członkowską, gdy operand lewy jest obiektem klasy.
- Gdy lewy operand jest inny, OperaFunkcja przeciążająca Tora powinna być funkcją niebędącą funkcją członkowską.
Funkcję przeciążania operatora możesz uczynić funkcją zaprzyjaźnioną, jeśli musi ona uzyskać dostęp do prywatnych i chronionych elementów klasy.
Mogą wszyscy C++ OperaTors być przeciążony?
Nie. Są C++ operatorów, których nie można przeciążać.
Obejmują one:
- :: -Operator rozdzielczości zakresu
- ?: -operator trójargumentowy.
- . -selektor członków
- Operator sizeof
- * -selektor wskaźnika elementu członkowskiego
Rzeczy do zapamiętania
- Dzięki przeciążaniu operatora możesz zdefiniować na nowo sposób działania operatora tylko dla typów zdefiniowanych przez użytkownika (obiekty, struktury). Nie możesz używać go dla typów wbudowanych (float, char, int itd.).
- = i & C++ operatorzy są domyślnie przeciążeni. Na przykład możesz skopiować obiekty tej samej klasy bezpośrednio używając operatora =.
- Operator precedence nie zmienia asocjacyjności i pierwszeństwa operatorów. Możesz jednak zmienić kolejność oceny za pomocą nawiasów.
- Istnieją cztery operatory, których nie można przeciążać C++Należą do nich operator rozdzielczości zakresu (::), operator wyboru członka (.), operator wyboru członka poprzez wskaźnik do funkcji (.*) i operator trójargumentowy (?:).
Zasady dla OperaTor Przeciążenie
Oto zasady dot OperaPrzeciążenie tora:
- Aby to zadziałało, przynajmniej jeden operand musi być obiektem klasy zdefiniowanym przez użytkownika.
- Można przeciążać tylko istniejących operatorów. Nie można przeciążać nowych operatorów.
- Niektórych operatorów nie można przeciążać za pomocą funkcji zaprzyjaźnionej. Jednak takie operatory można przeciążać za pomocą funkcji członkowskiej.
Jak przeciążyć OperaTor
1 przykład
#include <iostream> 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; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
- Utwórz klasę o nazwie OperatorPrzeciążenie.
- Użyj modyfikatora dostępu prywatnego, który oznacza członka klasy jako dostępnego prywatnie.
- Utwórz zmienną całkowitą x. Ta zmienna będzie dostępna prywatnie.
- Użyj modyfikatora dostępu publicznego, który oznacza członka klasy jako dostępnego prywatnie.
- Użyj konstruktora klasy, aby zainicjować zmienną x na 10.
- Przeciążenie znaczenia operatora ++.
- Operator zwiększy wartość zmiennej x o 2.
- Koniec sekcji przeciążania operatora. Operatorowi nadano nową nazwę.
- Wywołanie funkcji Print().
- Wydrukuj wartość zmiennej x wraz z innym tekstem na konsoli, gdy zostanie wywołana funkcja Print().
- Koniec treści funkcji Print().
- Koniec treści zajęć.
- Wywołaj funkcję main(). W ramach tej funkcji należy dodać logikę programu.
- Utwórz instancję OperatorOverload Klasa o nazwie ov.
- Spowoduje to wywołanie funkcji operatora void ++().
- Użyj postawy OperatorOverload do wywołania funkcji Print().
- Funkcja musi zwracać wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main().
2 przykład
#include<iostream> using 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(); }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołączenie pliku nagłówkowego iostream do naszego programu w celu wykorzystania jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
- Utwórz klasę o nazwie TestClass. Znak { 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 większą.
- Użyj modyfikatora dostępu publicznego, aby oznaczyć konstruktor jako publiczny, co oznacza, że będzie on dostępny nawet poza klasą.
- Tworzenie konstruktora klasy i inicjowanie zmienne.
- Zainicjuj wartość zmiennej real.
- Zainicjuj wartość zmiennej over.
- Koniec ciała konstruktora.
- Zastąp znaczenie operatora +.
- Utwórz wynik typu danych typu TestClass.
- Użyj operatora + z liczbami zespolonymi. Ten wiersz doda część rzeczywistą liczby do części rzeczywistej innej liczby.
- Użyj operatora + z liczbami zespolonymi. Ten wiersz doda część urojoną liczby do części urojonej innej liczby.
- Program zwróci wartość zmiennej wynik po pomyślnym wykonaniu.
- Koniec definicji nowego znaczenia operatora +, czyli przeciążania.
- 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().
- Przekazanie wartości części rzeczywistych i zespolonych, które mają zostać dodane. 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.
- Wydrukowanie wartości zmiennej c3 na konsoli.
- Koniec treści funkcji main().
Podsumowanie
- Można określić więcej niż jedno znaczenie dla a C++ operator w jednym zakresie.
- Zjawisko to nazywa się przeciążaniem operatora.
- OperaPrzeciążenie Tor zapewnia specjalne znaczenie operatora dla typu danych zdefiniowanego przez użytkownika.
- Większość możesz przedefiniować C++ operatorów poprzez przeciążanie operatorów.
- Nie wszystkie C++ operatorzy mogą być przeciążeni.
- Aby operator został przeciążony, przynajmniej jeden z operandów musi być obiektem zdefiniowanym przez użytkownika.
- Tylko istniejący operatorzy mogą być przeciążeni. Nie można przeciążać nowych operatorów.