2012-05-25 19 views
7
निर्धारित नहीं करता है

मेरे कोड:निर्माता सदस्य चर

#include <iostream> 
using namespace std; 

class Foo 
{ 
public: 
    int bar; 

    Foo() 
    { 
     bar = 1; 
     cout << "Foo() called" << endl; 
    } 

    Foo(int b) 
    { 
     bar = 0; 
     Foo(); 
     bar += b; 
     cout << "Foo(int) called" << endl; 
    } 
}; 

int main() 
{ 
    Foo foo(5); 
    cout << "foo.bar is " << foo.bar << endl; 
} 

उत्पादन:

Foo() called 
Foo(int) called 
foo.bar is 5 

क्यों foo.bar मूल्य 6 नहीं है? Foo() कहा जाता है लेकिन bar से 1 पर सेट नहीं करता है क्यों?

+4

'फू() नहीं करना पड़ेगा,' एक बनाता है अज्ञात अस्थायी वस्तु और तुरंत इसे नष्ट कर देता है। यह क्या है कि आप _expected_ होने के लिए? – ildjarn

उत्तर

12

निम्नलिखित निर्माता में, Foo() के साथ लाइन पिछले निर्माता प्रतिनिधि नहीं है। इसके बजाय, यह प्रकार Foo का एक नया अस्थायी वस्तु, *this से संबंधित नहीं पैदा करता है।

Foo(int b) 
{ 
    bar = 0; 
    Foo(); // NOTE: new temporary instead of delegation 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

निर्माता प्रतिनिधिमंडल इस प्रकार काम करता है:

Foo(int b) 
    : Foo() 
{ 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

हालांकि, इस के साथ सी ++ 11 ही संभव है।

+0

+1 टिप्पण "तभी संभव सी ++ 11 के साथ" के लिए -> http://meta.stackexchange.com/q/133642/186397। – Drise

2

क्योंकि आप निर्माता में इस लाइन है:

bar = 0; 

आप दूसरे निर्माता में Foo() कॉल के साथ अन्य निर्माता कॉल करने के लिए कोशिश कर रहे हैं, लेकिन यह सिर्फ एक अस्थायी Foo उदाहरण पैदा करता है।

3

आप साधारण कार्यों की तरह निर्माता का उपयोग नहीं कर सकते हैं। आपके कोड कॉलिंग में Foo() स्टैक में एक नई वस्तु बनाता है।

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