C++ में, हम फ़ंक्शन्स को ओवरलोड कर सकते हैं। कुछ फ़ंक्शन्स सामान्य फ़ंक्शन्स होते हैं; कुछ कॉन्स्टेंट टाइप फ़ंक्शन्स होते हैं। आइए एक प्रोग्राम और उसके आउटपुट को देखें ताकि कॉन्स्टेंट फ़ंक्शन्स और सामान्य फ़ंक्शन्स के बारे में विचार मिल सके।
उदाहरण: const मेंबर फ़ंक्शन ओवरलोडिंग
#include <iostream>
using namespace std;
class my_class {
public:
void my_func() const { // const मेंबर फ़ंक्शन
cout << "कॉन्स्टेंट फ़ंक्शन कॉल हो रहा है" << endl;
}
void my_func() { // नॉन-const मेंबर फ़ंक्शन
cout << "सामान्य फ़ंक्शन कॉल हो रहा है" << endl;
}
};
int main() {
my_class obj;
const my_class obj_c;
obj.my_func(); // नॉन-const ऑब्जेक्ट → नॉन-const संस्करण
obj_c.my_func(); // const ऑब्जेक्ट → const संस्करण
return 0;
}
आउटपुट
सामान्य फ़ंक्शन कॉल हो रहा है कॉन्स्टेंट फ़ंक्शन कॉल हो रहा है
यहां हम देख सकते हैं कि जब ऑब्जेक्ट सामान्य होता है तो सामान्य फ़ंक्शन कॉल होता है। जब ऑब्जेक्ट कॉन्स्टेंट होता है, तो कॉन्स्टेंट फ़ंक्शन्स कॉल होते हैं।
पैरामीटर्स के साथ const ओवरलोडिंग
यदि दो ओवरलोडेड मेथड में पैरामीटर्स हैं, और एक पैरामीटर सामान्य है, दूसरा कॉन्स्टेंट, तो यह त्रुटि उत्पन्न करेगा।
उदाहरण: त्रुटि उत्पन्न करने वाला कोड
#include <iostream>
using namespace std;
class my_class {
public:
void my_func(const int x) {
cout << "कॉन्स्टेंट x के साथ फ़ंक्शन कॉल हो रहा है" << endl;
}
void my_func(int x) {
cout << "x के साथ फ़ंक्शन कॉल हो रहा है" << endl;
}
};
int main() {
my_class obj;
obj.my_func(10); // त्रुटि: अस्पष्ट ओवरलोड
return 0;
}
आउटपुट
[Error] 'void my_class::my_func(int)' को ओवरलोड नहीं किया जा सकता [Error] 'void my_class::const int' के साथ
कारण: मान पैरामीटर्स के लिए, टॉप-लेवल const (पैरामीटर के लिए) फ़ंक्शन सिग्नेचर का हिस्सा नहीं है। void f(int) और void f(const int) एक ही सिग्नेचर हैं।
रेफरेंस/पॉइंटर पैरामीटर्स के साथ const ओवरलोडिंग
लेकिन यदि आर्गुमेंट्स रेफरेंस या पॉइंटर टाइप के हैं, तो यह त्रुटि उत्पन्न नहीं करेगा।
उदाहरण: सही कोड
#include <iostream>
using namespace std;
class my_class {
public:
void my_func(const int *x) { // पॉइंटर टू कॉन्स्ट
cout << "कॉन्स्टेंट x के साथ फ़ंक्शन कॉल हो रहा है" << endl;
}
void my_func(int *x) { // पॉइंटर टू नॉन-कॉन्स्ट
cout << "x के साथ फ़ंक्शन कॉल हो रहा है" << endl;
}
};
int main() {
my_class obj;
int x = 10;
obj.my_func(&x); // नॉन-कॉन्स्ट पॉइंटर → नॉन-कॉन्स्ट संस्करण
const int y = 20;
obj.my_func(&y); // कॉन्स्ट पॉइंटर → कॉन्स्ट संस्करण
return 0;
}
आउटपुट
x के साथ फ़ंक्शन कॉल हो रहा है कॉन्स्टेंट x के साथ फ़ंक्शन कॉल हो रहा है
नियम सारांश
| पैरामीटर प्रकार | const ओवरलोडिंग अनुमत? | उदाहरण |
|---|---|---|
| मान (value) | नहीं | f(int) vs f(const int) → त्रुटि |
| रेफरेंस | हां | f(int&) vs f(const int&) → OK |
| पॉइंटर | हां | f(int*) vs f(const int*) → OK |
| मेंबर फ़ंक्शन (this) | हां | f() vs f() const → OK |
सर्वोत्तम अभ्यास: जब भी संभव हो const रेफरेंस पैरामीटर्स (const T&) का उपयोग करें ताकि अनावश्यक कॉपी से बचा जा सके और const-करेक्टनेस सुनिश्चित हो।