उन दो निर्माणों एक बहुत उनके अर्थ में अलग है। पहले एक एक memset
समारोह है, जो करने का इरादा है निश्चित मूल्य को स्मृति का एक बफर सेट का उपयोग करता है। दूसरा एक ऑब्जेक्ट प्रारंभ करें। मुझे कोड का एक सा के साथ यह स्पष्ट करने दें:
चलो मान लेते हैं तो आप एक संरचना केवल पॉड प्रकार
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
इस मामले में एक POD_OnlyStruct t = {}
या POD_OnlyStruct t; memset(&t, 0, sizeof t)
ज्यादा फर्क नहीं है लिखने की है कि सदस्य , जैसा कि हमारे पास एकमात्र अंतर है, संरेखण बाइट memset
के मामले में शून्य-मान पर सेट किया जा रहा है। चूंकि आपके पास सामान्य रूप से उन बाइट्स तक पहुंच नहीं है, इसलिए आपके लिए कोई अंतर नहीं है।
दूसरी ओर, आप सी ++ के रूप में अपने प्रश्न टैग किया है के बाद से, के पॉड से प्रकार अलग-अलग सदस्य के साथ एक और उदाहरण की कोशिश, चलो: एक अभिव्यक्ति का उपयोग कर TestStruct t = {}
की तरह अच्छा है
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
इस मामले में , और memset
का उपयोग करके यह क्रैश हो जाएगा। यहां बताया गया है कि यदि आप memset
का उपयोग करते हैं तो TestStruct
का एक ऑब्जेक्ट बनाया गया है, इस प्रकार यह std::string
प्रकार का ऑब्जेक्ट बना रहा है, क्योंकि यह हमारी संरचना का सदस्य है। अगला, memset
स्मृति सेट करता है जहां ऑब्जेक्ट b
कुछ मान पर स्थित था, शून्य कहें। अब, जब हमारी टेस्टस्ट्रक्चर ऑब्जेक्ट गुंजाइश से बाहर हो जाती है, तो इसे नष्ट किया जा रहा है और जब इसकी बारी std::string b
पर आती है तो आपको एक क्रैश दिखाई देगा, क्योंकि उस ऑब्जेक्ट की आंतरिक संरचनाओं को memset
द्वारा बर्बाद कर दिया गया था।
तो, वास्तविकता यह है, उन चीजों बहुत अलग हैं, और हालांकि आप कभी कभी memset
को कुछ मामलों में शून्य करने के लिए एक पूरी संरचना की जरूरत है, यह हमेशा सुनिश्चित करें कि आप समझते हैं कि आप क्या कर रहे हैं बनाने के लिए महत्वपूर्ण है, और नहीं हमारे दूसरे उदाहरण में गलती करें।
मेरा वोट - वस्तुओं पर memset
का उपयोग केवल यदि यह आवश्यक है, और अन्य सभी मामलों में डिफ़ॉल्ट प्रारंभ x = {}
का उपयोग करें।
यह [जवाब] [1] बाद में एक प्रश्न के और अधिक उपयोगी और आसान प्रतीत होता है। [1]: http://stackoverflow.com/questions/4625212/class-initialization-list/4625730#4625730 – TheMatto