C++ Operator Overbelastning med eksempler

โšก Smart opsummering

Operator-overbelastning i C++ lader dig omdefinere, hvordan indbyggede operatorer som + og == fungerer med dine egne klasser og objekter. Her lรฆrer du dens syntaks, tilgangene, hvilke operatorer der kan overbelastes, og de regler, der skal fรธlges.

  • โž• Hvad er det: Operator-overloading omdefinerer operatorer som + for dine egne klasser.
  • โœ๏ธ Syntaks: Definer en funktion med navnet operator efterfulgt af symbolet , f.eks. operator+.
  • ๐Ÿ”€ Tilgange: Du kan overbelaste operatorer som medlemsfunktioner eller vennefunktioner.
  • ๐Ÿšซ grรฆnser: Nogle fรฅ operatorer, sรฅsom ::, . og ?:, kan ikke overbelastes.
  • ๐Ÿค– AI-hjรฆlp: AI-vรฆrktรธjer som GitHub Copilot skriveroperatoroverload fungerer รธjeblikkeligt.

C++ Operator overbelastning

Hvad er Operator overbelastning?

Ved brug af overbelastning af operatรธren in C++, kan du angive mere end รฉn betydning for en operator i รฉt omfang. Formรฅlet med operatรธroverbelastning er at give en speciel betydning af en operatรธr for en brugerdefineret datatype.

Ved hjรฆlp af operatรธroverbelastning kan du omdefinere stรธrstedelen af C++ operatรธrer. Du kan ogsรฅ bruge operatรธroverbelastning til at udfรธre forskellige operationer med รฉn operatรธr.

Syntaks

At overbelaste a C++ operatรธr, skal du definere en speciel funktion inde i klassen som fรธlger:

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

Her er en forklaring pรฅ ovenstรฅende syntaks:

  • Return_type er returtypen for funktionen.
  • Dernรฆst nรฆvner du operatornรธgleordet.
  • Symbolet angiver det operatรธrsymbol, der skal overbelastes. For eksempel +, -, <, ++.
  • Argumentet eller argumenterne kan overfรธres til operatorfunktionen pรฅ samme mรฅde som funktioner.

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

Output:

 Operator overbelastning

Her er et skรฆrmbillede af koden:

 Operator overbelastning

Code Forklaring:

  1. Inkluderer iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores program for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn TestClass.
  4. Brug den private adgangsmodifikator, som markerer et klassemedlem som privat tilgรฆngeligt.
  5. Opret et heltalsvariabelantal. Denne variabel vil vรฆre privat tilgรฆngelig.
  6. Brug offentlig adgangsmodifikator, som markerer et klassemedlem som privat tilgรฆngeligt.
  7. Brug en klassekonstruktรธr til at initialisere variabeltรฆlleren til 5.
  8. Overbelast betydningen af โ€‹โ€‹โ€” operatoren.
  9. Operatรธren vil formindske vรฆrdien af โ€‹โ€‹variablen x med 1.
  10. Slut pรฅ operatรธrens overbelastningssektion. Operatรธren har fรฅet et nyt navn.
  11. Definere en funktion ved navn Display() funktion.
  12. Udskriv vรฆrdien af โ€‹โ€‹variabelantal sammen med anden tekst pรฅ konsollen, nรฅr Display()-funktionen kaldes. } markerer slutningen af โ€‹โ€‹display()-funktionens brรธdtekst.
  13. Slutningen af โ€‹โ€‹klassens krop.
  14. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktion.
  15. Opret en instans af klassen TestClass og giv den navnet tc.
  16. Dette kalder void-operatoren โ€“()-funktionen.
  17. Brug holdningen til TestClass Class til at kalde Display()-funktionen.
  18. Funktionen skal returnere vรฆrdi efter vellykket afslutning.
  19. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹funktionen main().

Forskellige tilgange til Operator Overbelastning ind C++

