2010-08-24 15 views
10

नीचे के आधार पर, क्या मैं सही हूँ?स्थानीय और वैश्विक चर डिफ़ॉल्ट रूप से कैसे प्रारंभ किए जाते हैं?

  • global_A संदर्भ शून्य में प्रारंभ किया गया है।
  • global_int 0
  • local_A संदर्भ अशक्त
  • local_int अप्रारंभीकृत
  • दोनों global_A.x और local_A.x अप्रारंभीकृत है है।

किसी भी मदद के लिए धन्यवाद।


A global_A; 
int global_int; 

class A { 
    public : int x; 
} 

int main() 
{ 
    int local_int; 
    A local_A; 
} 
+4

बेहतर शीर्षक की आवश्यकता है। – Varuna

+3

हेस नया इतना कठोर नहीं है – Chad

+0

आपको "उस बिंदु पर" स्पष्ट होना चाहिए कि आप उन मूल्यों के बारे में बात कर रहे हैं, सामान्य रूप से (मुख्य में प्रवेश करने से पहले, मुख्य के उद्घाटन ब्रेस पर और इसी तरह) – Chubsdad

उत्तर

-2

वे सब प्रारंभ किए जाने की आवश्यकता है। कंपाइलर आपको इसके बारे में चेतावनी देगा।

+2

के साथ संकलित कर रहे हैं तो वैश्विक चर 0 से शुरू हो गए हैं। –

+2

वैश्विक चर शून्य पर प्रारंभ नहीं किए गए हैं। – Chad

+0

@ चाड: वैश्विक चर बीएसएस अनुभाग में रहते हैं, जो शून्य है, इस प्रकार उन्हें डिफ़ॉल्ट रूप से 0 तक प्रारंभ किया जाता है। कृपया, http://en.wikipedia.org/wiki/Data_segment – jweyrich

1

वैश्विक_ए और स्थानीय_ए संदर्भ नहीं हैं; वे वस्तुएं हैं और उनके डिफ़ॉल्ट रचनाकारों का उपयोग करके बनाई गई हैं। डिफॉल्ट कन्स्ट्रक्टर को निर्दिष्ट नहीं किया गया है, इसलिए इसे जेनरेट किया जाएगा, जो कुछ भी नहीं करेगा ताकि सदस्य चर अनियमित बने रहे।

+1

तो क्या कोई वस्तु वैश्विक_ए और स्थानीय_ए दोनों के लिए बनाई गई है? सोरि मैं जावा + सी ++ के साथ मिश्रण कर रहा हूँ। जब मैं यहां संदर्भ कहता हूं .. मेरा मतलब पता है। तो क्या वे चर किसी भी वस्तु को इंगित करते हैं? – extdummy

+0

सी ++, जावा के विपरीत, वस्तुओं और ऑब्जेक्ट्स दोनों ऑब्जेक्ट्स में है। आप ऑब्जेक्ट्स घोषित कर रहे हैं, पॉइंटर्स नहीं। जो लगता है उसके लिए वाक्यविन्यास * आपके कोड को लगता है * ए * global_A = NULL; '। – dan04

-3

global_A संदर्भ शून्य पर प्रारंभ किया गया है।

नहीं है, इसकी एक वैध वस्तु (निर्माण डिफ़ॉल्ट निर्माता के आधार पर, जो आप अपने कोड में नहीं है, लेकिन संकलक कि कहते हैं)

global_int 0

हाँ

है

local_A संदर्भ रिक्त है

नहीं, वैश्विक

local_int के लिए के रूप में ही कारण अप्रारंभीकृत

नहीं है, इसके लिए 0

दोनों global_A.x प्रारंभ और local_A.x अप्रारंभीकृत है।

कोई दोनों 0

+3

स्थानीय चर प्रारंभ नहीं किए गए हैं। –

+1

@ जॉन: 'local_A' को अपने डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल द्वारा प्रारंभ किया गया है। –

-2

