'नए ऑपरेटर' और 'ऑपरेटर नए' के ​​बीच अंतर?


126

"नया ऑपरेटर" और "ऑपरेटर नया" के बीच अंतर क्या है?


3
नमस्ते, क्या आप कृपया प्रश्न को स्पष्ट कर सकते हैं? लगता है कहीं टाइपो है।
दीमा मालेंको

17
प्रश्न सही ढंग से लिखा गया है, नीचे उत्तर देखें। मेमोरी को गतिशील रूप से आवंटित करने के लिए विधि newऑपरेटर का उपयोग करना है। इस ऑपरेटर को ओवरलोड किया जा सकता है। डिफ़ॉल्ट ऑपरेटर और एक अधिभार संस्करण के बीच अंतर करने के लिए, डिफ़ॉल्ट को "नया ऑपरेटर" कहा जाता है और अतिभारित संस्करण को "ऑपरेटर नया" कहा जाता है।
थॉमस मैथ्यूज

2
उसको कैसे करे। मैं नया और अनजान हूँ।
संदीप

जवाबों:


127

मैं आमतौर पर दोनों के बीच अंतर करने के लिए चीजों को अलग-अलग शब्दों में बताने की कोशिश करता हूं, लेकिन यह किसी भी मामले में एक अच्छा सवाल है।

ऑपरेटर नया एक फ़ंक्शन है जो कच्ची मेमोरी को आवंटित करता है - कम से कम वैचारिक रूप से, यह बहुत अलग नहीं है malloc()। हालांकि यह काफी असामान्य है जब तक कि आप अपने कंटेनर की तरह कुछ नहीं लिख रहे हैं, आप ऑपरेटर को सीधे नए कह सकते हैं, जैसे:

char *x = static_cast<char *>(operator new(100));

यह भी संभव है कि विश्व स्तर पर या एक विशिष्ट वर्ग के लिए ऑपरेटर को अधिभारित किया जाए। IIRC, हस्ताक्षर है:

void *operator new(size_t);

बेशक, यदि आप एक ऑपरेटर नए (या तो वैश्विक या एक वर्ग के लिए) को अधिभारित करते हैं, तो आप मिलान ऑपरेटर को भी हटाने के लिए / चाहते हैं। जो इसके लायक है, उसके लिए एक अलग ऑपरेटर नया [] है जो सरणियों के लिए मेमोरी आवंटित करने के लिए उपयोग किया जाता है - लेकिन आप उस पूरी गड़बड़ को पूरी तरह से अनदेखा करने से लगभग निश्चित रूप से बेहतर हैं।

नया ऑपरेटर वह है जो आप सामान्य रूप से फ्री स्टोर से ऑब्जेक्ट बनाने के लिए उपयोग करते हैं:

my_class *x = new my_class(0);

दोनों के बीच अंतर यह है कि ऑपरेटर नया केवल कच्ची मेमोरी आवंटित करता है, और कुछ नहीं। नया ऑपरेटर मेमोरी को आवंटित करने के लिए ऑपरेटर नए का उपयोग करके शुरू करता है, लेकिन फिर यह निर्माता को सही प्रकार की वस्तु के लिए आमंत्रित करता है, इसलिए परिणाम उस मेमोरी में बनाई गई एक वास्तविक लाइव ऑब्जेक्ट है। यदि उस ऑब्जेक्ट में कोई अन्य ऑब्जेक्ट्स (या तो एम्बेडेड या बेस क्लासेस के रूप में) हैं, तो उन कंस्ट्रक्टर्स को भी इनवोक किया गया है।


18
+1, एक अलग वाक्यांश के रूप में, मानक चारों ओर नई अभिव्यक्ति का उपयोग करता है , और केवल एक बार कॉल के स्थान को संदर्भित करने के लिए नए ऑपरेटर का उपयोग करता है । मैं ऐसा ही करता हूं: आवंटनकर्ता के लिए ऑपरेटर नया और उपयोग के लिए नई अभिव्यक्ति
डेविड रॉड्रिग्ज - dribeas

