मैं एक struct कि इस तरह दिखता है (एक पॉड) है कहते हैं:डिफ़ॉल्ट सी में struct प्रारंभ ++
struct Foo
{
int i;
double d;
};
क्या निम्नांकित दो पंक्तियों के बीच मतभेद हैं:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
मैं एक struct कि इस तरह दिखता है (एक पॉड) है कहते हैं:डिफ़ॉल्ट सी में struct प्रारंभ ++
struct Foo
{
int i;
double d;
};
क्या निम्नांकित दो पंक्तियों के बीच मतभेद हैं:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
पहला व्यक्ति मूल्यों को अनियंत्रित करता है; दूसरा उन्हें शून्य तक शुरू करता है। यह केवल पीओडी प्रकारों के मामले में है, जिनके पास कोई कन्स्ट्रक्टर नहीं है।
प्रति लिंक मैं की तैनाती।
सी ++ में कक्षा और संरचना के बीच एकमात्र अंतर यह है कि वर्ग-सदस्य डिफ़ॉल्ट रूप से निजी होते हैं, जबकि संरचना-सदस्य सार्वजनिक रूप से डिफ़ॉल्ट होते हैं। तो संरचनाओं में रचनाकार हो सकते हैं, और वाक्यविन्यास कक्षाओं के समान ही है।
बिंदु नई वस्तुओं का निर्माण करते समय घुमावदार ब्रैकेट का उपयोग या चूक है। सवाल कक्षाओं के साथ ही structs पर लागू होता है। – Troubadour
मैं कुछ भी नहीं लगता है। Foo()
की अनुमति है, भले ही इसे कोई समझ न हो ... मैंने struct
को class
में बदलने की कोशिश की है और जेनरेटेड एक्सई पर एक अंतर की कोशिश की है, और वे वही हैं, जिसका अर्थ यह है कि विधि के बिना एक वर्ग एक संरचना की तरह है एक व्यावहारिक और "प्रभावी" दृष्टिकोण।
लेकिन: अगर आप केवल विकल्प के एक, का उपयोग struct
या class
कोई फर्क नहीं पड़ता रखते हुए, ऐसा होता है कि new Foo
और new Foo()
निष्पादनयोग्य जो अलग कर देता है! (कम से कम जी ++ का उपयोग कर) आईई।
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo; delete f1; }
से
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo(); delete f1; }
somehing अलग में संकलित किया गया है और एक ही class
बजाय struct
के साथ होता है। यह जानने के लिए कि अंतर कहां है, हमें जेनरेट कोड को देखना चाहिए ... और यह जानना कि यह एक जी ++ idiosincracy है या नहीं, मुझे एक और कंपाइलर आज़माएं, लेकिन मेरे पास केवल gcc है और g ++ के एएसएम आउटपुट का विश्लेषण करने के लिए अब कोई समय नहीं है। ..
वैसे भी "कार्यात्मक" (व्यावहारिक) दृष्टिकोण से, यह वही बात है।
जोड़े
अंत में यह हमेशा पता या क्यू/A साइटों पर कुछ सामान्य मानव की समस्याओं के लिए गहरी जांच करना बेहतर है ... जी ++ में द्वारा बनाया गया कोड में फर्क सिर्फ इतना है() और कोई() मामलों,
movl $0, (%eax) fldz fstpl 4(%eax)
जो एक टुकड़ा है कि 0/0.0 पूर्णांक और struct के दोहरे को initializes है ... इसलिए सेमुर जानता है कि यह बेहतर है (लेकिन मैं इसे अगर मैं था जानने के बिना की खोज की जा सकता था पहले एएसएम पर एक नज़र डालें!)
ब्रैकेट का उपयोग करने का कोई अर्थ नहीं है, यह डिफ़ॉल्ट कन्स्ट्रक्टर का आह्वान कर रहा है। यदि कुछ भी हो, तो माता-पिता की कमी का कोई मतलब नहीं है। – Salgar
आप क्या कह रहे हैं? यह एक परीक्षण है, प्रश्न के लिए व्यावहारिक और तथ्य यह है कि foo() आमतौर पर एक समारोह/विधि के लिए एक कॉल का मतलब है; चश्मा पढ़ने के बजाए एक बहुत उपयोगी परीक्षण नहीं, यह एक संभावित आलोचक होता। आपकी टिप्पणी का मतलब मेरे लिए कुछ भी नहीं है। – ShinTakezou
संबंधित प्रश्न पर ध्यान दें [बिना किसी तर्क के कन्स्ट्रक्टर को कॉल करने के लिए ब्रैकेट के खाली सेट का उपयोग करने में त्रुटि क्यों है?] (Http://stackoverflow.com/questions/180172/why-is-it-an- त्रुटि के लिए उपयोग-एक खाली-सेट-कोष्ठक करने की-फोन-ए-निर्माता-साथ-कोई)। – Troubadour