इस कोड के लिए शुरू कर रहे हैं संकलन नहीं होगा जब तक आप आगे ए

global_A संदर्भ अशक्त करने के लिए आरंभ नहीं हो जाता घोषित - नहीं, यह एक एक वस्तु दर्शाएंगे। global_int 0 है - ऐसा सोचें, जांचने की आवश्यकता है। स्थानीय_ए संदर्भ शून्य है - नहीं, global_A के समान। local_int अनियमित है - हाँ, इसे कुछ कचरा मूल्य मिलेगा। दोनों global_A.x और local_A.x दोनों प्रारंभ नहीं हैं - हां।

आप हमेशा डीबग और खुद के लिए देख सकते हैं।

+0

जो मैं भी समझ गया था लेकिन समस्या तब होती है जब मैं global_A या local_A संदर्भ मुद्रित करता हूं .. कुछ भी नहीं। ऐसा लगता है कि यह शून्य मान है, कुछ भी मुद्रित नहीं – extdummy

+0

आप उन्हें वास्तव में प्रिंट कैसे करते हैं? – Arjor

7

आपके कोड में कोई संदर्भ नहीं है, इसलिए आपके संदर्भों में से कोई भी संदर्भ "संदर्भ" का कोई मतलब नहीं है।

आपके उदाहरण में, वैश्विक वस्तु - global_int और global_A दोनों - शून्य-प्रारंभिक हैं। स्थानीय वस्तुओं - local_int और local_A - अनिश्चित मान होते हैं, जिसका अर्थ है कि local_int और local_A.x प्रारंभ नहीं किए गए हैं।

पीएस बेशक, जैसा कि पहले से ही उल्लेख किया गया है, आपका कोड गैर-संगत है। class A घोषित करने से पहले आप A ऑब्जेक्ट्स घोषित नहीं कर सकते हैं (और कक्षा परिभाषा के बाद आप ; खो रहे हैं)।

1
A global_A; 

यह एक संकेत है, सूचक नहीं, आपका प्रोग्राम मुख्य प्रवेश करने से पहले निर्माता को कॉल करेगा।

एक उदाहरण और नहीं करने के लिए एक उदाहरण आप लिखने के लिए एक सूचक प्राप्त करने के लिए:

A* global_A; 

global_int, 0 पर आरंभ नहीं हो जाता के रूप में सभी वैश्विक चर को उनके डिफ़ॉल्ट प्रारंभ कर रहे हैं।

परिवर्तनीय A local_A प्रत्येक बार जब आपका प्रोग्राम उस फ़ंक्शन में प्रवेश करता है जिसमें इसे अपने कन्स्ट्रक्टर को कॉल द्वारा घोषित किया जाता है।

जैसा कि आप पहले के लिए एक सूचक चाहते हैं, आपको ए * स्थानीय_ए लिखना होगा, लेकिन इस बार आपको इसे अपने आप को प्रारंभ करना होगा।

A *local_A = NULL; 

varialle के रूप में यह एक आदिम प्रकार है local_int अभ्यस्त प्रारंभ।

यदि स्थानीय_ए.एक्स प्रारंभ किया गया है तो ए के निर्माता पर निर्भर करता है, तो डिफ़ॉल्ट कन्स्ट्रक्टर स्थानीय_ए.एक्स प्रारंभ नहीं करेगा। यदि एक्स जहां ए का उदाहरण बनाते हुए क्लास इंस्टेंस एक्स को अपनी कक्षा के निर्माता के साथ एक्स शुरू करेगा।

+0

कम से कम जीसीसी में, global_int को 0 से शुरू किया जाएगा क्योंकि यह वैश्विक है। – jbernadas

+1

@jbernadas आप सही हैं, भाषा विनिर्देश का इसका हिस्सा है। इसे – josefx

7

असल में, जब भी आप एक चर घोषित करते हैं, तो संकलक इसके डिफ़ॉल्ट कन्स्ट्रक्टर को तब तक कॉल करेगा जब तक आप अन्यथा निर्दिष्ट नहीं करते।

