C++ Operator Överbelastning med exempel

⚡ Smart sammanfattning

Operator-överbelastning i C++ låter dig omdefiniera hur inbyggda operatorer som + och == fungerar med dina egna klasser och objekt. Här lär du dig dess syntax, tillvägagångssätten, vilka operatorer som kan överbelastas och reglerna att följa.

  • Vad det är: Operator-överbelastning omdefinierar operatorer som + för dina egna klasser.
  • ✍️ Syntax: Definiera en funktion med namnet operator följt av symbolen , som operator+.
  • 🔀 Tillvägagångssätt: Du kan överbelasta operatorer som medlemsfunktioner eller vänfunktioner.
  • ???? gränser: Vissa operatorer, som ::, . och ?:, kan inte överbelastas.
  • 🤖 AI-hjälp: AI-verktyg som GitHub Copilot fungerar direkt med överbelastning av skrivoperatorer.

C++ Operator överbelastning

Vad är Operator överbelastning?

Använda överbelastning av operatören in C++, kan du ange mer än en betydelse för en operatör i ett omfång. Syftet med operatörsöverbelastning är att ge en speciell betydelse av en operatör för en användardefinierad datatyp.

Med hjälp av operatörens överbelastning kan du omdefiniera majoriteten av C++ operatörer. Du kan också använda operatörsöverbelastning för att utföra olika operationer med en operatör.

syntax

Att överbelasta a C++ operatör, bör du definiera en speciell funktion i klassen enligt följande:

class class_name
{
    ... .. ...
    public
       return_type operator symbol (argument(s))
       {
           ... .. ...
       } 
    ... .. ...
};

Här är en förklaring till ovanstående syntax:

  • Return_type är returtypen för funktionen.
  • Därefter nämner du operatorns nyckelord.
  • Symbolen anger operatörssymbolen som ska överbelastas. Till exempel, +, -, <, ++.
  • Argumentet/argumenten kan skickas till operatorfunktionen på samma sätt som funktioner.

Exempelvis 1

#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;
}

Produktion:

 Operator överbelastning

Här är en skärmdump av koden:

 Operator överbelastning

Code Förklaring:

  1. Inkludera iostream-huvudfilen i vår kod för att använda dess funktioner.
  2. Inkludera std-namnutrymmet i vårt program för att använda dess klasser utan att anropa det.
  3. Skapa en klass som heter TestClass.
  4. Använd modifieraren för privat åtkomst, som markerar en klassmedlem som privat tillgänglig.
  5. Skapa ett heltalsvariabelantal. Denna variabel kommer att vara privat tillgänglig.
  6. Använd modifieraren för offentlig åtkomst, som markerar en klassmedlem som privat tillgänglig.
  7. Använd en klasskonstruktor för att initiera variabelräknaren till 5.
  8. Överbelasta betydelsen av operatorn —.
  9. Operatören kommer att minska värdet på variabeln x med 1.
  10. Slutet på operatörens överbelastningssektion. Operatören har fått ett nytt namn.
  11. Definiera en funktion som heter Display() funktion.
  12. Skriv ut värdet för variabelantal tillsammans med annan text på konsolen när Display()-funktionen anropas. } markerar slutet på display()-funktionens brödtext.
  13. Slutet av klassens kropp.
  14. Anropa main()-funktionen. Programlogiken bör läggas till i denna funktion.
  15. Skapa en instans av klassen TestClass och ge den namnet tc.
  16. Detta kommer att anropa void-operatorn –()-funktionen.
  17. Använd inställningen för TestClass Class för att anropa Display()-funktionen.
  18. Funktionen måste returnera värde efter framgångsrikt slutförande.
  19. Slutet på kroppen av funktionen main().

Olika förhållningssätt till Operator Överbelastning in C++

Du kan utföra överbelastning av operatören genom att implementera någon av följande typer av funktioner:

  1. Medlemsfunktion
  2. Icke-medlemsfunktion
  3. Vänfunktion
  • Operatörens överbelastningsfunktion kan vara en medlemsfunktion när en vänsteroperand är ett objekt i klassen.
  • När vänsteroperanden är annorlunda, Operator överbelastningsfunktion bör vara en icke-medlemsfunktion.

Du kan göra operatörens överbelastningsfunktion till en vänfunktion om den behöver komma åt de privata och skyddade klassmedlemmarna.

Kan alla C++ Operators vara överbelastade?

Nej. Det finns C++ operatörer som inte kan överbelastas.

De innefattar:

  • :: -Omfattningsupplösningsoperatör
  • ?: -ternär operator.
  • . -medlemsväljare
  • Operatörens storlek
  • * -medlemspekarväljare

Saker att komma ihåg

  1. Med operatörsöverbelastning kan du omdefiniera hur en operatör fungerar endast för de användardefinierade typerna (objekt, strukturer). Du kan inte använda den för inbyggda typer (float, char, int, etc.).
  2. = och & C++ operatörer är överbelastade som standard. Du kan till exempel kopiera objekten i samma klass direkt med operatorn =.
  3. Operator prioritet ändrar inte associativt och prioritet för operatörer. Du kan dock ändra utvärderingsordningen med parentes.
  4. Det finns fyra operatörer som du inte kan överbelasta i C++. De inkluderar omfångsupplösningsoperatorn (::), medlemsvalsoperator (.), medlemsval genom en pekare till funktionsoperator (.*) och den ternära operatorn (?:).

Regler för Operator överbelastning

Här finns regler för Operator överbelastning:

  • För att det ska fungera måste minst en operand vara ett användardefinierat klassobjekt.
  • Du kan bara överbelasta befintliga operatörer. Du kan inte överbelasta nya operatörer.
  • Vissa operatörer kan inte överbelastas med en vänfunktion. Sådana operatörer kan dock överbelastas med hjälp av medlemsfunktionen.

