2016-09-29 7 views
5

यह एक हालिया टी/एफ प्रश्न था जो मेरे सीएस पाठ्यक्रम में आया था कि मुझे थोड़ा उलझन में मिला।क्या मैं ऑपरेटर को अधिभारित किए बिना किसी ऑब्जेक्ट के मान किसी अन्य ऑब्जेक्ट को असाइन करने के लिए = ऑपरेटर का उपयोग कर सकता हूं?

पाठ्यपुस्तक कहता है:

= ऑपरेटर किसी अन्य वस्तु के लिए एक वस्तु के डेटा आवंटित करने के लिए, या किसी अन्य वस्तु के डेटा के साथ एक वस्तु को प्रारंभ करने के लिए इस्तेमाल किया जा सकता है। डिफ़ॉल्ट रूप से, एक ऑब्जेक्ट के प्रत्येक सदस्य को अन्य ऑब्जेक्ट में इसके समकक्ष में कॉपी किया जाता है।

सवाल शब्दशः था:

आप = ऑपरेटर का उपयोग नहीं कर सकते हैं किसी अन्य वस्तु के लिए एक वस्तु के मूल्यों आवंटित करने के लिए जब तक आप ऑपरेटर को ओवरलोड। टी/एफ?

पाठ्यपुस्तक के उस विशेष अनुच्छेद से निर्णय लेने के बाद, मैंने झूठी उत्तर दिया। हालांकि, यह पता चला कि प्रश्नोत्तरी उत्तर वास्तव में सच था।

जब मैंने ऑनलाइन प्रश्न देखा, तो मैंने अन्य स्रोतों को उत्तर को "झूठी" के रूप में भी सूचीबद्ध किया। अनुमोदित, ये सिर्फ सामान्य फ्लैशकार्ड/प्रश्नोत्तरी वेबसाइटें थीं, इसलिए मैं उनमें अधिक स्टॉक नहीं डालता हूं।

असल में, मैं सिर्फ उत्सुक हूं कि वास्तविक उत्तर भविष्य के अध्ययन उद्देश्यों के लिए क्या है।


पुनश्च: पाठ्यपुस्तक बाद में राज्य के लिए पर चला जाता है: "आदेश रास्ता असाइनमेंट ऑपरेटर काम करता है, यह अतिभारित किया जाना चाहिए बदलने के लिए ऑपरेटर परमिट आप अधिक भार एक मौजूदा ऑपरेटर के व्यवहार को फिर से परिभाषित करने के लिए जब एक वर्ग के साथ प्रयोग किया। वस्तु। "

मुझे लगता है कि यह "सत्य" उत्तर से संबंधित है और इसका समर्थन करता है, लेकिन मुझे सच में यकीन नहीं है।

+1

:

अधिक संदर्भ देखें

। –

+5

प्रश्नोत्तरी लेखक अप goofed, शिकायत करते हैं। –

उत्तर

2

बयान

आप किसी अन्य वस्तु के लिए एक वस्तु के मूल्यों आवंटित करने के लिए जब तक आप ऑपरेटर को ओवरलोड = ऑपरेटर का उपयोग नहीं कर सकते।

और नरकिप; मामूली रूप से झूठा है, क्योंकि आप उदा। एक int चर। एक वस्तु कौन सा है। सी ++ में।

संभवतः वे “ कक्षा-प्रकार ऑब्जेक्ट ” लिखने का इरादा रखते थे, लेकिन यहां तक ​​कि यह भी गलत है। जैसे कोई भी पीओडी (सादा पुराना डेटा) वर्ग प्रकार ऑब्जेक्ट असाइन करने योग्य है और एक ओवरलोडेड असाइनमेंट ऑपरेटर की कमी है।

हालांकि, ऐसे मामले हैं जहां आप चाहते हैं या असाइनमेंट को निषिद्ध करने या चार्ज करने की आवश्यकता है।

2

आप असाइनमेंट ऑपरेटर खुद को लागू नहीं करते हैं, संकलक आप के लिए एक है, जो गंतव्य के लिए स्रोत से डेटा कॉपी कर देंगे उत्पन्न होगा, अपने वर्ग के सदस्यों का काम ऑपरेटरों लागू जहां आवश्यक संभव /।

यह आपकी कक्षा उदा। const सदस्य हैं, और यह वांछित परिणाम नहीं देता है यदि आपकी कक्षा में गतिशील आवंटित वस्तुओं को पॉइंटर्स शामिल हैं।

तो, मैं यह भी कहूंगा कि कथन गलत है।

1

