2012-02-26 16 views
11

संभव डुप्लिकेट:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?कन्स्ट्रक्टर को क्यों नहीं कहा जाता है जब() का उपयोग ऑब्जेक्ट घोषित करने के लिए किया जाता है?

$ cat cons.cpp 
#include <iostream> 

class Matrix { 
private: 
    int m_count; 

public: 
    Matrix() { 
     m_count = 1; 
     std::cout << "yahoo!" << std::endl; 
    } 
}; 

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1();       // <---- 
    std::cout << "after" << std::endl; 
} 
$ g++ cons.cpp 
$ ./a.out 
before 
after 
$ 

वाक्य रचना Matrix m1(); क्या करता है?

मैं मानना ​​था कि यह Matrix m1; के समान है। जाहिर है मैं गलत हूँ।

उत्तर

12
Matrix m1(); // m1 is a function whose return type is Matrix. 

इसके अलावा यह सी ++ एफएक्यू लाइट एंट्री उपयोगी होनी चाहिए।

Is there any difference between List x; and List x();

+1

@Lazer: अपने आप को समझाने के लिए, (उदाहरण के पहुँचने के m1.m_count के लिए) एम 1 ... – Francesco

+0

उपयोग करने के लिए सी ++ 11 आप ब्रेसिज़ उपयोग कर सकते हैं की कोशिश सभी कन्स्ट्रक्टर कॉल के लिए यह C++ के सबसे परेशान पार्स यानी मैट्रिक्स एम 1 {} से बचाता है; – mark

+0

यह "सबसे अप्रिय पार्स", सबसे अप्रिय पार्स है जब आप घोषित करने और वस्तु और एक मूल्य एक या यह की निर्माता मापदंडों के अधिक करने के लिए अस्थायी प्रारंभ पारित करने के लिए कोशिश नहीं है। जैसे 'ए बी (ए());'। 'मैट्रिक्स एम 1(); 'सिर्फ एक नियमित समारोह घोषणा है। –

3

Matrix m1() एक समारोह है कि कोई पैरामीटर लेता है और एक Matrix रिटर्न की घोषणा की। आप देख सकते हैं इस Matrix के लिए एक विधि को जोड़ने और m1 पर यह आह्वान करने के लिए कोशिश कर रहा द्वारा इतना है:

#include <iostream> 

class Matrix { 
private: 
    int m_count; 

public: 
    Matrix() { 
     m_count = 1; 
     std::cout << "yahoo!" << std::endl; 
    } 
    void foo() {} 
}; 

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1(); 
    m1.foo(); 
    std::cout << "after" << std::endl; 
} 

देता error: request for member 'foo' in 'm1', which is of non-class type 'Matrix()'

0

यह करना होगा कि आप क्या करने की कोशिश कर रहे हैं:

int main() { 
    std::cout << "before" << std::endl; 
    Matrix m1;       // <---- 
    std::cout << "after" << std::endl; 
} 

सी ++ में, यदि आप अभिभावकों के साथ एक चर प्रारंभ करते हैं, तो यह वास्तव में एक फ़ंक्शन घोषित करता है जो कोई पैरामीटर नहीं लेता है और उस प्रकार को लौटाता है।

1

सी भाषा के नजरिए से सोचें:

int data_member(); 

वास्तव में शून्य और लौटने पूर्णांक लेने समारोह के लिए एक प्रोटोटाइप है। जब आप इसे पसंद बदलने के लिए:

T data(); 

यह अभी भी एक समारोह घोषणा, T retuning है। जब आप चर के रूप में यह घोषणा करने के लिए की जरूरत है, आप करते हैं:

T data; // int data; 
संबंधित मुद्दे