C++ Operator Przeciążanie przykładami

⚡ Inteligentne podsumowanie

Operaprzeciążenie tor w C++ Pozwala na nowo zdefiniować sposób działania wbudowanych operatorów, takich jak + i ==, z własnymi klasami i obiektami. Tutaj poznasz jego składnię, podejścia, operatory, które można przeciążać, oraz zasady, których należy przestrzegać.

  • Co to jest: OperaPrzeciążanie Tora umożliwia redefinicję operatorów, takich jak +, dla własnych klas.
  • ✍️. Składnia: Zdefiniuj funkcję o nazwie operator, po której następuje symbol, np. operator+.
  • 🔀 Podejścia: Operatory można przeciążać jako funkcje członkowskie lub funkcje zaprzyjaźnione.
  • ???? Ograniczenia: Niektórych operatorów, takich jak ::, ., i ?:, nie można przeciążać.
  • 🤖 Pomoc AI: Narzędzia AI, takie jak GitHub Copilot, natychmiast zapisują funkcje przeciążania operatorów.

C++ OperaTor Przeciążenie

Czym 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

Code Wyjaśnienie:

  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

Code Wyjaśnienie:

  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

Code Wyjaśnienie:

  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().

FAQ

OperaPrzeciążanie Tora pozwala na zdefiniowanie sposobu działania wbudowanych operatorów, takich jak + lub ==, na obiektach Twoich własnych klas, dzięki czemu zachowują się naturalnie w przypadku niestandardowych typów danych.

Zdefiniuj funkcję specjalną, której nazwa to słowo kluczowe operator, po którym następuje symbol, np. operator+. Funkcja ta przyjmuje operandy jako parametry i zwraca wynik.

Istnieją dwa główne podejścia: przeciążanie operatora jako funkcji członkowskiej klasy lub jako funkcji zaprzyjaźnionej, która może uzyskać dostęp do prywatnych członków klasy.

Większość operatorów można przeciążyć, ale niektóre nie, w tym operatory rozwiązywania zakresu (::), dostępu do elementów członkowskich (.), wskaźników do elementów członkowskich (.*) i operatory trójargumentowe (?:)

Można przeciążać tylko istniejące operatory, co najmniej jeden operand musi być typem zdefiniowanym przez użytkownika, nie można też zmieniać priorytetu, łączności ani liczby operandów operatora.

Asystenci AI, tacy jak GitHub Copilot, generują funkcje przeciążania operatorów dla twoich klas, wybierają między funkcjami członkowskimi i zaprzyjaźnionymi oraz dodają prawidłowe typy zwracane w miarę pisania.

Tak. Narzędzia oparte na sztucznej inteligencji generują przeciążone operatory, takie jak + i ==, postępują zgodnie ze standardowymi zasadami i oznaczają operatory, których nie można przeciążyć, oszczędzając w ten sposób czas i eliminując błędy.

OperaPrzeciążanie Tora sprawia, że ​​klasy są łatwiejsze w użyciu i odczytywaniu, ponieważ pozwala obiektom na pracę ze znanymi operatorami, takimi jak dodawanie dwóch wektorów za pomocą + zamiast nazwanej funkcji.

Podsumuj ten post następująco: