2011-09-10 17 views
5

में प्रारंभिक सूचियां मैंने सुना है कि कन्स्ट्रक्टर में प्रारंभिक सूचियों का उपयोग करने का लाभ यह होगा कि कक्षा प्रकार की वस्तुओं की कोई अतिरिक्त प्रतियां नहीं होंगी। लेकिन कक्षा टी कन्स्ट्रक्टर में निम्नलिखित कोड के लिए इसका क्या अर्थ है? अगर मैं असाइनमेंट पर टिप्पणी करता हूं और प्रारंभिक सूचियों का उपयोग करता हूं तो क्या अंतर होगा?कन्स्ट्रक्टर

#include <iostream> 
using std::cout; 
using std::endl; 
using std::ostream; 

class X { 

public: 

    X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {} 


    ~X() {} 

    X(const X& obj):x(obj.x), y(obj.y) {} 

    friend ostream& operator << (ostream &os, X &obj); 

private: 
    float x; 
    float y; 
}; 

ostream& operator << (ostream &os, X &obj) 
{ os << "x = " << obj.x << " y = " << obj.y; return os;} 

class T { 

public: 

    T(X &obj) : x(obj) { /* x = obj */ } 

    ~T() { } 

    friend ostream& operator << (ostream &os, T &obj); 

private: 

    X x; 

}; 

ostream& operator << (ostream &os, T &obj) 
{ os << obj.x; return os; } 

int main() 
{ 
    X temp_x(4.6f, 6.5f); 

    T t(temp_x); 

    cout << t << endl; 

} 
+0

सुनिश्चित नहीं हैं कि अगर प्रासंगिक अपने प्रश्न का है, लेकिन आप शायद चाहते हैं टी (एक्स स्थिरांक और obj)। –

+0

@ के-बॉलो: हाँ मैं भूल गया, धन्यवाद। – user767451

उत्तर

6

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

आपके उदाहरण में, यह अपेक्षाकृत सौम्य है (संकलक इसे अनुकूलित भी कर सकता है, मुझे लगता है)। लेकिन अन्य मामलों में, प्रारंभकर्ता सूची से बचना संभव नहीं है। कल्पना करें कि X में सार्वजनिक असाइनमेंट ऑपरेटर नहीं था।

+0

आह, मैं अपने कोड में प्रभाव को नोटिस करने के लिए अधिभारित असाइनमेंट ऑपरेटर फ़ंक्शन खो रहा था। मैंने कॉपी कन्स्ट्रक्टर के साथ उलझन में! – user767451

2
T(X &obj) : x(obj) {} 

, केवल करने के लिए तो obj से एक्स निर्माण नकल होगा, जबकि

T(X &obj){ x = obj; } 

एक डिफ़ॉल्ट एक्स का निर्माण करेगी obj से मूल्यों से बदल दें।

यदि आप सदस्य वस्तु बनाने का इरादा रखते हैं, तो आपको इसे प्रारंभिक सूची में करना चाहिए।

5

आप असाइनमेंट, तो का उपयोग करते हैं: डिफ़ॉल्ट
x हो जाएगा पहले &
का निर्माण तो obj साथ सौंपा।
x का निर्माण किया और obj साथ प्रारंभ किया जाएगा:

लागत, डिफ़ॉल्ट निर्माण + असाइनमेंट


आप सदस्य प्रारंभकर्ता सूची तो उपयोग करते हैं है।

लागत है, निर्माण केवल

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