मैं कुछ काम के लिए पुस्तकालय बनाने की कोशिश कर रहा हूं और असाइनमेंट ऑपरेशन के लिए ऑपरेटर ओवरलोडिंग का उपयोग कर रहा हूं। माना जाता है कि एक्स और वाई उस वर्ग के दो उदाहरण हैं जिनमें = इस प्रकार अतिभारित है:
A& A::operator=(A &rhs)
{
A::assign(*this, rhs);
return *this;
}
जब मैं ऐसा करता हूं:
A z;
z = x + y; // x and y are other instances of class A
सब कुछ ठीक है, हालांकि, जब मैं एक `
A p = q + r;
ओवरलोडेड रूटीन को कॉल नहीं किया जाता है। मैं ऑपरेटर ओवरलोडिंग के साथ बहुत अनुभवी नहीं हूं, क्या कोई बता सकता है कि क्या हो रहा है। एक स्पष्टीकरण यह हो सकता है कि p पहले से बनाए गए q + r ऑब्जेक्ट के लिए सिर्फ एक उपनाम है, हालांकि, z वर्ग A का एक नया उदाहरण बनाता है और इसलिए जब z को सौंपा जाता है तो ऑपरेटर ओवरलोडिंग किक करता है। कुछ तरह:
#include <iostream>
using namespace std;
class X
{
public:
X();
};
X::X()
{
cout<<"called"<<endl;
}
int main(int argc, char *argv[])
{
X e; X f;
X g = e;
}
जहां कॉल केवल दो बार मुद्रित होता है, प्रत्येक ई और एफ के लिए एक बार, और जी के लिए मुद्रित नहीं होता है।
यदि ऐसा है, तो क्या कोई पी के लिए ऑपरेटर ओवरलोडिंग को ट्रिगर करने का कोई तरीका सुझा सकता है।
धन्यवाद।
3 जवाब
यदि आप एक वैरिएबल घोषित करते हैं और इसे उसी लाइन पर इनिशियलाइज़ करते हैं, तब भी यह कॉपी कंस्ट्रक्टर को कॉल करेगा।
दो इनिशियलाइज़ेशन सिंटैक्स हैं:
X a;
X b(a);
X a;
X b = a;
उनके मतलब के बारे में थोड़े अंतर हैं, लेकिन ज्यादातर मामलों में वे ऐसा ही करते हैं। अंतर यह है कि कुछ निर्माण/विनाश से बचने के लिए संकलक की गारंटी है या नहीं। किसी भी स्थिति में, कॉपी कंस्ट्रक्टर को बुलाया जाएगा, क्योंकि आप एक वस्तु का निर्माण कर रहे हैं। मुझे ठीक से याद नहीं है कि गारंटियों में अंतर के विवरण क्या हैं।
यह क्या हो रहा है,
A p = q + r;
A के कॉपी कंस्ट्रक्टर को कॉल करता है, असाइनमेंट ऑपरेटर को नहीं। हाँ, यह अजीब है। यह वैसा ही है जैसे आपने इसे टाइप किया था:
A p(q + r);
ऐसे मामले जहां एक कॉपी कंस्ट्रक्टर कहा जाता है:
when you return an object
when you pass an object to some function
X b(a);
X b = a;
ऐसे मामले जहां एक असाइनमेंट ऑपरेटर ओवरलोड फ़ंक्शन को कहा जाता है:
X b; b=a;//where a is already existing object and already intialised.
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
T x = a;
के साथ-साथ तर्क पासिंग, फंक्शन रिटर्न, एक अपवाद को फेंकना (15.1), एक अपवाद (15.3) को हैंडल करना, और एग्रीगेट मेंबर इनिशियलाइज़ेशन (8.5.1) में होता है, कॉपी-इनिशियलाइज़ेशन। [ नोट: कॉपी-इनिशियलाइज़ेशन एक मूव (12.8) को लागू कर सकता है। - एंड नोट ]" सेक्शन[dcl.init]
में और फिर यह बताता है कि इनिशियलाइज़ेशन कंस्ट्रक्टर को कॉल करता है।