2016-06-30 14 views
6

मान लीजिए मैं है निम्नलिखित वर्ग:क्या यह परिभाषित किया गया है?

struct A{ 
    void method(A& otherA) const{ 
    /* Mutate otherA */ 
    } 
}; 

और फिर बाद में मैं इस है:

A myA; 
myA.method(myA); 

मैं संकलक कि methodthis उदाहरण परिवर्तन नहीं होगा बता दिया है, लेकिन संकलक कि एहसास करता है मैं पैरामीटर के रूप में this उदाहरण में पास कर सकता हूं?

क्या मैं ऐसा करके सामान तोड़ सकता हूं? क्या यह परिभाषित व्यवहार है?

+0

हाँ आप इसे कर सकते हैं। कंपाइलर यह नहीं जानता था कि वे एक ही उदाहरण हैं या नहीं। यदि आप पारित पैरामीटर बदलना नहीं चाहते हैं तो आपको पैरामीटर प्रकार 'const' बनाना चाहिए। – songyuanyao

+0

@songyuanyao नहीं .... लेकिन मैं इसे – DarthRubik

+0

बदलना चाहता हूं तो यह ठीक रहेगा। आप इसे पारित तर्क के माध्यम से बदल सकते हैं। – songyuanyao

उत्तर

10

यह बिल्कुल ठीक है, और कोई समस्या नहीं है। इस उदाहरण में आप जो कर रहे हैं उसे कभी-कभी "एलियासिंग" कहा जाता है - जब दो तर्क वास्तव में एक ही वस्तु को संदर्भित करते हैं।

सादा सी में भी सरल मामले पर विचार करें:

void foo(int* a, const int* b) { *a += *b; } 

कि समारोह int रों करने के लिए दो संकेत लेता है, और पहले एक करने के लिए एक दूसरे को जोड़ता है। और निश्चित रूप से इस कोड का उपयोग करने के लिए अपने foo समारोह पूरी तरह से वैध है:

की तरह अपने विधि के भीतर एक जांच जोड़ने के लिए

int x = 10; 
foo(&x, &x); // now x is 20 

आप इस मामले में है कि व्यवहार की तरह नहीं करते हैं, तो सबसे अच्छा होगा शायद होगा

void A::method(A& otherA) const { 
    if (this == &otherA) { /* aliasing detected */ } 
    else { /* proceed as normal */ } 
} 
+0

मेरी मुख्य चिंता यह थी कि मेरा प्रोग्राम "अपरिभाषित व्यवहार" पर निर्भर हो सकता है, इसलिए मैं सिर्फ दोबारा जांच करना चाहता था ..... धन्यवाद – DarthRubik

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