3
एक नई अभिव्यक्ति पूरे वाक्यांश है जो नए के साथ शुरू होती है। तो क्या आप इसे का सिर्फ "नया" हिस्सा कहते हैं? यदि यह कहना गलत है कि नया ऑपरेटर है, तो हमें साइज़ोफ़ ऑपरेटर को "साइज़ोफ़" नहीं कहना चाहिए, या ऑपरेटर का पता-पता (जब यह एक जैसा व्यवहार करता है)।
काज

1
काज़ की टिप्पणी के बाद, शायद यह सवाल फिर से पूछा जाना चाहिए कि नए ऑपरेटर और ऑपरेटर के नए ऑपरेटर के बीच अंतर क्या है? :)
CS

2
"ऑपरेटर नया" बनाम "नया कीवर्ड"
user997112

2
@antred: आप ऐसा कुछ के साथ जारी करेंगे operator delete(x);
जेरी कॉफिन

35

"ऑपरेटर नया"

class Foo
{
public:
        void* operator new( size_t );
}

"नया ऑपरेटर":

Foo* foo = new Foo();

इस उदाहरण में, new Foo()कॉलFoo::operator new()

दूसरे शब्दों में, "नया ऑपरेटर" कॉल करता है " operator new()" जैसे कि + ऑपरेटर कॉल करता हैoperator +()


13
newC ++ में ऑपरेटर नहीं है। sizeofउदाहरण के लिए, एक ऑपरेटर है, लेकिन newऔर deleteनहीं कर रहे हैं। newऔर deleteखोजशब्द और वाक्य रचना हैं जो इन खोजशब्दों के फार्म को नई अभिव्यक्ति और विलोप-अभिव्यक्ति कहते हैं
एनटी

2
उह, कुछ भी करता है, तो, sizeofवाक्यात्मक निर्माण है, और newऔर deleteदोनों वैध, कानूनी, अधिभार करने योग्य ऑपरेटरों रहे हैं। मैंने जो कुछ भी देखा है, उसमें से newऔर deleteदोनों ही ऑपरेटर हैं। देखें [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
ऑस्टिन हाइड

7
गलत। आधिकारिक C ++ शब्दावली भाषा विनिर्देश द्वारा परिभाषित शब्दावली है, कुछ वेब साइट द्वारा नहीं। भाषा विनिर्देश में "नए ऑपरेटर" के रूप में ऐसा कोई थर्म नहीं है, लेकिन " operator newफ़ंक्शन" के रूप में ऐसा शब्द है । फिर से, sizeofस्पष्ट रूप से, एक "ऑपरेटर" कहा जाता है, जबकि है newऔर deleteकर रहे हैं कभी नहीं ऑपरेटरों के रूप में भेजा।
एनटी

6
एंड्रीटी: गलत। C ++ मानक 'नया' को ऑपरेटर कहता है, 13.5 / 1 देखें।

3
@AndreyT: मैंने सोचा था कि के रूप में आप ऐसा करेंगे, कि ऑपरेटर नया था एलोकेटर और नई अभिव्यक्ति का उपयोग करता है। मैंने समीक्षा की और जाँच की कि §5.3.4 / 3 में वर्तमान मानक नए ऑपरेटर शब्द का उपयोग करता है । बाद में ator5.3.4 / 8 में यह ऑपरेटर के नए और ऑपरेटर के
डेविड रॉड्रिग्ज़ - dribeas

22

स्कॉट मेयर्स की अधिक प्रभावी C ++ पुस्तक के उद्धरण इस प्रकार हैं:

नया ऑपरेटर अपेक्षित मेमोरी आवंटन करने के लिए एक फ़ंक्शन को कॉल करता है, और आप उसके व्यवहार को बदलने के लिए उस फ़ंक्शन को फिर से लिखना या अधिभार कर सकते हैं। मेमोरी को आवंटित करने के लिए नए ऑपरेटर कॉल फ़ंक्शन का नाम ऑपरेटर नया है।


7
यह शब्द स्पष्ट रूप से पुस्तक के लेखक (या, शायद, कुछ अप्रचलित स्रोत से उधार लिया गया है) द्वारा आविष्कार किया गया है। औपचारिक सी ++ नामकरण में "नए ऑपरेटर" के रूप में ऐसा कोई शब्द नहीं है।
एनटी

2
@AndreyT: मैंने "नए ऑपरेटर" के लिए C ++ 11 की खोज की और इसे चार स्थानों पर संदर्भित किया। विशेष रूप से, "प्लेसमेंट नए ऑपरेटर" के दो संदर्भ
मूइंग डक

11

"नया ऑपरेटर" और "ऑपरेटर नया" के बीच कोई अंतर नहीं है। दोनों एक ही बात को संदर्भित करते हैं: अधिभार / बदली operator newफ़ंक्शन जो आम तौर पर नए-भावों द्वारा बनाई गई वस्तुओं के लिए कच्ची मेमोरी आवंटन करता है ।

ध्यान दें कि भाषा विनिर्देश में कोई भी शब्द मौजूद नहीं है (जो आधिकारिक शब्दावली का परिभाषित स्रोत है)।

जब आप newकिसी वस्तु को बनाने के लिए अपने कार्यक्रम में उपयोग करते हैं, तो इसे नई-अभिव्यक्ति कहा जाता है । नई-अभिव्यक्ति में कीवर्ड newऔर व्याकरण द्वारा परिभाषित अतिरिक्त सिंटैक्टिक भाग होते हैं । इस अभिव्यक्ति के सिंटैक्स का कोई भी हिस्सा कभी भी "ऑपरेटर" के रूप में संदर्भित नहीं होता है।

कच्चे मेमोरी आवंटन फ़ंक्शन operator newको आधिकारिक तौर पर सिर्फ " operator newफ़ंक्शन" के रूप में संदर्भित किया जाता है । ध्यान दें कि शब्द operatorऔर newइस क्रम में केवल दो अलग-अलग C ++ भाषा कीवर्ड हैं। वे एक अंग्रेजी शब्द "ऑपरेटर नया" नहीं बनाते हैं। भाषा विनिर्देश में कहीं भी आपको अंग्रेजी शब्द के रूप में "ऑपरेटर नया" का कोई संदर्भ नहीं मिलेगा। हर बार यह सिर्फ दो स्वतंत्र कीवर्ड का एक संयोजन है जो मेमोरी आवंटन फ़ंक्शन के लिए घोषणा सिंटैक्स का उत्पादन करता है।

फिर से, फिर से शुरू करें: औपचारिक रूप से C ++ में "ऑपरेटर नया" या "नया ऑपरेटर" जैसी कोई अंग्रेजी भाषा की शर्तें नहीं हैं। पूर्व अनुक्रम भाषा विनिर्देश में कीवर्ड के संयोजन के रूप में मौजूद है, अंग्रेजी शब्द के रूप में नहीं। उत्तरार्द्ध बिल्कुल मौजूद नहीं है।


14
आप कुछ पांडित्यपूर्ण मानसिक-हस्तमैथुन में खोए हुए लगते हैं। मानक धब्बों में अस्पष्ट है, और यह उनमें से एक है। यह "नए ऑपरेटर पर चर्चा" करने के लिए बस उतना ही समझ में आता है जितना "प्लस ऑपरेटर पर चर्चा करना" या "ऑपरेटर से चर्चा करना"।

7

जब आप एक नया ऑब्जेक्ट बनाते हैं, तो मेमोरी को ऑपरेटर नए का उपयोग करके आवंटित किया जाता है फिर निर्माणकर्ता को मेमोरी को इनिशियलाइज़ करने के लिए आमंत्रित किया जाता है । नए ऑपरेटर दोनों आवंटन और initialisation, जहां के रूप में ऑपरेटर नया केवल आवंटन करता है।


6

ओपी का प्रश्न ठीक से वर्णित नहीं है। 'ऑपरेटर नई' और 'नई अभिव्यक्ति' के बीच अंतर के रूप में बेहतर है? नोट 'ऑपरेटर नया' अक्सर 'ऑपरेटर नए फ़ंक्शन' को भी संदर्भित करता है।

और चारों ओर बहुत सही उत्तर हैं, नीचे मेरा है:

1> 'नई अभिव्यक्ति' कॉल 'ऑपरेटर नया' कच्ची मेमोरी आवंटित करने के लिए, फिर निर्माता को कॉल करें

apple * p = new apple(); //new expression

2> 'ऑपरेटर नया' केवल कच्ची मेमोरी को आवंटित करता है, मॉलोक से ज्यादा अंतर नहीं

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.

2

नया ऑपरेटर : C ++ नए ऑपरेटर का उपयोग करके वस्तुओं के गतिशील आवंटन का समर्थन करता है। नया ऑपरेटर पूल से वस्तुओं के लिए मेमोरी आवंटित करता है जिसे फ्री स्टोर कहा जाता है। नया ऑपरेटर विशेष फ़ंक्शन ऑपरेटर को नया कहता है।

ऑपरेटर नया : यदि अनुरोध शून्य बाइट्स ऑफ़ स्टोरेज के लिए है, तो ऑपरेटर नया एक अलग ऑब्जेक्ट के लिए पॉइंटर लौटाता है (यानी ऑपरेटर को नए रिटर्न अलग-अलग पॉइंटर्स को बार-बार कॉल करता है)। यदि आवंटन अनुरोध के लिए अपर्याप्त मेमोरी है, ऑपरेटर नया रिटर्न भरता है या एक अपवाद फेंकता है। ऑपरेटर नया करने के लिए पहला तर्क size_t (STDDEF.H में परिभाषित एक प्रकार) होना चाहिए, और रिटर्न प्रकार हमेशा शून्य है *।

यहाँ अधिक विवरण के लिए एक MSDN लिंक है:

ऑपरेटर नया फ़ंक्शन

नया संचालक


1
थोड़ा स्पष्टीकरण: गैर-प्लेसमेंट ऑपरेटर नया हमेशा आवंटन की विफलता (मानक के अनुसार) पर फेंकना चाहिए; और प्लेसमेंट फॉर्म, जैसे ::new(std::nothrow), या तो कर सकते हैं (वह विशिष्ट उदाहरण एक अशक्त सूचक देता है)।

1
  1. नया एक ऑपरेटर होने के साथ-साथ एक कीवर्ड भी है।

    देखें [१] २.१३ में और २.२२ में।

  2. नया दो काम करता है: T * t = new T (arg);

    1) ऑब्जेक्ट के लिए मेमोरी आवंटित करें: शून्य * ptr = ऑपरेटर नया (sizeof (T));

    // ऑपरेटर नया एक फ़ंक्शन है (सी में मॉलॉक की तरह), ऑपरेटर नहीं। (देखें [1] 3.7.4 में)। लेकिन आइटम 7 [2] ने कहा कि यह एक ऑपरेटर भी है। मेरी राय में, ऑपरेटर और फ़ंक्शन के बीच का अंतर छोटा है, और आप इसे देख सकते हैं जब आप याद करते हैं कि ओवरलोडिंग ऑपरेटर कार्यों द्वारा कार्यान्वित किया जाता है।

    // हम इस ऑपरेटर / फ़ंक्शन (ऑपरेटर नया) को ओवरलोड कर सकते हैं जो हम यहां चाहते हैं।

    2) आवंटित मेमोरी में ऑब्जेक्ट को इनिशियलाइज़ करें: ptr पर T :: T (arg) कॉल करें

    // केवल कंपाइलर ही ऐसा कर सकता है। न मैं, न तुम।

    // कंपाइलर सदस्य ऑब्जेक्ट्स के कंस्ट्रक्टर्स और बेस क्लास के कंस्ट्रक्टर को इनवॉइस करेगा यदि T उनके पास है। और यह आह्वान पुनरावर्ती है। केवल कंपाइलर ही ऐसा कर सकता है।

  3. इसलिए, ऑपरेटर नए नए मिशनों का हिस्सा है, और केवल इस भाग में हम कुछ कर सकते हैं।

    [१]: आईएसओ / आईईसी, एन ३६ ९ ०। http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [२]: मेयर्स, स्कॉट। प्रभावी सी ++, 3।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.