2016-04-12 7 views
6

इंटरनेट पर स्पष्टीकरण के लिए बहुत सारे कोड हैं (विशेष रूप से यहां, स्टैक ओवरफ्लो पर) जो *this लौटाते हैं।कुछ वर्ग विधियां क्यों "* यह" (स्वयं का ऑब्जेक्ट संदर्भ) लौटती हैं?

उदाहरण के लिए पोस्ट Copy constructor and = operator overload in C++: is a common function possible? से:

MyClass& MyClass::operator=(const MyClass& other) 
{ 
    MyClass tmp(other); 
    swap(tmp); 
    return *this; 
} 

जब मैं लिखने के रूप में स्वैप:

void MyClass::swap(MyClass &tmp) 
{ 
    // some code modifying *this i.e. copying some array of tmp into array of *this 
} 

void करने के लिए operator = के लिए पर्याप्त सेटिंग वापसी मान नहीं है और *this लौटने से बचने के?

+0

आपको कैसे लगता है कि 'a = b = c' जैसे अक्षरों को चालू करना? –

+2

'ऑपरेटर =' का "सामान्य" व्यवहार ऑपरेशन के परिणाम के संदर्भ को वापस करना है। आप इसे शून्य के रूप में परिभाषित कर सकते हैं लेकिन यह सभी उपयोगकर्ताओं की अपेक्षाओं के लिए अलग व्यवहार करता है। आप सरल ('x = y) ++' या किसी अन्य मूल्यांकन जैसे कुछ नहीं लिख सकते हैं जो परिणाम मान का उपयोग करता है। यह महत्वपूर्ण है कि आप ऑब्जेक्ट के संदर्भ को केवल मान न दें। यदि आप केवल मूल्य वापस करते हैं, तो उपरोक्त शब्द संकलित होगा लेकिन परिणाम गलत है! – Klaus

+0

इसे [विधि चेनिंग] कहा जाता है (https://en.wikipedia.org/wiki/Method_chaining#C.2B.2B)। संबंधित: [सी ++ में 'वापसी * ​​इस' का क्या मतलब है?] (Http://stackoverflow.com/q/18162522/514235)। – iammilind

उत्तर

8

यह मुहावरा समारोह की श्रंखला कॉल सक्षम करने के लिए मौजूद है:

int a, b, c; 
a = b = c = 0; 

यह int रों के लिए अच्छी तरह से काम करता है, तो वहाँ यह उपयोगकर्ता परिभाषित प्रकार :)

स्ट्रीम के लिए इसी तरह

के लिए काम नहीं कर रही है का कोई मतलब नहीं है ऑपरेटर:

std::cout << "Hello, " << name << std::endl; 

0 के रूप में ही काम करता है

return *this मुहावरे के कारण, पहले उदाहरण की तरह श्रृंखला बनाना संभव है।

7

वजहों *thisa = b = c; जो b = c; a = b; के बराबर है की तरह काम चेन अनुमति देने के लिए दिया जाता है में से एक। सामान्य रूप से, असाइनमेंट का परिणाम कहीं भी इस्तेमाल किया जा सकता है, उदा। जब कार्यों का आह्वान करते हैं (f(a = b)) या अभिव्यक्तियों में (a = (b = c * 5) * 10)। हालांकि, ज्यादातर मामलों में, यह कोड को और अधिक जटिल बनाता है।

+1

इसके अलावा 'if's;) 'if (a = 5) ...'। इस सुविधा के कारण क्लासिक बग। –

+0

यह समझ में आता है, अच्छा, धन्यवाद – scarface

0

आप *this लौटते हैं जब एक मजबूत भावना है कि आप वस्तु पर अभी तक एक ही कार्रवाई का आह्वान करेंगे।

उदाहरण के लिए, अपने आप में लौट std::basic_string::append क्योंकि एक मजबूत भावना है कि आप अभी तक एक और स्ट्रिंग

str.append("I have ").append(std::to_string(myMoney)).append(" dollars");

ही operator =

myObj1 = myObj2 = myObj3

swap के लिए चला जाता है संलग्न करना होगा है वहाँ इस मजबूत भावना नहीं है। क्या अभिव्यक्ति obj.swap(other).swap(rhs) सामान्य प्रतीत होती है?

संबंधित मुद्दे