10

इससे पहले कि आप इसे डुप्लिकेट के रूप में चिह्नित करना शुरू करें, मैंने पहले से ही this पढ़ा है। लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। लिंक किए गए प्रश्न सी ++ 98 & सी ++ 03 के बारे में बात करते हैं लेकिन मेरा प्रश्न डिफ़ॉल्ट कन्स्ट्रक्टर सी ++ 11 द्वारा पेश किया गया है।क्या यह गारंटी है कि डिफॉल्ट कन्स्ट्रक्टर स्वचालित रूप से प्रकारों में 0 से निर्मित प्रारंभ होता है?

निम्नलिखित कार्यक्रम पर विचार करें (लाइव डेमो here देखें):

#include <iostream> 
struct Test 
{ 
    int s; 
    float m; 
    Test(int a,float b) : s(a),m(b) 
    { } 
    Test()=default; 
}t; 
int main() 
{ 
    std::cout<<t.s<<'\n'; 
    std::cout<<t.m<<'\n'; 
} 

मेरा प्रश्न है कि करने के लिए डिफ़ॉल्ट 0 से संकलक यहाँ हमेशा प्रकार में बनाया initializes द्वारा प्रदान की डिफॉल्ट की निर्माता है सी ++ 11 & सी + +14 जब वे class & struct सदस्य हैं। क्या यह व्यवहार सी ++ 11 मानक द्वारा गारंटीकृत है?

+0

कौन बंद करने के लिए मतदान किया? क्यूं कर? – Destructor

+4

