में भंडारण आवंटन मैं सी ++ अध्याय 6 प्रारंभिक & सफाई में सोच रहा हूं। लेखक ने कहा कि:सी ++
यह वास्तव में अधिक संभावना है कि संकलक कि गुंजाइश के उद्घाटन ब्रेस पर एक क्षेत्र के लिए सभी भंडारण आवंटन की सी में अभ्यास का पालन करेंगे है। इससे कोई फर्क नहीं पड़ता क्योंकि, प्रोग्रामर के रूप में, आप तब तक स्टोरेज तक पहुंच नहीं सकते जब तक इसे परिभाषित नहीं किया जाता है। हालांकि स्टोरेज ब्लॉक की शुरुआत में आवंटित है, कन्स्ट्रक्टर कॉल तब तक होता है जब तक ऑब्जेक्ट परिभाषित नहीं किया जाता है क्योंकि पहचानकर्ता तब तक उपलब्ध नहीं है। कंपाइलर भी पर जांच करता है सुनिश्चित करें कि आप ऑब्जेक्ट परिभाषा नहीं डालते हैं जहां अनुक्रम बिंदु केवल सशर्त रूप से इसके माध्यम से गुजरता है, जैसे स्विच कथन या कहीं भी एक गोटो इसे पीछे कूद सकता है।
और फिर लेखक निम्नलिखित के रूप में एक उदाहरण देता है:
class X {
public:
X();
};
X::X() {}
void f(int i) {
if(i < 10) {
//! goto jump1; // Error: goto bypasses init
}
X x1; // Constructor called here
jump1:
switch(i) {
case 1 :
X x2; // Constructor called here
break;
// case 2 : // Error: case bypasses init
X x3; // Constructor called here
break;
}
}
int main() {
f(9);
f(11);
}///:~
क्यों उपरोक्त कोड ठीक है मुझे समझ नहीं आता? मेरी समझ के अनुसार, x2
को i
1
नहीं है, तो प्रारंभिकता को बाधित किया जा सकता है।
अनुपूरक: "। It'a वास्तव में अधिक संभावना है कि संकलक कि गुंजाइश के उद्घाटन ब्रेस पर एक क्षेत्र के लिए सभी भंडारण आवंटन की सी में अभ्यास का पालन करेंगे"
यह वाक्य मुझे भी भ्रमित कर दिया।
लेखक के विवरण के अनुसार, switch
के उद्घाटन ब्रेस पर, कंपाइलर ने x2
और के लिए पहले ही स्थान आवंटित कर दिया है। यदि ऐसा है, तो x2
के लिए अनियमित होने का अवसर है (केस 1 संतुष्ट नहीं है)।
वह नियम सी ++ 03 में था, और शायद सी ++ 98। और यह सी कोड तोड़ नहीं देता है क्योंकि सभी सी ++ मानक अपवाद की अनुमति देते हैं जब initia lized ऑब्जेक्ट में एक सी-संगत प्रकार है। – aschepler
मुझे यकीन नहीं है कि 'ब्रेकिंग सी कोड' के बारे में आपकी टिप्पणी क्या है? हां, इंट्रिनिक्स (पीओडी, मुझे अभी यकीन नहीं है) एक अलग जानवर हैं। पूरी भाषा में। और, हां, जैसा कि मैंने स्पष्ट रूप से दिखाया है, सी ++ 11 – sehe
सी 1 से पहले प्रारंभिक उपकरणों के कूदने के नियम अधिक सी थे, सी और सी ++ के बीच मतभेदों के बारे में है, सी ++ 03 और सी ++ 11 के बीच मतभेदों के बारे में नहीं। सी ++ 11 सी .1.5 कोई बदलाव नहीं है; यह सी ++ 03 सी .1.4 के समान है। आप 6.7 एमपी में परिवर्तन के बारे में बात कर रहे हैं, जो हां, कुछ सी ++ 03 कोड तोड़ता है। – aschepler