C++ Operator Overloading
Introduction to C++ Operator Overloading
जैसा की आपको पता है, class एक user defined data type होती है। C++ में provide किये गए operators से आप primitive types (integer, floating point, character) के variables के साथ विभिन्न operations (Addition, Division, Multiplication आदि) perform करते है। लेकिन इन operators को यूज़ करके आप class के variables (objects) के साथ कोई भी operations perform करेंगे तो error generate होगी।
उदाहरण के लिए आप एक class के 2 objects को इन operators द्वारा add नहीं कर सकते है। लेकिन जैसा की मैने आपको पहले tutorials में बताया की class types पर भी आप normal variables की तरह ही operations perform कर सकते है। इसके लिए C++ आपको एक mechanism provide करती है जिसे operator overloading कहते है।
इस mechanism में आप operators की meaning को change करके उन्हें दूसरी meaning देते है। इन operators को meaning इस प्रकार दी जाती है की ये class type के variables (objects) के साथ भी काम कर सकें। उदाहरण के लिए आप Addition (+) operator को overload करके उसे इस प्रकार change कर सकते है की वो किसी class के 2 objects को add कर दे ताकि आप उस result को किसी तीसरे object में store कर सकें।
Operator overloading का मतलब operators का अर्थ बदलना होता है। ये अर्थ सिर्फ user defined data types जैसे की class आदि के संदर्भ में ही बदलता है। Primitive types के साथ operators को उसी प्रकार यूज़ किया जा सकता है जैसे की आप operator overloading से पहले करते थे।
Operator overloading एक बहुत ही interesting feature है। लेकिन कुछ ऐसे भी operators है जिन्हें आप overload नहीं कर सकते है। इनके बारे में नीचे दिया जा रहा है।
- Class member access operators (.,.*)
- Scope resolution operator (::)
- Size of operator (sizeof)
- Conditional Operator (?:)
ऊपर दिए गए operators को छोड़कर आप C++ के सभी operators को overload कर सकते है।
हालाँकि operator overloading द्वारा आप operators का मतलब बदल सकते है, लेकिन उनका syntax नहीं change किया जा सकता है। उदाहरण के लिए multiplication operation के लिए 2 operands का होना जरुरी है, इसे change नहीं किया जा सकता है। साथ ही operators की precedence (order) भी नहीं बदलती है।
Overloading Operators
Operators को overload करने के लिए आप एक function define करते है। इस function की header में आप बताते है की किस operator को overload करना है। साथ ही आप ये भी बताते है की किस class के variables के लिए इस operator को overload करना है।
इस function की body में आप ये define करते है की ये operator particular class के objects के साथ किस तरह work करेगा। इस function को operator function कहा जाता है। इस function को operator keyword के साथ define किया जाता है। इसका general syntax नीचे दिया जा रहा है।
return-type class-name :: operator op(parameters-list)
{
//statements to be executed
}
सबसे पहले आप function का return type define करते है। इसके बाद आप उस class का नाम define करते है की जिसके लिए इस operator को overload किया जा रहा है। इसके बाद आप scope resolution (::) operator लगाते है। इसके बाद operator keyword define किया जाता है। इसके बाद आप उस operator को define करते है जिसे आप overload करना चाहते है। इसके बाद brackets में parameters define किये जाते है।
जब आप function को class के बाहर declare करना चाहते है तो इस syntax को यूज़ कर सकते है। आप चाहे तो इस function को बाकी normal functions की तरह class के अंदर भी define कर सकते है।
आइये अब इसे एक उदाहरण से समझने का प्रयास करते है। मान लीजिये आप + operator को overload करना चाहते है, तो उसके लिए function इस प्रकार define किया जायेगा।
MyClass MyClass :: operator +(MyClass obj)
{
//statements to be executed
}
जैसा की आप जानते है operators 2 प्रकार के होते है। इनके बारे में short description नीचे दिया जा रहा है। यदि आप इनके बारे में detail से जानना चाहते है तो operators tutorials पढ़ सकते है।
- Unary - ये वे operators होते है जिन्हें execute होने के लिए सिर्फ एक operand की आवश्यकता होती है। उदाहरण के लिए negation operator (~) एक unary operator है।
- Binary - ये वे operators होते है जिन्हें execute होने के लिए 2 operands की आवश्यकता होती है। उदाहरण के लिए addition operator (+) एक binary operator है।
इन दोनों तरह के operators को overload करना नीचे detail से बताया जा रहा है।
Overloading Unary Operator
जैसा की आपको पता है unary operators के लिए सिर्फ एक ही operand की आवश्यकता होती है, इसलिए ज्यादातर cases में operator function में argument नहीं pass किया जाता है। नीचे unary operator overloading को एक उदाहरण के माध्यम से समझाया जा रहा है। इस उदाहरण में ++ operator को overload किया गया है।
#include<iostream>
using namespace std;
class udemo
{
private:
int num;
public:
udemo(int n)
{
num=n;
}
udemo operator ++(void);
int display(void);
};
udemo udemo :: operator ++()
{
num=num+1;
}
int udemo :: display(void)
{
return num;
}
int main()
{
udemo obj(5);
cout<<"Number before applying operator is : "<<obj.display();
++obj;
cout<<"Number after applying operator is : "<<obj.display();
return 0;
}
ऊपर दिया गया program निचे दिया गया output generate करता है।
Number before applying operator is : 5
Number after applying operator is : 6
Overloading Binary Operators
Binary operators को execute होने के लिए 2 operands की आवश्यकता होती है। इसलिए binary operators को overload करते समय आप class का एक object argument के रूप में pass करते है।
इसमें operator के right side का operand argument के रूप में पास होता है। इसलिए right side के object को object के द्वारा refer किया जाता है। Left side का operand current या calling object की तरह काम करता है। इसीलिए इसे directly यूज़ किया जाता है।
Binary operator overloading का example नीचे दिया जा रहा है।
#include<iostream>
using namespace std;
class bdemo
{
private:
int num;
public:
bdemo operator +(bdemo b);
void setNum(int n);
int display(void);
};
bdemo bdemo :: operator +(bdemo obj)
{
bdemo bd;
bd.num = this->num+obj.num;
return bd;
}
void bdemo :: setNum(int n)
{
num=n;
}
int bdemo :: display(void)
{
return num;
}
int main()
{
bdemo obj1;
bdemo obj2;
bdemo obj3;
obj1.setNum(5);
obj2.setNum(3);
cout<<"Value inside obj1 is : "<<obj1.display()<<endl;
cout<<"Value insdie obj2 is : "<<obj2.display()<<endl;
obj3 = obj1+obj2;
cout<<"Value inside obj3 is : "<<obj3.display()<<endl;
return 0;
}
ऊपर दिया गया program निचे दिया गया output generate करता है।
Value inside obj1 is : 5
Value inside obj2 is : 3
Value inside obj3 is : 8