Du kan udfรธre operatรธroverbelastning ved at implementere en af โ€‹โ€‹fรธlgende typer funktioner:

  1. Medlemsfunktion
  2. Ikke-medlemsfunktion
  3. Ven funktion
  • Operatรธrens overbelastningsfunktion kan vรฆre en medlemsfunktion, nรฅr en venstre operand er et objekt i klassen.
  • Nรฅr venstre operand er anderledes, vil Operator overbelastningsfunktion bรธr vรฆre en ikke-medlemsfunktion.

Du kan gรธre operatรธrens overbelastningsfunktion til en vennefunktion, hvis den skal have adgang til de private og beskyttede klassemedlemmer.

Kan alle C++ Operators vรฆre overbelastet?

Nej. Det er der C++ operatรธrer, der ikke kan overbelastes.

De omfatter:

  • :: -Scope resolution operator
  • ?: -ternรฆr operator.
  • . -medlemsvรฆlger
  • Stรธrrelse pรฅ operatรธr
  • * -medlemsmarkรธrvรฆlger

Ting at huske

  1. Med operatรธroverbelastning kan du omdefinere den mรฅde, en operatรธr kun fungerer pรฅ for de brugerdefinerede typer (objekter, strukturer). Du kan ikke bruge det til indbyggede typer (float, char, int osv.).
  2. = og & C++ operatรธrer er overbelastet som standard. For eksempel kan du kopiere objekterne i den samme klasse direkte ved at bruge =-operatoren.
  3. Operator forrang รฆndrer ikke den associative og forrang for operatรธrer. Du kan dog รฆndre rรฆkkefรธlgen af โ€‹โ€‹evalueringen ved hjรฆlp af parentes.
  4. Der er fire operatรธrer, som du ikke kan overbelaste i C++. De inkluderer scope resolution operator (::), member selection operator (.), member selection via en pointer to function operator (.*) og den ternรฆre operator (?:).

Regler for Operator overbelastning

Her er regler for Operator overbelastning:

  • For at det kan fungere, skal mindst รฉn operand vรฆre et brugerdefineret klasseobjekt.
  • Du kan kun overbelaste eksisterende operatรธrer. Du kan ikke overbelaste nye operatรธrer.
  • Nogle operatรธrer kan ikke overbelastes ved hjรฆlp af en ven-funktion. Sรฅdanne operatรธrer kan dog blive overbelastet ved hjรฆlp af medlemsfunktionen.

Sรฅdan overbelastes OperaTor

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

Output:

Overbelastning Operator eksempel

Her er et skรฆrmbillede af koden:

Overbelastning Operator eksempel

Code Forklaring:

  1. Inkluderer iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores program for at bruge dets klasser uden at kalde det.
  3. Opret en klasse med navnet OperatorOverload.
  4. Brug den private adgangsmodifikator, som markerer et klassemedlem som privat tilgรฆngeligt.
  5. Opret en heltalsvariabel x. Denne variabel vil vรฆre privat tilgรฆngelig.
  6. Brug offentlig adgangsmodifikator, som markerer et klassemedlem som privat tilgรฆngeligt.
  7. Brug en klassekonstruktรธr til at initialisere variabel x til 10.
  8. Overlรฆs betydningen af โ€‹โ€‹++ operatoren.
  9. Operatรธren vil รธge vรฆrdien af โ€‹โ€‹variabel x med 2.
  10. Slut pรฅ operatรธrens overbelastningssektion. Operatรธren har fรฅet et nyt navn.
  11. Kaldning af Print()-funktionen.
  12. Udskriv vรฆrdien af โ€‹โ€‹variabel x sammen med anden tekst pรฅ konsollen, nรฅr funktionen Print() kaldes.
  13. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹Print()-funktionen.
  14. Slutningen af โ€‹โ€‹klassens krop.
  15. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktion.
  16. Opret en instans af OperatorOverload Klasse ved navn ov.
  17. Dette kalder void-operatoren ++()-funktionen.
  18. Brug holdningen til OperatorOverload-klassen for at kalde Print()-funktionen.
  19. Funktionen skal returnere vรฆrdi efter vellykket afslutning.
  20. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹funktionen main().

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

Output:

Overbelastning Operator eksempel

Her er et skรฆrmbillede af koden:

Overbelastning Operator eksempel

