logo

Operatør overbelastning i C++

i C++ er operatøroverbelastning en kompileringstidspolymorfisme. Det er en idé om å gi spesiell mening til en eksisterende operatør i C++ uten å endre dens opprinnelige betydning.

I denne artikkelen vil vi videre diskutere om operatøroverbelastning i C++ med eksempler og se hvilke operatører vi kan eller ikke kan overbelaste i C++.



C++ Operatør overbelastning

C++ har muligheten til å gi operatørene en spesiell betydning for en datatype, denne evnen er kjent som operatøroverbelastning. Operatøroverbelastning er en kompileringstidspolymorfisme. For eksempel kan vi overbelaste en operator '+' i en klasse som String slik at vi kan sette sammen to strenger ved å bare bruke +. Andre eksempelklasser der aritmetiske operatorer kan være overbelastet er komplekse tall, brøktall, store heltall osv.

Eksempel:

int a; float b,sum; sum = a + b;>

Her er variablene a og b av typene int og float, som er innebygde datatyper. Derfor kan addisjonsoperatoren '+' enkelt legge til innholdet i a og b. Dette er fordi addisjonsoperatoren + er forhåndsdefinert for å legge til variabler av innebygd datatype.



Gjennomføring:

C++






// C++ Program to Demonstrate the> // working/Logic behind Operator> // Overloading> class> A {> >statements;> };> int> main()> {> >A a1, a2, a3;> >a3 = a1 + a2;> >return> 0;> }>

>

linux kjøre kommando
>

I dette eksemplet har vi 3 variabler a1, a2 og a3 av type klasse A. Her prøver vi å legge til to objekter a1 og a2, som er av brukerdefinert type dvs. av type klasse A ved å bruke +-operatoren. Dette er ikke tillatt, fordi addisjonsoperatøren + er forhåndsdefinert til kun å operere på innebygde datatyper. Men her er klasse A en brukerdefinert type, så kompilatoren genererer en feil. Det er her konseptet med operatøroverbelastning kommer inn.

Nå, hvis brukeren ønsker å få operatoren + til å legge til to klasseobjekter, må brukeren omdefinere betydningen av +-operatoren slik at den legger til to klasseobjekter. Dette gjøres ved å bruke konseptet Operatør overbelastning. Så hovedideen bak Operator-overbelastning er å bruke C++-operatorer med klassevariabler eller klasseobjekter. Å omdefinere betydningen av operatorer endrer egentlig ikke deres opprinnelige betydning; i stedet har de fått ekstra betydning sammen med de eksisterende.

Eksempel på operatøroverbelastning i C++

C++




// C++ Program to Demonstrate> // Operator Overloading> #include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >// This is automatically called when '+' is used with> >// between two Complex objects> >Complex operator+(Complex>const>& obj)> >{> >Complex res;> >res.real = real + obj.real;> >res.imag = imag + obj.imag;> >return> res;> >}> >void> print() { cout << real <<>' + i'> << imag <<>' '>; }> };> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >Complex c3 = c1 + c2;> >c3.print();> }>

>

>

Produksjon

java string replaceall
12 + i9>

Forskjellen mellom operatørfunksjoner og normale funksjoner

Operatørfunksjoner er de samme som vanlige funksjoner. De eneste forskjellene er at navnet på en operatørfunksjon alltid er operatør nøkkelord etterfulgt av symbolet til operatøren, og operatørfunksjoner kalles opp når den tilsvarende operatøren brukes.

Eksempel

C++




#include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >void> print() { cout << real <<>' + i'> << imag << endl; }> >// The global operator function is made friend of this> >// class so that it can access private members> >friend> Complex operator+(Complex>const>& c1,> >Complex>const>& c2);> };> Complex operator+(Complex>const>& c1, Complex>const>& c2)> {> >return> Complex(c1.real + c2.real, c1.imag + c2.imag);> }> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >Complex c3> >= c1> >+ c2;>// An example call to 'operator+'> >c3.print();> >return> 0;> }>

>

>

Produksjon

12 + i9>

Kan vi overbelaste alle operatører?

Nesten alle operatører kan bli overbelastet bortsett fra noen få. Følgende er listen over operatører som ikke kan overbelastes.

sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)>

Operatører som kan overbelastes i C++

Vi kan overbelaste

    Unære operatorer Binære operatorer Spesielle operatorer ( [ ], () osv.)