Hur man överbelasta Operator

Exempelvis 1

#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;
}

Produktion:

Överbelastning Operator exempel

Här är en skärmdump av koden:

Överbelastning Operator exempel

Code Förklaring:

  1. Inkludera iostream-huvudfilen i vår kod för att använda dess funktioner.
  2. Inkludera std-namnutrymmet i vårt program för att använda dess klasser utan att anropa det.
  3. Skapa en klass med namnet OperatorOverload.
  4. Använd modifieraren för privat åtkomst, som markerar en klassmedlem som privat tillgänglig.
  5. Skapa en heltalsvariabel x. Denna variabel kommer att vara privat tillgänglig.
  6. Använd modifieraren för offentlig åtkomst, som markerar en klassmedlem som privat tillgänglig.
  7. Använd en klasskonstruktor för att initiera variabel x till 10.
  8. Överbelasta innebörden av ++ operatorn.
  9. Operatören kommer att öka värdet på variabel x med 2.
  10. Slutet på operatörens överbelastningssektion. Operatören har fått ett nytt namn.
  11. Anropar Print()-funktionen.
  12. Skriv ut värdet på variabel x tillsammans med annan text på konsolen när funktionen Print() anropas.
  13. Slutet av brödtexten för Print()-funktionen.
  14. Slutet av klassens kropp.
  15. Anropa main()-funktionen. Programlogiken bör läggas till i denna funktion.
  16. Skapa en instans av OperatorOverload Klass som heter ov.
  17. Detta kommer att anropa void-operatorn ++()-funktionen.
  18. Använd hållningen av OperatorOverload-klassen för att anropa Print()-funktionen.
  19. Funktionen måste returnera värde efter framgångsrikt slutförande.
  20. Slutet på kroppen av funktionen main().

Exempelvis 2

#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();
}

Produktion:

Överbelastning Operator exempel

Här är en skärmdump av koden:

Överbelastning Operator exempel

Code Förklaring:

  1. Inkludera iostream-huvudfilen i vårt program för att kunna använda dess funktioner.
  2. Inkludera std-namnområdet i vårt program för att kunna använda dess klasser utan att anropa det.
  3. Skapa en klass som heter TestClass. { markerar början av klasskroppen.
  4. Använd modifieraren för privat åtkomst för att markera variabler som privata, vilket innebär att de bara kan nås från klassen.
  5. Definiera två heltalsvariabler, reella och över.
  6. Använd public access-modifieraren för att markera konstruktorn som offentlig, vilket innebär att den kommer att vara tillgänglig även utanför klassen.
  7. Skapar klasskonstruktorn och initierar variabler.
  8. Initiera värdet på variabeln real.
  9. Initiera värdet på variabeln över.
  10. Slutet på konstruktorkroppen.
  11. Åsidosätt innebörden av operatorn +.
  12. Skapa datatypresultatet av typen TestClass.
  13. Använd operatorn + med komplexa tal. Denna rad lägger till den reella delen av ett tal till den reella delen av ett annat tal.
  14. Använd operatorn + med komplexa tal. Denna linje kommer att lägga till den imaginära delen av ett tal till den imaginära delen av ett annat tal.
  15. Programmet kommer att returnera värdet på variabelresultatet vid framgångsrik exekvering.
  16. Slutet på definitionen av den nya betydelsen av + operatör, det vill säga överbelastning.
  17. Anropa metoden print().
  18. Skriv ut det nya komplexa numret efter tillägg på konsolen.
  19. Slutet på body of print()-funktionen.
  20. Slutet på kroppen av TestClass Class.
  21. Anropar funktionen main().
  22. Passar värdena för både verkliga och komplexa delar som ska läggas till. Den första delen av c1 kommer att läggas till den första delen av c2, det vill säga 9+4. Den andra delen av c1 kommer att läggas till den andra delen av c, det vill säga 5+3.
  23. Utföra en operation med operatorn överbelastad + och lagra resultatet i variabel c3.
  24. Skriver ut värdet för variabel c3 på konsolen.
  25. Slutet på huvuddelen av funktionen main().

Vanliga frågor

OperaMed tor-överbelastning kan du omdefiniera hur inbyggda operatorer, som + eller ==, fungerar med objekt i dina egna klasser, så att de beter sig naturligt för anpassade datatyper.

Definiera en specialfunktion vars namn är nyckelordsoperatorn följt av symbolen , till exempel operator+. Den tar operanderna som parametrar och returnerar resultatet.

Det finns två huvudsakliga tillvägagångssätt: att överbelasta en operator som en medlemsfunktion i klassen, eller som en vänfunktion som kan komma åt klassens privata medlemmar.

De flesta operatorer kan överbelastas, men några kan inte, inklusive operatorerna scope resolution (::), member access (.), member pointer (.*) och ternära (?:).

Du kan bara överbelasta befintliga operatorer, minst en operand måste vara av en användardefinierad typ, och du kan inte ändra en operators prioritet, associativitet eller antal operander.

AI-assistenter som GitHub Copilot genererar operatoröverbelastningsfunktioner för dina klasser, väljer mellan medlems- och vänfunktioner och lägger till rätt returtyper medan du skriver.

Ja. AI-drivna verktyg genererar överbelastade operatorer som + och ==, följer standardreglerna och flaggar operatorer som inte kan överbelastas, vilket sparar tid och fel.

OperaTor-överbelastning gör klasser enklare att använda och läsa genom att låta objekt arbeta med välbekanta operatorer, som att addera två vektorer med + istället för en namngiven funktion.

Sammanfatta detta inlägg med: