2011-03-18 16 views

उत्तर

14

आपके उदाहरण के संदर्भ में कोई अंतर नहीं है (int प्रकार का उपयोग करके)। हालांकि, यदि आपको कंपाउंड प्रकारों की ऑब्जेक्ट्स बनाने की आवश्यकता है, तो आपको एक अंतर है, जहां आपको कोष्ठक संस्करण का उपयोग करने की आवश्यकता है। अर्थात:

int (**fn_ptr_ok)() = new (int (*[10])()); // OK 
int (**fn_ptr_err)() = new int (*[10])(); // error 
+0

यह कार्य करने के लिए 10 पॉइंटर्स की सरणी है (जो int वापस आती है और कोई तर्क नहीं लेती)। इसे देखें: http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html – sinek

10

इस विशेष मामले के लिए, कोई अंतर नहीं। दोनों एक ही हैं। बस उस पहले वाक्यविन्यास का शायद ही कभी उपयोग किया जाता है, शायद क्योंकि यह असुविधाजनक और गुप्त दिखता है, और अधिक टाइपिंग की आवश्यकता होती है!

2

इस प्रश्न के मामले में, इन दो new के अर्थ समान हैं। व्याकरणिक रूप से, पूर्व प्रारूप new() का ऑपरेंड टाइप-आईडी, है और बाद वाला ऑपरेंड नया-प्रकार-आईडी है। नए-प्रकार-आईडी के लिए, यदि (....) ऑपरेंड के पीछे दिखाई देता है, तो यह कन्स्ट्रक्टर की तर्क सूची के रूप में व्याख्या किया गया है। यही है, अगर हम new int(1) लिखते हैं, तो int को 1 में प्रारंभ किया गया है, दूसरी ओर, टाइप-आईडी के लिए, यदि (....) प्रकट होता है, तो यह प्रकार का एक हिस्सा है। उदाहरण के लिए, जब हम new फ़ंक्शन के लिए पॉइंटर करते हैं, तो हमें new(type-id) फ़ॉर्म का उपयोग करना होगा। उदाहरण के लिए, new(int(*)()) के रूप में।

+1

मुझे लगता है कि मैं समझ गया कि आप क्या कहने की कोशिश कर रहे थे। मुझे अपने मन पढ़ने के कौशल पर गर्व है। – log0

6

जब आप एक गतिशील सरणी

int n = 2; 
int *p = new int[n]; // valid 
int *q = new (int[n]); // invalid 

parenthesized संस्करण एक निरंतर आकार की आवश्यकता है बनाना चाहते हैं, वहाँ एक और अंतर है।

+1

दूसरे के लिए, आपको अभी भी 'हटाएं []', हाँ का उपयोग करने की आवश्यकता है? –

+0

@ चार्ल्स हां आपको 'हटाएं [] 'का उपयोग करने की आवश्यकता है। –

+0

इसलिए यदि 'n' स्थिर है, तो दूसरा एक ऑब्जेक्ट (नहीं n) के लिए स्थान आवंटित करने के बराबर है, जिसमें 'int arr [n]' के समान प्रकार है? सही? – UmmaGumma

1

(वास्तव में एक जवाब है, लेकिन मैं इस एक टिप्पणी में नहीं डाल सकते)

इसके और भी अधिक है क्योंकि "नया स्थान" के जटिल: http://codepad.org/pPKt31HZ

#include <stdio.h> 

void* operator new(size_t N, int x) { 
    return new char[N]; 
} 

int main(void) { 
    int x = int(); 
    int* a = new(int()) int; 
} 

यहाँ अपनी दिलचस्प है कि जीसीसी इसे स्वीकार करता है, लेकिन एमएस/इंटेल नहीं।

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