Code Forklaring:

  1. Inkluderer iostream header-filen i vores program for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores program for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn TestClass. { markerer begyndelsen af โ€‹โ€‹klassens brรธdtekst.
  4. Brug den private adgangsmodifikator til at markere variabler som private, hvilket betyder, at de kun kan tilgรฅs fra klassen.
  5. Definer to heltalsvariabler, reelle og over.
  6. Brug public access modifier til at markere konstruktรธren som offentlig, hvilket betyder, at den vil vรฆre tilgรฆngelig selv uden for klassen.
  7. Oprettelse af klassekonstruktรธren og initialisering af variabler.
  8. Initialiser vรฆrdien af โ€‹โ€‹variabel reel.
  9. Initialiser vรฆrdien af โ€‹โ€‹variablen over.
  10. Slut pรฅ konstruktรธrlegemet.
  11. Tilsidesรฆt betydningen af โ€‹โ€‹+-operatoren.
  12. Opret datatyperesultatet af typen TestClass.
  13. Brug operatoren + med komplekse tal. Denne linje tilfรธjer den reelle del af et tal til den reelle del af et andet tal.
  14. Brug operatoren + med komplekse tal. Denne linje tilfรธjer den imaginรฆre del af et tal til den imaginรฆre del af et andet tal.
  15. Programmet returnerer vรฆrdien af โ€‹โ€‹det variable resultat ved vellykket udfรธrelse.
  16. Slutningen af โ€‹โ€‹definitionen af โ€‹โ€‹den nye betydning af + operator, det vil sige overbelastning.
  17. Kald print() metoden.
  18. Udskriv det nye komplekse tal efter tilfรธjelse pรฅ konsollen.
  19. Slutningen af โ€‹โ€‹body of print()-funktionen.
  20. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹TestClass Class.
  21. Kalder hoved()-funktionen.
  22. Passer vรฆrdierne af bรฅde reelle og komplekse dele, der skal tilfรธjes. Den fรธrste del af c1 vil blive tilfรธjet den fรธrste del af c2, det vil sige 9+4. Den anden del af c1 vil blive tilfรธjet til den anden del af c, det vil sige 5+3.
  23. Udfรธrelse af en operation ved hjรฆlp af overbelastet + operator og lagring af resultatet i variabel c3.
  24. Udskrivning af vรฆrdien af โ€‹โ€‹variabel c3 pรฅ konsollen.
  25. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Ofte Stillede Spรธrgsmรฅl

OperaMed tor-overloading kan du omdefinere, hvordan indbyggede operatorer, sรฅsom + eller ==, fungerer med objekter i dine egne klasser, sรฅ de opfรธrer sig naturligt for brugerdefinerede datatyper.

Definer en specialfunktion, hvis navn er nรธgleordsoperatoren efterfulgt af symbolet, f.eks. operator+. Den tager operanderne som parametre og returnerer resultatet.

Der er to hovedtilgange: at overbelaste en operator som en medlemsfunktion i klassen eller som en vennefunktion, der kan tilgรฅ klassens private medlemmer.

De fleste operatorer kan overbelastes, men nogle fรฅ kan ikke, herunder operatorerne for omfangsoplรธsning (::), medlemsadgang (.), medlemspegler (.*) og ternรฆre (?:).

Du kan kun overbelaste eksisterende operatorer, mindst รฉn operand skal vรฆre af en brugerdefineret type, og du kan ikke รฆndre en operators prรฆcedens, associativitet eller antal operander.

AI-assistenter som GitHub Copilot genererer operatoroverload-funktioner til dine klasser, vรฆlger mellem medlems- og venfunktioner og tilfรธjer de korrekte returtyper, mens du skriver.

Ja. AI-drevne vรฆrktรธjer genererer overbelastede operatorer som + og ==, fรธlger standardreglerne og markerer operatorer, der ikke kan overbelastes, hvilket sparer tid og fejl.

OperaTor-overbelastning gรธr klasserne nemmere at bruge og lรฆse ved at lade objekter arbejde med velkendte operatorer, sรฅsom at tilfรธje to vektorer med + i stedet for en navngivet funktion.

Opsummer dette indlรฆg med: