14

अगर हम जैसे कुछ लिखें:"int int [5] {};" में "{}" का उद्देश्य क्या है?

int *arr = new int[5]; 

इस मामले में, प्रणाली गतिशील प्रकार int के 5 तत्वों के लिए जगह आवंटित और अनुक्रम के पहले तत्व के लिए सूचक देता है। new ऑपरेटर के बाद

int *arr = new int[5]{}; 

तो, क्या मतलब है {}:

लेकिन, एक बार मैं निम्नलिखित कोड देखा था? इस कोड में {} का उद्देश्य क्या है?

मैं अपने खुद के मूल्य के साथ सरणी प्रारंभ की है, इस तरह:

#include <iostream> 

int main() 
{ 
    int* a = new int[5]{1}; 
    for(int i = 0; i < 5; i++) 
     std::cout<< a[i]<<' '; 

    delete[] a; 
} 

आउटपुट:

1 0 0 0 0 

केवल पहला तत्व प्रिंट 1। क्यूं कर?

int *arr = new int[5]{}; 

है, जबकि

+8

मैं आपको [इस 'नया' संदर्भ] (http://en.cppreference.com/w/cpp/language/new) पढ़ने के लिए अपना समय लेने की सलाह देता हूं। वाक्यविन्यास का वर्णन करने वाली तालिका में, * प्रारंभकर्ता * भाग को नोट करें। फिर इसके बारे में अधिक पढ़ने के लिए [निर्माण] (http://en.cppreference.com/w/cpp/language/new#Construction) के बारे में अनुभाग पर स्क्रॉल करें। –

+1

यह वाक्यविन्यास C++ 11. के बाद उपयोग में है। यह घुंघराले ब्रेसिज़ के अंदर निर्दिष्ट मानों के साथ या शून्य में शून्य के साथ एक सरणी प्रारंभ करने की अनुमति देता है। –

+5

std :: वेक्टर का प्रयोग करें! –

उत्तर

22
int *arr = new int[5]; 

एक default initialization करता है (इस मामले में, जिसका मतलब है arr के तत्वों अप्रारंभीकृत कर रहे हैं), एक value initialization (जो इस मामले में arr के तत्वों का मतलब शून्य हैं प्रारंभिक)। लिंक में संबंधित नियम देखें। विशेष रूप से बाद के मामले के लिए, सरणी शून्य-प्रारंभिक होगी।

वैसे भी, यदि कोई अन्य अच्छा कारण नहीं है, तो std :: वेक्टर का उपयोग प्राथमिकता दी जानी चाहिए।

संपादित करें: अपने दूसरे प्रश्न के बारे में: यह प्रारंभिक नियमों के कारण है। आप

int* a = new int[5]{1, 1, 1, 1, 1 }; 

पहले से ही की सिफारिश की std :: वेक्टर वाक्य रचना आप की इच्छा का समर्थन करता है लिखने के लिए होगा:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> a(5, 1); 
    for(int i = 0; i < 5; i++) 
     std::cout<< a[i]<<' '; 
} 

https://ideone.com/yhgyJg नोट तथापि के उपयोग() यहाँ -braces। चूंकि वेक्टर में std :: startizer_list के लिए एक कन्स्ट्रक्टर होता है, वेक्टर {5, 1} को कॉल करने से एक निश्चित अस्पष्टता लागू होती है, जिसे प्रदान किए जाने पर प्रारंभिकरण {list- प्रारंभिकरण के लिए हमेशा प्रारंभकर्ता_सूची कन्स्ट्रक्टर को प्राथमिकता से हल किया जाता है। तो का उपयोग कर {} 1 मान 1

+0

क्या मैं अपने खुद के मूल्य के साथ एक सरणी शुरू कर सकता हूं? – Jayesh

+0

हां। उदाहरण का प्रयोग करें अलग-अलग सरणी मानों के लिए सूची-प्रारंभिकरण: http://en.cppreference.com/w/cpp/language/list_initialization संपादित करें: भाषा वकीलों के लिए: यह वास्तव में समग्र प्रारंभिकरण है क्योंकि सरणी कुल हैं। – Jodocus

+0

@ जयेश: हाँ। किसी भी अभिव्यक्ति, चाहे उस सूची में स्थिरांक, चर, गणितीय अभिव्यक्ति या फ़ंक्शन कॉल नामक संख्याएं हों। – MSalters

0

के 5 तत्वों मूल्यों 5 के 2 तत्वों और, बजाय के साथ एक वेक्टर बनाने के लिए आप

int a[5]; 

और

int a[5] = {0}; 
के बीच का अंतर बता सकते हैं, तो कारण होगा

, जिसमें से बाद में स्थानीय सरणी को पर सभी शून्य पर प्रारंभ करने का एक सामान्य अभ्यास है, आप उसी वाक्यविन्यास को new पर पोर्ट भी कर सकते हैं।

std::vector समाधान के अलावा, सबसे सरल (और सामान्य) गैर एसटीएल समाधान एक बार के लिए सरणी के माध्यम से पुनरावृत्ति है:

for (int i = 0; i < sizeof(a)/sizeof(int); i ++) 
    a[i] = 1; 

FYI करें, सूची आरंभ कारणों सभी अनिर्दिष्ट सरणी का उपयोग कर शून्य पर सेट करने के लिए तत्व, उदाहरण के लिए

int a[5] = {[1] = 3}; 
// Now a is {0, 3, 0, 0, 0} 
संबंधित मुद्दे