यह एक चाल सवाल है। वाक्य रचनात्मक उत्तर "झूठा" है लेकिन अर्थपूर्ण उत्तर "शायद" है।

struct Foo 
{ 
    int a; 
    double b; 
}; 

Foo foo1; 
Foo foo2; 
foo2 = foo1; // Ok in both senses. 

struct Bar 
{ 
    Bar() : arr(new int[20]) {} 
    ~Bar() { delete [] arr; } 
    int* arr; 
}; 

Bar bar1; 
Bar bar2; 
bar2 = bar1; // Ok in syntax not in semantics 
       // This will lead to UB 
0

आप किसी अन्य वस्तु के लिए एक वस्तु के मूल्यों आवंटित करने के लिए जब तक आप ऑपरेटर को ओवरलोड = ऑपरेटर का उपयोग नहीं कर सकते। टी/एफ?

उत्तर: एफ

आप बिना अधिक भार = ऑपरेटर किसी अन्य वस्तु के लिए एक वस्तु के मूल्यों असाइन कर सकते हैं डिफ़ॉल्ट रूप से संकलक के रूप में, नीचे के लिए

  • को छोड़कर सभी मामले में वर्ग के लिए असाइनमेंट ऑपरेटर को परिभाषित करता है आप स्पष्ट रूप से एक प्रति-असाइनमेंट ऑपरेटर घोषित किया है (कक्षा एक्स के लिए ऑपरेटर = एक्स, एक्स & या कॉन्स एक्स &))
  • आपकी कक्षा में एक सदस्य है जो असाइन करने योग्य नहीं है (जैसे कि एक संदर्भ, एक स्थिरांक वस्तु या नहीं या दुर्गम असाइनमेंट ऑपरेटर)

लेकिन आप को समझने के लिए क्यों यह तो आप उपयोगकर्ता निर्धारित सदस्यों हो रही है या गतिशील स्मृति आवंटन होने के मामले में असाइनमेंट ऑपरेटर ओवरलोड अनिवार्य हो जाता है की जरूरत के साथ एक वर्ग है, तो इसकी बेहतर प्रकार के लिए operator= ओवरलोड के लिए इस उथले और गहरी प्रतिलिपि

1

की अवधारणा को पढ़ C++ में, जब User-Defined Typesclass और struct जैसे शामिल हैं। का उपयोग class या struct के ऑब्जेक्ट के साथ Shallow Copy शामिल होगा। Shallow Copy कभी-कभी अपरिभाषित व्यवहार का कारण बनता है जब class या struct ऑब्जेक्ट्स में गतिशील रूप से उनके अंदर स्मृति आवंटित की जाती है।

उचित class के लिए operator= ओवरलोडिंग और struct प्रकार Deep Copy जो एक वस्तु ObjA बताए की सही विधि आपत्ति उठाने ObjB (ObjB = ObjA) जब ObjA और ObjB कुछ class या struct की वस्तुओं रहे हैं और गतिशील रूप से उन्हें अंदर स्मृति आवंटित होते है को बढ़ावा मिलेगा ।

= ऑपरेटर का उपयोग किसी ऑब्जेक्ट के डेटा को किसी अन्य ऑब्जेक्ट को असाइन करने के लिए या किसी ऑब्जेक्ट को किसी ऑब्जेक्ट के डेटा के साथ प्रारंभ करने के लिए किया जा सकता है। डिफ़ॉल्ट रूप से, एक ऑब्जेक्ट के प्रत्येक सदस्य को अन्य ऑब्जेक्ट में इसके समकक्ष में कॉपी किया जाता है। यह सच है जब class/struct की वस्तु केवल स्थिर मौलिक इसके अंदर डेटा का प्रकार है। इधर,

  • द्वारा स्थिर इसका मतलब है कि वस्तु के सभी स्मृति आवश्यकता केवल संकलन समय पर तय हो गई है।

आप डिफ़ॉल्ट उपयोग नहीं कर सकते = ऑपरेटर, किसी अन्य वस्तु के लिए एक वस्तु के मूल्यों आवंटित करने के लिए जब तक आप ऑपरेटर को ओवरलोड। यह सच है जब class/struct का उद्देश्य कुछ गतिशील स्मृति आवंटित इसके अंदर, संभवतः pointers का उपयोग करके किया है। What is the difference between a deep copy and a shallow copy?

वर्तमान मानक इस ऑपरेटर डिफ़ॉल्ट रूप से संकलक द्वारा उत्पन्न हो जाएगा के साथ
संबंधित मुद्दे

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