[विकी की डिफ़ॉल्ट-प्रारंभिकरण पर प्रविष्टि] देखें (http://en.cppreference.com/w/cpp/language/default_initialization) – jaggedSpire

+7

हालांकि, आपने वैश्विक रूप से 't' घोषित किया है, इसलिए यह मान/शून्य प्रारंभ होगा वैसे भी IIRC – melak47

उत्तर

8

Test = default डिफ़ॉल्ट रूप से इसके सदस्यों को प्रारंभ करेगा। लेकिन int या float के रूप में प्रकार के लिए, डिफ़ॉल्ट प्रारंभ मूल्य प्रारंभ से अलग है

तो

Test t; // t.s and t.m have unitialized value 

जबकि

Test t{}; // t.s == 0 and t.m == 0.0f; 
+0

'टेस्ट टी {} 'की परिभाषा क्या है? – curiousguy

+1

@curiousguy: यह 'टेस्ट टी = टेस्ट(); 'के समान मूल्य-प्रारंभिकरण के साथ' t' बनाता है। 'टेस्ट टी();' एक समारोह घोषणा होगी: अधिकांश-वेक्सिंग-पार्स देखें। – Jarod42

+0

'टेस्ट' का मूल्य init डिफ़ॉल्ट init क्यों नहीं है? – curiousguy

2

सभी प्रयोजनों के लिए: तो यह निर्मित प्रकार के सदस्यों को प्रारंभ नहीं करता

Test() {} 

:

Test() = default; 

के बराबर है।

+3

"सभी उद्देश्यों के लिए" क्या मतलब है? – Columbo

+1

समान रूप से रचनात्मक नहीं है, उन प्रयोजनों में से एक है – Praetorian

+2

मुझे सच में नहीं लगता कि यह सच है। 'टेस्ट() = डिफ़ॉल्ट' 'टेस्ट' के वैल्यू प्रारंभिकरण के कारण होता है जिसके परिणामस्वरूप 's' और' m' का शून्य प्रारंभ होता है। 'टेस्ट() {}' इसे तोड़ देगा। – juanchopanza

3

नहीं, डिफ़ॉल्ट निर्माता कुछ भी नहीं करता है! सदस्य चर आप लिख सकते हैं प्रारंभ करने के लिए: इस पर

struct Test 
{ 
    int s = 0; 
    float m = 3.3; 
    Test(int a,float b) : s(a),m(b) 
    { } 
    Test()=default; 
}; 

देखो: C++ ctor = default

14

दो अलग-अलग इस सवाल में निर्मित सवाल कर रहे हैं।

  1. = default डिफ़ॉल्ट कन्स्ट्रक्टर के लिए क्या मतलब है? [Class.ctor] से:

    एक डिफ़ॉल्ट निर्माता कि डिफॉल्ट की और के रूप में जब यह ओडीआर-प्रयोग किया जाता है (3.2) अपने वर्ग प्रकार (1.8) या जब की एक वस्तु बनाने के लिए हटाए गए परोक्ष परिभाषित किया गया है परिभाषित नहीं है इसकी पहली घोषणा के बाद इसे स्पष्ट रूप से डिफॉल्ट किया गया है। निहित रूप से परिभाषित डिफ़ॉल्ट कन्स्ट्रक्टर कक्षा के प्रारंभिकरणों का सेट करता है जो कि होगा जो उस श्रेणी के लिए उपयोगकर्ता द्वारा लिखित डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा कोई सीटीओआर-प्रारंभकर्ता (12.6.2) और खाली यौगिक-कथन के साथ किया जाता है।

    है, Test() = default बिल्कुल Test() { } के बराबर है, जो होगा डिफ़ॉल्ट आरंभ कर s और m है, जो उन्हें कुछ अनिश्चित मूल्य को निर्धारित करता है।

  2. t.s और t.m कैसे शुरू किए गए हैं? हां, यह एक अलग प्रश्न है (1) क्योंकि हम यहां केवल डिफ़ॉल्ट कन्स्ट्रक्टर को नहीं बुला रहे हैं। [Basic.stc.static] से:

    सभी चर जो गतिशील भंडारण अवधि की जरूरत नहीं है, धागा भंडारण अवधि की जरूरत नहीं है, और स्थानीय नहीं स्थिर भंडारण अवधि होती है।

    और [basic.start से।init]:

    स्थिर भंडारण अवधि (3.7.1) या धागा भंडारण अवधि के साथ चर (3.7.2) शून्य प्रारंभ (8.5) किया जाएगा से पहले किसी अन्य प्रारंभ होता है।

    इस प्रकार t.s और t.m, 0 होने की गारंटी कर रहे हैं, भले ही अगर हम डिफ़ॉल्ट-निर्माण एक स्थानीय Test, वे नहीं होगा।

+0

क्या यह संघ के सदस्यों के लिए काम करता है? इसका कोई मतलब भी है क्या? – curiousguy

+0

@curiousguy संघ के सदस्यों के लिए क्या काम करता है? – Barry

+0

यूनियनों के सभी सदस्यों को शून्य शुरू किया गया है? – curiousguy

5

के रूप में यह पहले से ही उत्तर है, यह है कि इसकी गारंटी नहीं है डिफ़ॉल्ट निर्माता "स्वचालित रूप से प्रकारों में 0 को स्वचालित रूप से बनाया जाएगा"।

आप अपने लिए यह देखने के लिए प्लेसमेंट नए का उपयोग कर सकते हैं। निम्नलिखित कोड पर विचार करें:

#include <iostream> 

struct Test 
{ 
    int s; 
    float m; 
    Test(int a,float b) : s(a),m(b) 
    { } 
    Test()=default; 
}; 

int main() 
{ 
    char* buf = new char[sizeof(Test)]; 
    Test* t = new (buf) Test; 

    std::cout << t->s << '\n'; 
    std::cout << t->m <<'\n'; 

    t->s = 42; 
    t->m = 4.2; 

    t->~Test(); 
    t = new (buf) Test; 

    std::cout << t->s << '\n'; 
    std::cout << t->m <<'\n'; 
} 

, तो डिफ़ॉल्ट निर्माता को गारंटी दी गई थी गैर वर्ग प्रकार पर डेटा सदस्यों शून्य से प्रारंभ, इस कार्यक्रम के उत्पादन में चार शून्य होगा।

हालांकि, आप की संभावना इस बजाय की तरह कुछ दिखाई देगा:

0 
0 
42 
4.2 

यहाँ cpp.sh पर इस कोड है - http://cpp.sh/9fdj

+0

डिफ़ॉल्ट/मान init का परीक्षण करने के लिए अच्छी चाल को कॉल करें, लेकिन ध्यान दें कि ओपी के साथ 't' है विभिन्न भंडारण प्रकार, जो उत्तर बदलता है। – ricab

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

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