भाषा स्तर के प्रकार (जैसे पॉइंटर्स, 'int', 'float', 'bool', आदि) "डिफ़ॉल्ट कन्स्ट्रक्टर" बिल्कुल कुछ नहीं करता है, यह केवल स्मृति को छोड़ देता है जब इसे घोषित किया जाता है (वैश्विक/स्थैतिक चर विशेष मामले हैं, विशिष्टताओं पर अधिक के लिए chubsdad's answer देखें)। इसका मतलब यह है कि वे बहुत कुछ भी हो सकते हैं क्योंकि आप आमतौर पर यह सुनिश्चित नहीं कर सकते कि उस स्मृति में क्या था या यहां तक ​​कि स्मृति कहाँ से आया था ('प्लेसमेंट न्यू' ऑपरेटर के मामले में छोड़कर)।

आपके द्वारा बनाई गई कक्षा में कोई रचनाकार नहीं है इसलिए संकलक आपके लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न करेगा जो केवल अपने प्रत्येक सदस्य/चर के निर्माता को कॉल करेगा। यदि आप पिछले अनुच्छेद में प्रदान की गई जानकारी को शामिल करते हैं, तो आप देख सकते हैं कि चर 'x' का डिफ़ॉल्ट डिफॉल्ट कन्स्ट्रक्टर होगा, जो कुछ भी नहीं करता है, और इस प्रकार किसी भी मान के लिए प्रारंभ नहीं किया जाता है।

जैसा कि अन्य ने कहा है, आपके कोड या पॉइंटर्स में कोई संदर्भ नहीं है, इसलिए यहां सभी मामलों में 'न्यूल' शब्द अमान्य है। NULL आमतौर पर एक सूचक को संदर्भित करता है, जो अन्य भाषा स्तर के प्रकारों की तरह, जब तक आप इसे एक मान निर्दिष्ट नहीं करते हैं तब तक कुछ भी सेट नहीं होता है (जब तक कि यह निश्चित रूप से वैश्विक/स्थैतिक चर न हो)।

+0

फिक्स्ड स्पष्टीकरण। ल्यूसिड और बिंदु पर। –

+2

यह बयान कि आदिम प्रकारों के डिफ़ॉल्ट कन्स्ट्रक्टर कुछ भी भ्रामक नहीं है, क्योंकि इसे स्पष्ट रूप से कॉल करने से संबंधित 'शून्य' मान ('int a = int(); 'मान को शून्य से शुरू किया जाता है) को मूल्य निर्धारित किया जाएगा। मुझे लगता है कि यह कहना अधिक सहज है कि डिफ़ॉल्ट रचनाकारों को स्वचालित रूप से आदिम प्रकारों के लिए बुलाया नहीं जाता है, जो उन अनियमित किए जाते हैं। –

+1

कभी-कभी, "डिफ़ॉल्ट कन्स्ट्रक्टर" को प्राइमेटिव्स के लिए भी स्वचालित रूप से बुलाया जाता है। ऐसा एक उदाहरण: 'संरचना {int x; फ्लोट एफ; } एस = {9}; जोर दें (एसएक्स == 9); जोर दें (एसएफ == 0.0 एफ); ' –

3
बस पूर्णता के लिए अगर आप संदर्भ था के लिए

:

संदर्भ घोषणा पर प्रारंभ किया जाना चाहिए, अन्यथा आप एक संकलक त्रुटि द्वारा दंडित मिलता है। इसका मतलब है कि किसी संदर्भ को हमेशा किसी अन्य मान या संदर्भ की आवश्यकता होती है जो इसे संदर्भित करती है (जैसे कहता है), यह संकलक द्वारा सुनिश्चित किया जाता है ताकि आप इसे न भूल सकें। यह भी दर्शाता है कि संदर्भ कभी भी शून्य पॉइंटर्स नहीं हो सकते हैं। हालांकि वे जिस वस्तु का उल्लेख करते हैं वह अमान्य हो सकता है।

13

एंड्री की प्रतिक्रिया पर बिल्डिंग।

$ 3.6.2- "स्थिर भंडारण अवधि (3.7.1) वाले ऑब्जेक्ट्स शून्य-प्रारंभिक (8.5) किसी अन्य प्रारंभिक होने से पहले होंगे।"। ओपी में, "global_A" और "global_int" में स्थिर संग्रहण अवधि होती है। "local_int" और "local_A" में कोई संबंध नहीं है क्योंकि ये स्थानीय वस्तुएं हैं।

$ 8,5/5- करने के लिए शून्य से प्रारंभ प्रकार टी की एक वस्तु का अर्थ है:

- अगर टी एक अदिश प्रकार (3.9), वस्तु के 0 (शून्य) मान पर सेट है है टी में परिवर्तित;

- अगर टी एक गैर संघ वर्ग प्रकार है, प्रत्येक nonstatic डेटा सदस्य और प्रत्येक आधार स्तरीय subobject zeroinitialized है;

- यदि टी एक संघ प्रकार है, तो ऑब्जेक्ट का पहले नामित सदस्य सदस्य 89) शून्य-प्रारंभिक है;

- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व शून्य-प्रारंभिक है;

- यदि टी एक संदर्भ प्रकार है, तो प्रारंभिकता निष्पादित की जाती है।

$ 6.7.4 से पहले किसी अन्य प्रारंभ होता है/4- "स्थैतिक भंडारण अवधि (3.7.1) के साथ सभी स्थानीय वस्तुओं की शून्य प्रारंभ (8.5) किया जाता है। पॉड प्रकार का एक स्थानीय वस्तु (3.9) निरंतर-अभिव्यक्तियों के साथ आरंभिक स्थैतिक भंडारण अवधि के साथ शुरू किया जाता है, इसके पहले ब्लॉक को पहले दर्ज किया जाता है। को अन्य स्थानीय ऑब्जेक्ट्स के शुरुआती प्रारंभिक प्रारंभिक शर्तों को प्रारंभिक भंडारण अवधि के साथ प्रारंभ करने के लिए एक क्रियान्वयन की अनुमति दी जाती है, जिसे एक ऑब्जेक्ट को स्थैतिक रूप से किसी ऑब्जेक्ट को प्रारंभ करने की अनुमति है नेमस्पेस स्कोप (3.6.2) में स्थिर भंडारण अवधि के साथ। अन्यथा इस तरह की ऑब्जेक्ट को पहली बार नियंत्रण घोषित किया जाता है, इसकी घोषणा के माध्यम से गुजरता है; इस तरह की वस्तु को प्रारंभिकरण के पूरा होने पर प्रारंभ माना जाता है। यदि प्रारंभिकरण टी से निकलता है अपवाद को घुमाते हुए, प्रारंभिकता पूर्ण नहीं होती है, इसलिए अगली बार नियंत्रण घोषणा में प्रवेश करने की कोशिश की जाएगी। घोषणा (रिकर्सिवली), जबकि वस्तु प्रारंभ किया जा रहा है नियंत्रण फिर से प्रवेश करती है, तो व्यवहार अपरिभाषित है। "

संपादित करें 2:

$ 8,5/9-" कोई प्रारंभकर्ता एक वस्तु के लिए निर्दिष्ट है, तो , और ऑब्जेक्ट (संभवतः सीवी-योग्यता) गैर-पीओडी कक्षा प्रकार (या इसके सरणी), ऑब्जेक्ट डिफ़ॉल्ट-प्रारंभिक होगा; यदि ऑब्जेक्ट कॉन्स-क्वालिफाइड प्रकार का है, अंतर्निहित कक्षा प्रकार में उपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर होगा। अन्यथा, यदि कोई प्रारंभकर्ता एक nonstatic वस्तु के लिए निर्दिष्ट किया जाता है, वस्तु और उसके subobjects, यदि कोई हो, एक अनिश्चित प्रारंभिक value90) है; अगर वस्तु या अपने subobjects के किसी भी स्थिरांक योग्य प्रकार के होते हैं, इस कार्यक्रम बीमार का गठन है। "

