C++ इंटरव्यू कैसे पास करें: एडवांस्ड लेवल के टॉप प्रश्न
\n\nमिड-लेवल और सीनियर C++ डेवलपर पदों के लिए इंटरव्यू सिर्फ सिंटैक्स की जांच नहीं है। इंटरव्यूअर भाषा की आंतरिक कार्यप्रणाली, मेमोरी मैनेजमेंट, टेम्पलेट्स और मल्टीथ्रेडिंग की गहरी समझ देखना चाहते हैं। इस लेख में हमने C++ इंटरव्यू में पूछे जाने वाले सबसे सामान्य और कठिन प्रश्नों को समझाया है। प्रत्येक प्रश्न के साथ स्पष्टीकरण और कोड उदाहरण दिए गए हैं।
\n\n1. स्मार्ट पॉइंटर्स और RAII
\n\nस्मार्ट पॉइंटर्स पर प्रश्न क्लासिक है। आपसे अपेक्षा की जाती है कि आप न केवल std::unique_ptr, std::shared_ptr और std::weak_ptr के नाम बताएं, बल्कि उनकी आंतरिक कार्यप्रणाली और कब किसका उपयोग करना है, यह भी समझाएं।
सामान्य प्रश्न: unique_ptr और shared_ptr में क्या अंतर है? shared_ptr में रेफरेंस काउंटिंग कैसे काम करती है? weak_ptr की आवश्यकता क्यों है?
उत्तर: std::unique_ptr संसाधन का अनन्य स्वामित्व प्रदान करता है। इसे कॉपी नहीं किया जा सकता, केवल मूव (मूव सेमेंटिक्स) किया जा सकता है। std::shared_ptr साझा स्वामित्व के लिए रेफरेंस काउंटिंग का उपयोग करता है। जब काउंटर शून्य हो जाता है, तो ऑब्जेक्ट डिलीट हो जाता है। std::weak_ptr एक "पर्यवेक्षक" है जो रेफरेंस काउंटर को नहीं बढ़ाता। इसका उपयोग चक्रीय निर्भरताओं (जैसे ग्राफ या ट्री में) को रोकने के लिए किया जाता है।
#include <memory>\n#include <iostream>\n\nstruct Resource {\n Resource() { std::cout << "Resource acquired\\n"; }\n ~Resource() { std::cout << "Resource released\\n"; }\n};\n\nint main() {\n // unique_ptr\n std::unique_ptr<Resource> ptr1 = std::make_unique<Resource>();\n // std::unique_ptr<Resource> ptr2 = ptr1; // कंपाइल एरर - कॉपी करना प्रतिबंधित\n std::unique_ptr<Resource> ptr2 = std::move(ptr1); // मूव करने की अनुमति\n\n // shared_ptr\n std::shared_ptr<Resource> sptr1 = std::make_shared<Resource>();\n std::shared_ptr<Resource> sptr2 = sptr1; // कॉपी करने की अनुमति, काउंटर = 2\n\n // weak_ptr\n std::weak_ptr<Resource> wptr = sptr1; // काउंटर नहीं बढ़ता\n if (auto locked = wptr.lock()) {\n std::cout << "Resource is still alive\\n";\n }\n\n return 0;\n}\n\nअतिरिक्त प्रश्न: अपना खुद का SharedPtr कैसे लागू करें? यहां RAII (Resource Acquisition Is Initialization) सिद्धांत का उल्लेख करना महत्वपूर्ण है - जिसमें कंस्ट्रक्टर में संसाधन प्राप्त किया जाता है और डिस्ट्रक्टर में मुक्त किया जाता है।
2. वर्चुअल डिस्ट्रक्टर और वर्चुअल फंक्शन टेबल (vtable)
\n\nयह प्रश्न पॉलिमॉर्फिज्म और C++ में वर्चुअल फंक्शन की कार्यप्रणाली की समझ की जांच करता है।
\n\nसामान्य प्रश्न: वर्चुअल फंक्शन वाले बेस क्लास में वर्चुअल डिस्ट्रक्टर क्यों होना चाहिए? vtable कैसे काम करता है?
\n\nउत्तर: यदि बेस क्लास का डिस्ट्रक्टर वर्चुअल नहीं है, तो बेस क्लास पॉइंटर के माध्यम से डिराइव्ड क्लास के ऑब्जेक्ट को डिलीट करने पर केवल बेस क्लास का डिस्ट्रक्टर कॉल होगा। इससे डिराइव्ड क्लास द्वारा आवंटित संसाधनों का मेमोरी लीक हो जाएगा।
\n\nप्रत्येक क्लास जिसमें कम से कम एक वर्चुअल फंक्शन है, उसमें एक स्टैटिक टेबल (vtable) होती है। इसमें वर्चुअल फंक्शन के इम्प्लीमेंटेशन के पॉइंटर्स संग्रहीत होते हैं। ऐसे क्लास के प्रत्येक ऑब्जेक्ट में एक छिपा हुआ पॉइंटर (vptr) होता है जो अपने क्लास की vtable की ओर इशारा करता है। वर्चुअल फंक्शन कॉल डबल इनडायरेक्शन के माध्यम से होता है: ऑब्जेक्ट → vptr → vtable → फंक्शन। यह सामान्य कॉल की तुलना में थोड़ा ओवरहेड जोड़ता है।
\n\n#include <iostream>\n\nclass Base {\npublic:\n virtual void show() { std::cout << "Base\\n"; }\n virtual ~Base() = default; // वर्चुअल डिस्ट्रक्टर\n};\n\nclass Derived : public Base {\npublic:\n void show() override { std::cout << "Derived\\n"; }\n};