दिलचस्प पोस्ट
घुमाए गए UIImageView के लिए कोई त्वरित और गंदे एंटी-अलायसिंग तकनीक? मैं विंडोज डेवलपमेंट मशीन का इस्तेमाल करके आईफोन के लिए कैसे विकसित कर सकता हूं? एंड्रॉइड और एक्सएमपीपी: वर्तमान में उपलब्ध समाधान फॉर्मों के बीच परस्पर क्रिया – किसी अन्य रूप से फ़ॉर्म का नियंत्रण कैसे बदल सकता है? एंड्रॉइड सभी संपर्क सूची (नाम, ईमेल, फोन) को लेकर करीब 700 संपर्कों के लिए एक मिनट लेता है फ़्लोटिंग पॉइंट / गोलाई त्रुटि का एक सरल उदाहरण क्या है? मैं jQuery में पृष्ठभूमि छवि आकार कैसे प्राप्त करूं? यदि कोई AngularJS टेम्पलेट्स में बयान ActiveMQ या RabbitMQ या ZeroMQ या आरवीएम स्थापना काम नहीं कर रहा है: "आरवीएम एक फ़ंक्शन नहीं है" वेब पेज से एक EXE लॉन्च कैसे करें (asp.net) डाटाबेस बनाम फाइल सिस्टम में फ़ाइलों को संग्रहीत करना टेम्पलेट सीमा C ++ क्या खुला स्रोत सी ++ स्थिर विश्लेषण उपकरण उपलब्ध हैं? पीएचपी – डीबगिंग कर्ल

बिना नया बनाम एक वस्तु का प्रयोग करने में अंतर क्या है

सी ++ में,

गतिशील स्मृति आवंटन के अलावा, कोड के निम्नलिखित दो पंक्तियों के बीच एक कार्यात्मक अंतर है:

Time t (12, 0, 0); //t is a Time object Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object 

मैं यह मानता हूं कि एक समय (int, int, int) ctor को परिभाषित किया गया है। मुझे यह भी एहसास है कि दूसरे मामले में टी को हटा दिया जाना चाहिए क्योंकि इसे ढेर पर आवंटित किया गया था। क्या कोई और अंतर है?

वेब के समाधान से एकत्रित समाधान "बिना नया बनाम एक वस्तु का प्रयोग करने में अंतर क्या है"

रेखा:

 Time t (12, 0, 0); 

… स्थानीय स्कोप में आमतौर पर स्टैक पर टाइप Time का एक चर, आवंटित करता है, जो कि इसका दायरा समाप्त होने पर नष्ट हो जाएगा।

इसके विपरीत:

 Time* t = new Time(12, 0, 0); 

… स्मृति के एक ब्लॉक को या तो ::operator new() या Time::operator new() फोन करके, और बाद में this सेट के साथ Time::Time() उस मेमोरी ब्लॉक के भीतर एक पते पर कॉल करता है (और इसे वापस भी लौटाता है) new के परिणाम), जो तब t में संग्रहीत है जैसा कि आप जानते हैं, यह आम तौर पर ढेर (डिफ़ॉल्ट रूप से) पर किया जाता है और यह आवश्यक है कि आप इसे कार्यक्रम में बाद में delete दें, जबकि t में सूचक आमतौर पर स्टैक पर संग्रहीत किया जाता है।

एक और स्पष्ट अंतर तब होता है जब टी के चर और तरीकों तक पहुंचते हैं

 Time t (12, 0, 0); t.GetTime(); Time* t = new Time(12, 0, 0); t->GetTime(); 

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

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

ढेर पर इसे आवंटित करने और इसे ढेर पर आवंटित करने के बीच वस्तु के लिए कोई कार्यात्मक अंतर नहीं है। दोनों ऑब्जेक्ट के कन्स्ट्रक्टर को आमंत्रित करेंगे।

संयोग से मैं सुझाव देता हूं कि आप बूस्ट के साझा एपीटीआर या स्कॉपीडीपीटीआर का प्रयोग करते हैं जो ढेर पर आवंटित करते समय कार्यात्मक रूप से भी समतुल्य होता है (गैर-प्रतिलिपिनीय पॉइंटरों की प्रतिलिपि बनाने से आप को रोकने के लिए स्कोप_पीटीआर की अतिरिक्त उपयोगिता के साथ):

 scoped_ptr<Time> t(new Time(12, 0, 0)); 

नहीं .. कोई और अंतर नहीं है ..

आप पहले से ही क्या जानते हैं, इसमें कोई दूसरा अंतर नहीं है

मान लें कि आपका कोड डिफ़ॉल्ट ऑपरेटर की नई सेवा का उपयोग कर रहा है।

  • नया प्रयोग करें: गतिशील स्मृति प्राप्त करने के लिए ऑपरेटर को नया कॉल करें, और फिर कंट्रोलर फ़ंक्शन को कॉल करने के लिए।
  • नए का उपयोग न करें: ऑपरेटर को नया फ़ंक्शन कॉल नहीं करेंगे, बस सीधे कंट्रोलर फ़ंक्शन पर कॉल करने के लिए। स्टैक सीधे इस्तेमाल किया जाएगा, malloc के लिए कोई फायदा नहीं।
 void foo (Time t) { t = Time(12, 0, 0); } void bar (Time* t) { t = new Time(12, 0, 0); } int main(int argc, char *argv[]) { Time t; foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. bar(&t);//t is (12,0,0) return 0; }