2011-11-02 11 views
23

साक्षात्कारकर्ता ने मुझे इस तरह का एक कोड दिखाया और मुझसे पूछा कि क्या यह संकलित होगा, और मेरा तर्क दे। मैंने उसे बहुत निश्चित रूप से बताया कि यह संकलित नहीं होगा, क्योंकि 10 स्थिर है और आप एक गैर-कॉन्स्ट संदर्भ (जैसेबी = 10 संकलित नहीं करेंगे) के निरंतर असाइन नहीं कर सकते हैं, यह भी एक अस्थायी चर है और यह है कॉन्स को भी माना जाता है, फिर भी, आप एक कॉन्स वैरिएबल को संदर्भित करने के लिए गैर-कॉन्स्ट संदर्भ का उपयोग नहीं कर सकते हैं।यह संकलन क्यों करता है? उम्मीद है कि "एक गैर-कॉन्स्ट संदर्भ के लिए निरंतर असाइन नहीं किया जा सकता"

हालांकि, मेरे आश्चर्य के घर आने के बाद मैंने पाया कि यह सभी संभावित कंपाइलरों के साथ पूरी तरह से संकलित है। इसके अलावा, मुझे नौकरी नहीं मिली। मेरी समझ का क्या हिस्सा गलत हो गया?

class A { 
    int& a; 
public: 
    A(int _a):a(_a) {} 
}; 

int main() { 
    A a(10); 
}  
+24

के स्टैक वैरिएबल को संदर्भित करता है, जिस स्थिति के लिए आप साक्षात्कार कर रहे थे? यदि यह सी ++ पार्सर बनाने के अलावा कुछ और है, तो मैं कहूंगा कि यह संभवतः हास्यास्पद है कि इसे इस तरह सी ++ के हर अस्पष्ट कोने को जानने की आवश्यकता है। – Mysticial

+11

मुझे यह धारणा मिलती है कि साक्षात्कारकर्ता भाषा के अस्पष्ट कोनों को जानने और डिजाइन कौशल और सर्वोत्तम प्रथाओं पर पर्याप्त नहीं होने पर बहुत अधिक जोर देते हैं। –

+1

@ मैस्टिसियल: यह नए डेवलपर्स के लिए एक आम गड़बड़ी है क्योंकि यह कोड पहले काम करेगा, लेकिन एक यादृच्छिक बिंदु (फ़ंक्शन कॉल के बाद) में विफल हो जाएगा। – Dani

उत्तर

27

कोई इस कोड के साथ एक स्थिरांक के "काम" है ...

कोड निर्माता है जो एक int लेता है कहता है और बदले में int& के प्रारंभकर्ता कहता है। जब आप मानते हैं कि int& b = 10 है, तो यह _a = 10; int& a = _a; जैसा है, तो आपने संकलक को देखे/कई कदम उठाए हैं। यह संकलित करता है लेकिन कुछ भी नहीं है जिसे आप उपयोग करना चाहते हैं (स्टैक के संदर्भ को बाध्य करना जो बाद में अपरिभाषित व्यवहार/भ्रष्टाचार का कारण बनता है) ...

7

यह ढेर से बंधेगा, क्योंकि फ़ंक्शन तर्कों को बाध्य किया जा सकता है संदर्भ। हालांकि यह बिल्कुल सुरक्षित नहीं है और किसी भी समय अपरिभाषित व्यवहार और भ्रष्टाचार को रोक देगा।

12

_a एक अस्थायी चर

गलत है और यह भी स्थिरांक माना जाता है। कन्स्ट्रक्टर बॉडी और प्रारंभकर्ता सूची के दायरे में, यह बिल्कुल अस्थायी नहीं है। यह एक लालसा और कार्य तर्क है- यह पूरे कार्य शरीर में आपके एकल उपयोग से परे रहता है।

इसके अलावा, रावल और const में एक दूसरे के साथ बिल्कुल कुछ नहीं करना है, सिवाय इसके कि सी ++ 03 में आप राजस्व के गैर-कॉन्स्ट संदर्भों को बाध्य नहीं कर सकते हैं। उदाहरण के लिए, आप रैल्यू पर बहुत सारे गैर-कॉन्स फ़ंक्शन को ठीक कर सकते हैं।

इस कोड को सीधे

int main() { 
    int i = 10; 
    int& x = i; 
} 

के बराबर यह एक कक्षा में जा रहा है के साथ शामिल जीवन की समस्याओं से जोड़ा मज़ा के साथ है।

4

इस प्रोब के 2 प्रश्न हैं।

q1) क्या इसे संकलित करना चाहिए या नहीं?

उत्तर: यह संकलित होगा क्योंकि यहां को _a का संदर्भ दिया गया है, यह संकलक सिरदर्द नहीं है कि डेटा कैसे प्राप्त होगा।

q2) क्या यह सही कोड है? मेरा मतलब है कि कोई रन टाइम त्रुटि होगी या नहीं?

उत्तर: यह सही कोड नहीं है। यहां एक _a को संदर्भित करता है जो स्टैक वेरिएबल है। तो यदि आप एक संदर्भ वर्ग ए ऑब्जेक्ट का संदर्भ चर निर्दिष्ट करते हैं, तो आउटपुट अप्रत्याशित होगा।

class A { 
public: 
    int& a; 

    A(int _a):a(_a) {} 
}; 

int main() { 
    A a(10); 
    A a1(11); 
    cout << a.a; 
}  

उत्पादन देखें: एक उदाहरण लेते हैं नीचे दिए गए देता है।आउटपुट अप्रत्याशित है क्योंकि आप संदर्भ चर का उपयोग करने का प्रयास कर रहे हैं जो कि कन्स्ट्रक्टर

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

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