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:

OperaTor Przeciążenie

Oto zrzut ekranu kodu:

OperaTor Przeciążenie

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Utwórz klasę o nazwie TestClass.
  4. Użyj modyfikatora dostępu prywatnego, który oznacza członka klasy jako dostępnego prywatnie.
  5. Utwórz liczbę zmiennych całkowitych. Ta zmienna będzie dostępna prywatnie.
  6. Użyj modyfikatora dostępu publicznego, który oznacza członka klasy jako dostępnego prywatnie.
  7. Użyj konstruktora klasy, aby zainicjować licznik zmiennej na 5.
  8. Przeciążenie znaczenia 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. Wydrukuj wartość licznika zmiennych wraz z innym tekstem na konsoli, gdy zostanie wywołana funkcja Display(). Znak } oznacza koniec treści funkcji Display().
  13. Koniec treści zajęć.
  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 operatora void –().
  17. Użyj stanowiska klasy TestClass, aby wywołać funkcję Display().
  18. Funkcja musi zwracać wartość po pomyślnym zakończeniu.
  19. 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:

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

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

Przeciążać OperaTor Przykład

Oto zrzut ekranu kodu:

Przeciążać OperaTor Przykład

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Utwórz klasę o nazwie OperatorPrzeciążenie.
  4. Użyj modyfikatora dostępu prywatnego, który oznacza członka klasy jako dostępnego 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 członka klasy jako dostępnego prywatnie.
  7. Użyj konstruktora klasy, aby zainicjować zmienną x na 10.
  8. Przeciążenie znaczenia 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. Wydrukuj wartość zmiennej x wraz z innym tekstem na konsoli, gdy zostanie wywołana funkcja Print().
  13. Koniec treści funkcji Print().
  14. Koniec treści zajęć.
  15. Wywołaj funkcję main(). W ramach tej funkcji należy dodać logikę programu.
  16. Utwórz instancję OperatorOverload Klasa o nazwie ov.
  17. Spowoduje to wywołanie funkcji operatora void ++().
  18. Użyj postawy OperatorOverload do wywołania funkcji Print().
  19. Funkcja musi zwracać wartość po pomyślnym zakończeniu.
  20. 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:

Przeciążać OperaTor Przykład

Oto zrzut ekranu kodu:

Przeciążać OperaTor Przykład

Wyjaśnienie kodu:

  1. Dołączenie pliku nagłówkowego iostream do naszego programu w celu wykorzystania jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Utwórz klasę o nazwie TestClass. Znak { 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 większą.
  6. Użyj modyfikatora dostępu publicznego, aby oznaczyć konstruktor jako publiczny, co oznacza, że ​​będzie on dostępny nawet poza klasą.
  7. Tworzenie konstruktora klasy i inicjowanie zmienne.
  8. Zainicjuj wartość zmiennej real.
  9. Zainicjuj wartość zmiennej over.
  10. Koniec ciała konstruktora.
  11. Zastąp znaczenie operatora +.
  12. Utwórz wynik typu danych typu TestClass.
  13. Użyj operatora + z liczbami zespolonymi. Ten wiersz doda część rzeczywistą liczby do części rzeczywistej innej liczby.
  14. Użyj operatora + z liczbami zespolonymi. Ten wiersz doda część urojoną liczby do części urojonej innej liczby.
  15. Program zwróci wartość zmiennej wynik po pomyślnym wykonaniu.
  16. Koniec definicji nowego znaczenia operatora +, czyli przeciążania.
  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. 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.
  23. Wykonywanie operacji przy użyciu przeciążonego operatora + i przechowywanie wyniku w zmiennej c3.
  24. Wydrukowanie wartości zmiennej c3 na konsoli.
  25. 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.