मैं कुछ काम के लिए पुस्तकालय बनाने की कोशिश कर रहा हूं और असाइनमेंट ऑपरेशन के लिए ऑपरेटर ओवरलोडिंग का उपयोग कर रहा हूं। माना जाता है कि एक्स और वाई उस वर्ग के दो उदाहरण हैं जिनमें = इस प्रकार अतिभारित है:

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

जहां कॉल केवल दो बार मुद्रित होता है, प्रत्येक ई और एफ के लिए एक बार, और जी के लिए मुद्रित नहीं होता है।

यदि ऐसा है, तो क्या कोई पी के लिए ऑपरेटर ओवरलोडिंग को ट्रिगर करने का कोई तरीका सुझा सकता है।

धन्यवाद।

1
0fnt 4 मार्च 2011, 08:42

3 जवाब

सबसे बढ़िया उत्तर

यदि आप एक वैरिएबल घोषित करते हैं और इसे उसी लाइन पर इनिशियलाइज़ करते हैं, तब भी यह कॉपी कंस्ट्रक्टर को कॉल करेगा।

दो इनिशियलाइज़ेशन सिंटैक्स हैं:

X a;
X b(a);

X a;
X b = a;

उनके मतलब के बारे में थोड़े अंतर हैं, लेकिन ज्यादातर मामलों में वे ऐसा ही करते हैं। अंतर यह है कि कुछ निर्माण/विनाश से बचने के लिए संकलक की गारंटी है या नहीं। किसी भी स्थिति में, कॉपी कंस्ट्रक्टर को बुलाया जाएगा, क्योंकि आप एक वस्तु का निर्माण कर रहे हैं। मुझे ठीक से याद नहीं है कि गारंटियों में अंतर के विवरण क्या हैं।

3
Sion Sheevok 4 मार्च 2011, 09:04
अगर किसी को सिंटैक्स के दो रूपों में मामूली अंतर बताते हुए कोई दस्तावेज मिल सकता है, तो कृपया टिप्पणी करें।
 – 
Sion Sheevok
4 मार्च 2011, 09:11
2
"इनिशियलाइज़ेशन जो T x = a; के साथ-साथ तर्क पासिंग, फंक्शन रिटर्न, एक अपवाद को फेंकना (15.1), एक अपवाद (15.3) को हैंडल करना, और एग्रीगेट मेंबर इनिशियलाइज़ेशन (8.5.1) में होता है, कॉपी-इनिशियलाइज़ेशन। [ नोट: कॉपी-इनिशियलाइज़ेशन एक मूव (12.8) को लागू कर सकता है। - एंड नोट ]" सेक्शन [dcl.init] में और फिर यह बताता है कि इनिशियलाइज़ेशन कंस्ट्रक्टर को कॉल करता है।
 – 
Ben Voigt
4 मार्च 2011, 09:19
वोइगट धन्यवाद दोस्त। मैं जो खोज रहा था वह कमोबेश यही है।
 – 
Sion Sheevok
4 मार्च 2011, 09:25

यह क्या हो रहा है,

A p = q + r;

A के कॉपी कंस्ट्रक्टर को कॉल करता है, असाइनमेंट ऑपरेटर को नहीं। हाँ, यह अजीब है। यह वैसा ही है जैसे आपने इसे टाइप किया था:

A p(q + r);
1
Terry Mahaffey 4 मार्च 2011, 08:48

ऐसे मामले जहां एक कॉपी कंस्ट्रक्टर कहा जाता है:

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.
1
Vijay 4 मार्च 2011, 09:15