2010-06-01 11 views
7

मैं एक struct कि इस तरह दिखता है (एक पॉड) है कहते हैं:डिफ़ॉल्ट सी में struct प्रारंभ ++

struct Foo 
{ 
    int i; 
    double d; 
}; 

क्या निम्नांकित दो पंक्तियों के बीच मतभेद हैं:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

संबंधित प्रश्न पर ध्यान दें [बिना किसी तर्क के कन्स्ट्रक्टर को कॉल करने के लिए ब्रैकेट के खाली सेट का उपयोग करने में त्रुटि क्यों है?] (Http://stackoverflow.com/questions/180172/why-is-it-an- त्रुटि के लिए उपयोग-एक खाली-सेट-कोष्ठक करने की-फोन-ए-निर्माता-साथ-कोई)। – Troubadour

उत्तर

12

पहला व्यक्ति मूल्यों को अनियंत्रित करता है; दूसरा उन्हें शून्य तक शुरू करता है। यह केवल पीओडी प्रकारों के मामले में है, जिनके पास कोई कन्स्ट्रक्टर नहीं है।

+0

धन्यवाद! क्या यह एकमात्र अंतर है? – criddell

+5

हां, यह एकमात्र अंतर है। –

+0

और यदि मुझे गलत नहीं लगता है, तो यह केवल मानक के कुछ नए संशोधन (2003?) में जोड़ा गया था – Suma

-2

प्रति लिंक मैं की तैनाती।

सी ++ में कक्षा और संरचना के बीच एकमात्र अंतर यह है कि वर्ग-सदस्य डिफ़ॉल्ट रूप से निजी होते हैं, जबकि संरचना-सदस्य सार्वजनिक रूप से डिफ़ॉल्ट होते हैं। तो संरचनाओं में रचनाकार हो सकते हैं, और वाक्यविन्यास कक्षाओं के समान ही है।

Struct Constructor Info

+1

बिंदु नई वस्तुओं का निर्माण करते समय घुमावदार ब्रैकेट का उपयोग या चूक है। सवाल कक्षाओं के साथ ही structs पर लागू होता है। – Troubadour

1

मैं कुछ भी नहीं लगता है। 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 है ... इसलिए सेमुर जानता है कि यह बेहतर है (लेकिन मैं इसे अगर मैं था जानने के बिना की खोज की जा सकता था पहले एएसएम पर एक नज़र डालें!)

+0

ब्रैकेट का उपयोग करने का कोई अर्थ नहीं है, यह डिफ़ॉल्ट कन्स्ट्रक्टर का आह्वान कर रहा है। यदि कुछ भी हो, तो माता-पिता की कमी का कोई मतलब नहीं है। – Salgar

+0

आप क्या कह रहे हैं? यह एक परीक्षण है, प्रश्न के लिए व्यावहारिक और तथ्य यह है कि foo() आमतौर पर एक समारोह/विधि के लिए एक कॉल का मतलब है; चश्मा पढ़ने के बजाए एक बहुत उपयोगी परीक्षण नहीं, यह एक संभावित आलोचक होता। आपकी टिप्पणी का मतलब मेरे लिए कुछ भी नहीं है। – ShinTakezou

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