सामान्य तौर पर, आप इस पहलू पर अच्छा पकड़ के लिए के साथ $ 8.5 के साथ इन वर्गों तक पढ़ना चाहते हैं ।

-2

अच्छी तरह से लोग .. मैं अधिक के रूप में मैं यहाँ से जवाब देख उलझन में हूँ वैसे भी मैं एक परीक्षण किया जैसा कि नीचे दिखाया:।

1 # शामिल

2 using namespace std; 
    3 
    4 class A { 
    5 
    6 public : 
    7   A() : x(9) {}; 
    8   int x; 
    9 
10 }; 
11 
12 A global_a; 
13 int global_b; 
14 
15 int main() { 
16 
17   A local_a; 
18   int local_b; 
19   cout << "global_a.x = " << global_a.x << '\n'; 
20   cout << "local_a.x = " << local_a.x << '\n'; 
21 
22   cout << "global_b = " << global_b << '\n'; 
23   cout << "local_b = " << local_b << '\n'; 
24 
25 } 

आर esults ubuntu linux पर मेरे जी ++ संकलक का उपयोग कर:

global_a.x = 9

local_a.x = 9

global_b = 0

local_b = 0

मैं local_b लगता है चाहिए अपरिभाषित हो लेकिन किसी भी तरह संकलक इसे डिफ़ॉल्ट रूप से शुरू किया। हालांकि local_a .. मुझे यकीन नहीं है कि क्या इसे डिफ़ॉल्ट रूप से प्रारंभ किया जाना चाहिए। यहां परीक्षण से .. local_a शुरू किया प्रतीत होता है। निश्चित नहीं है कि यह मानक सी ++ विनिर्देश का अनुपालन करता है (उदाहरण के लिए सी ++ प्राइमर 4 वें संस्करण का कहना है कि डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग किया जाता है, भले ही कक्षा चर घोषित किया जाता है - क्या इसका मतलब क्लास प्रकार के वैरिएबल को प्रारंभिक है या नहीं, यह वैश्विक या स्थानीय है?)।

जो भी हो .. यह भ्रम का एक बड़ा नरक है। शायद मुझे सी ++ सीखना छोड़ देना चाहिए। जावा बहुत अधिक आगे है। नरक हाँह !!

+0

एक डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ना बदलता है कि 'ए' के ​​उदाहरण कैसे प्रारंभ किए जाते हैं। अब दोनों 'global_a' और 'local_a' को डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा प्रारंभ किया गया है। 'Local_b' के लिए, यह * होता है * होता है * 0 होना चाहिए। हालांकि, यह वास्तव में अनियमित है। यह ऐसा कुछ नहीं है जिसे आप एक प्रोग्राम लिखकर परीक्षण कर सकते हैं क्योंकि एक अनियमित वैरिएबल बहुत आसानी से "हो सकता है" 0 हो सकता है यदि यह उसकी स्मृति स्थान में था। –

+0

'ए' के साथ भ्रमित चीज यह है कि यदि आप एक कन्स्ट्रक्टर की आपूर्ति नहीं करते हैं तो संकलक एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करता है। इस डिफ़ॉल्ट कन्स्ट्रक्टर के अलावा कुछ भी नहीं करता है! यह एक नो-ऑप है। यह 'x' फ़ील्ड को जो भी डिफ़ॉल्ट मान देता है: 'global_a' के लिए जिसका अर्थ है' x' का 0 का डिफ़ॉल्ट मान है, जबकि' local_a' के लिए इसका अर्थ है कि 'x' अनियमित है क्योंकि इसकी डिफ़ॉल्ट स्थिति होना चाहिए अप्रारंभीकृत। –

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