Men blant dem er det noen operatører som ikke kan overbelastes. De er

    Omfangsløsningsoperatør (: Medlemsvalgoperatør Medlemsvalg gjennom *

Peker til en medlemsvariabel

    Betinget operator (? Størrelse på operator sizeof()
Operatører som kan overbelastes Eksempler
Binær aritmetikk +, -, *, /, %
Unær aritmetikk +, -, ++, —
Oppdrag =, +=,*=, /=,-=, %=
Bitvis &, | , <> , ~ , ^
De-referanser (->)
Dynamisk minnetildeling,
De-allokering
Ny, slett
Subscript [ ]
Funksjonsanrop ()
Logisk &, | |, !
Relasjonell >, <, = =, =

Hvorfor kan ikke de ovennevnte operatørene overbelastes?

1. størrelsen på operatøren

Dette returnerer størrelsen på objektet eller datatypen angitt som operanden. Dette evalueres av kompilatoren og kan ikke evalueres under kjøring. Riktig økning av en peker i en rekke objekter er implisitt avhengig av størrelsen på operatøren. Å endre betydningen ved å bruke overbelastning vil føre til at en grunnleggende del av språket kollapser.

java listestreng

2. typeid Operatør

Dette gir et CPP-program med muligheten til å gjenopprette den faktisk avledede typen av objektet det refereres til med en peker eller referanse. For denne operatøren er hele poenget å identifisere en type unikt. Hvis vi ønsker å få en brukerdefinert type til å «se ut» som en annen type, kan polymorfisme brukes, men betydningen av typeid-operatøren må forbli uendret, ellers kan det oppstå alvorlige problemer.

3. Omfangsoppløsning (::) Operatør

Dette hjelper til med å identifisere og spesifisere konteksten som en identifikator refererer til ved å spesifisere et navneområde. Det er fullstendig evaluert under kjøring og fungerer på navn i stedet for verdier. Operandene for scope-oppløsning er notatuttrykk med datatyper og CPP har ingen syntaks for å fange dem hvis den var overbelastet. Så det er syntaktisk umulig å overbelaste denne operatøren.

4. Klassemedlemstilgangsoperatører (.(punkt ), .* (peker til medlemsoperatør))

Viktigheten og den implisitte bruken av tilgangsoperatører for klassemedlemmene kan forstås gjennom følgende eksempel:

Eksempel:

C++




// C++ program to demonstrate operator overloading> // using dot operator> #include> using> namespace> std;> class> ComplexNumber {> private>:> >int> real;> >int> imaginary;> public>:> >ComplexNumber(>int> real,>int> imaginary)> >{> >this>->ekte = ekte;> >this>->imaginær = imaginær;> >}> >void> print() { cout << real <<>' + i'> << imaginary; }> >ComplexNumber operator+(ComplexNumber c2)> >{> >ComplexNumber c3(0, 0);> >c3.real =>this>->real + c2.real;> >c3.imaginary =>this>->imaginær + c2.imaginær;> >return> c3;> >}> };> int> main()> {> >ComplexNumber c1(3, 5);> >ComplexNumber c2(2, 4);> >ComplexNumber c3 = c1 + c2;> >c3.print();> >return> 0;> }>

>

>

Produksjon

5 + i9>

Forklaring:

Utsagnet Complex Number c3 = c1 + c2; er internt oversatt som komplekst tall c3 = c1.operator+ (c2); for å aktivere operatørfunksjonen. Argumentet c1 sendes implisitt ved å bruke '.' operatør. Den neste setningen bruker også punktoperatoren for å få tilgang til medlemsfunksjonen print og send c3 som argument.

Dessuten jobber disse operatørene også på navn og ikke verdier, og det er ingen bestemmelse (syntaktisk) for å overbelaste dem.

5. Ternær eller betinget (?:) Operatør

Den ternære eller betingede operatoren er en stenografi av en if-else-setning. I operatoren blir de sanne/falske uttrykkene kun evaluert på grunnlag av sannhetsverdien til det betingede uttrykket.

conditional statement ? expression1 (if statement is TRUE) : expression2 (else)>

En funksjon som overbelaster den ternære operatoren for en klasse si ABC ved å bruke definisjonen

ABC operator ?: (bool condition, ABC trueExpr, ABC falseExpr);>

ville ikke kunne garantere at bare ett av uttrykkene ble evaluert. Dermed kan den ternære operatøren ikke overbelastes.

Viktige punkter om operatøroverbelastning

1) For at operatøroverbelastning skal fungere, må minst én av operandene være et brukerdefinert klasseobjekt.

logo java

2) Oppdragsoperatør: Kompileren oppretter automatisk en standard oppdragsoperatør med hver klasse. Standard tildelingsoperatoren tildeler alle medlemmer av høyre side til venstre side og fungerer fint i de fleste tilfeller (denne oppførselen er den samme som kopikonstruktøren). Se denne for flere detaljer.

3) Konverteringsoperatør: Vi kan også skrive konverteringsoperatorer som kan brukes til å konvertere en type til en annen type.

Eksempel:

C++




// C++ Program to Demonstrate the working> // of conversion operator> #include> using> namespace> std;> class> Fraction {> private>:> >int> num, den;> public>:> >Fraction(>int> n,>int> d)> >{> >num = n;> >den = d;> >}> >// Conversion operator: return float value of fraction> >operator>float>()>const> >{> >return> float>(num) />float>(den);> >}> };> int> main()> {> >Fraction f(2, 5);> >float> val = f;> >cout << val <<>' '>;> >return> 0;> }>

SIM-kort satt inn men ingen tjeneste android

>

>

Produksjon

0.4>

Overbelastede konverteringsoperatører må være en medlemsmetode. Andre operatører kan enten være medlemsmetoden eller den globale metoden.

4) Enhver konstruktør som kan kalles med et enkelt argument fungerer som en konverteringskonstruktør, noe som betyr at den også kan brukes til implisitt konvertering til klassen som blir konstruert.

Eksempel:

C++




// C++ program to demonstrate can also be used for implicit> // conversion to the class being constructed> #include> using> namespace> std;> class> Point {> private>:> >int> x, y;> public>:> >Point(>int> i = 0,>int> j = 0)> >{> >x = i;> >y = j;> >}> >void> print()> >{> >cout <<>'x = '> << x <<>', y = '> << y <<>' '>;> >}> };> int> main()> {> >Point t(20, 20);> >t.print();> >t = 30;>// Member x of t becomes 30> >t.print();> >return> 0;> }>

>

>

Produksjon

x = 20, y = 20 x = 30, y = 0>

Quiz om operatøroverbelastning