2010-03-28 23 views
8

मैं साथ पूर्णांक चर x और निजी में y, और एक ऑपरेटर अधिभार समारोह वर्ग दिया गया है में "इस" सूचक प्रश्न,के बारे में C++

class Bag{ 
private: 
    int x; 
    int y; 
public: 
    Bag(); 
    ~Bag(); 
    //....... 
    //.....etc 
}; 


Bag operator+ (Bag new) const{ 
    Bag result(*this); //what does this mean? 
    result.x += new.x;   
    result.y += new.y; 
} 

क्या "थैला परिणाम होने का प्रभाव (* यह है); " क्या आप वहां मौजूद हैं?।

+5

क्या 'ऑपरेटर +' फ़ंक्शन 'वापसी' कथन गायब है? –

+3

यह मान्य सी ++ जैसा दिखता नहीं है - नया कीवर्ड – Artyom

+0

है यदि आप ऑपरेटरों को बनाना चाहते हैं, तो मैं सुझाव देता हूं कि 'बूस्ट.ऑपरेटर्स' देखें। उन्होंने समान ऑपरेटरों को एक साथ समूहित किया है (जैसे '+ =' और '+') और समूह में से केवल एक को लिखना आपको दूसरों को मुफ्त में अनुदान देता है :) –

उत्तर

10

Bag result(*this) वस्तु जिस पर ऑपरेटर समारोह बुलाया गया था एक कॉपी बन जाती।

अगर वहाँ था उदाहरण:

sum = op1 + op2; 

तो resultop1 की एक प्रति हो जाएगा।

के बाद से operator+ समारोह अपने ऑपरेंड की राशि कर रहे हैं और योग लौटा रहा है, हम संकार्य OP1 जो this सूचक माध्यम से किया जाता पहुंचने का एक तरीका की जरूरत है।

वैकल्पिक रूप से हम कर सकते थे:

Bag result; 
result.x = (*this).x + newobj.x; // note you are using new which is a keyword. 
result.y = (*this).y + newobj.y; // can also do this->y instead 
return result; 
2

operator+ समारोह एक प्रति देता है। बयान:

Bag result(*this); 

इस ऑब्जेक्ट की प्रति बना रहा है फोन करने वाले पर लौटने के लिए। हस्ताक्षर के अनुसार, इसे एक मूल्य वापस करना होगा, इसलिए यह एक प्रतिलिपि बना रहा है और फिर new ऑब्जेक्ट जोड़ रहा है।

4

सबसे पहले, चर नाम के रूप में उपयोग करने के लिए new नहीं कोड लेखक बता - किसी कुंजीशब्द है। इसके अलावा, return result; पर remeber। और या तो कॉन्स-रेफरेंस द्वारा पास या new बैग को सीधे संशोधित करें।


एक struct/वर्ग के अंदर, this खुद के लिए सूचक है। इसलिए, *this पूरे बैग उदाहरण के लिए एक संदर्भ है।

बयान Bag result(a_bag_reference)Bag की प्रतिलिपि निर्माता है, जो result में a_bag_reference की एक प्रतिलिपि बनाता कॉल करेंगे।

इसलिए,

Bag result(*this); 

खुद की एक प्रतिलिपि बनाता है, तो result में संग्रहीत करते हैं। यह अगले 2 बयान

result.x += new.x; 
result.y += new.y; 

उदाहरण ही है (यानी this->x और this->y स्थिर रखा जाता है) को प्रभावित नहीं करते बनाता है।

5

आपका कोड देखने की तरह होगा:

class Bag { 
public: 
    Bag(); 
    Bag(Bag const& other); // copy ctor, declared implicitly if you don't declare it 
    ~Bag(); 

    Bag operator+(Bag const& other) const; 

private: 
    int x; 
    int y; 
}; 

Bag Bag::operator+(Bag const& other) const { 
    Bag result (*this); 
    result.x += other.x;   
    result.y += other.y; 
    return result; 
} 

निहित "वर्तमान वस्तु" सदस्य कार्यों के लिए इस नाम के एक विशेष मूल्य द्वारा की ओर इशारा कर रहा है।तब *this उस वस्तु हो जाता है (इस अपसंदर्भन द्वारा), और यह (कॉपी निर्माता के माध्यम से) के निर्माण के लिए प्रयोग किया जाता है एक और बैग परिणाम नाम दिया है।

मैं इस कोड एक होमवर्क असाइनमेंट से लिया जाता है पर शक है, तो आप one true addition operator पैटर्न का उपयोग करने में सक्षम नहीं हो सकता है, लेकिन यह सामान्य है और आप इसके बारे में पता होना चाहिए:

struct Bag { 
    //... 
    Bag& operator+=(Bag const& other) { 
    x += other.x; 
    y += other.y; 
    return *this; // return a reference to the "current object" 
    // as almost all operator=, operator+=, etc. should do 
    } 
}; 

Bag operator+(Bag a, Bag const& b) { 
    // notice a is passed by value, so it's a copy 
    a += b; 
    return a; 
} 
+1

यह op +() लिखने का एक खतरनाक तरीका है - पहला पैरामीटर कटाया जाएगा , और अगर उस पर आधारित समारोह में कोई बहुलक व्यवहार होने का इरादा था, तो वहां नहीं होगा। दोनों पैरामीटर कॉन्स संदर्भ बनाने और फ़ंक्शन के भीतर कॉपी बनाने के लिए यह बेहतर है। –

+0

@ नील: फ़ंक्शन के भीतर प्रतिलिपि भी स्लाइस; जब तक आपको इसे बदलने की आवश्यकता न हो तब तक इस पैटर्न का उपयोग करना बेहतर होता है। यह भी देखें http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ जो ऑपरेटर = के लिए एक ही मुहावरे को बढ़ावा देता है। –

2

Bag result(*this); एक घोषित है परिवर्तनीय result और कॉपी कन्स्ट्रक्टर का आविष्कार किया।

आप कल्पना कर सकते हैं कि सी ++ स्वचालित रूप से सभी कक्षाओं के लिए एक डिफ़ॉल्ट प्रतिलिपि निर्माता घोषित करता है। अपना काम एक वस्तु किसी अन्य वस्तु का उपयोग कर प्रारंभ करने के लिए बस है:

Bag::Bag(Bag const& src) { 
    x = src.x; 
    y = src.y; 
}

अभिव्यक्ति *this एक छोटे से बेचैन लग सकता है, लेकिन सिर्फ सी के ++ जब आप & मानकों से निपटने के सामान्य आतंक है।

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