2013-08-13 9 views
7

मैं googled, लेकिन एक स्पष्ट जवाब नहीं मिला। उदाहरण:ऑपरेटर शून्य *() का क्या मतलब है?

class Foo { 
public: 
    operator void*() { 
     return ptr; 
    } 

private: 
    void *ptr; 
}; 

मैं समझता हूं कि void* operator() क्या है। उपर्युक्त ऑपरेटर एक ही वाक्य को एक अलग वाक्यविन्यास में है? यदि नहीं, तो यह क्या है? और ptr प्राप्त करने के लिए मैं उस ऑपरेटर का उपयोग कैसे कर सकता हूं?

+0

ध्यान दें, 'ओपेटर' की कमी एस – StephenTG

+0

@StephenTG धन्यवाद। संशोधित – GuLearn

+1

यह एक कास्ट ऑपरेटर है। http://ideone.com/k1EiJF – Chad

उत्तर

15

नहीं वे दो अलग-अलग ऑपरेटर हैं। operator void* फ़ंक्शन एक प्रकार का कास्टिंग फ़ंक्शन है, जबकि operator() फ़ंक्शन कॉल ऑपरेटर है।

पहली बार उपयोग किया जाता है जब आप Foo के उदाहरण को void* पर कनवर्ट करना चाहते हैं, जैसे उदा।

Foo foo; 
void* ptr = foo; // The compiler will call `operator void*` here 

दूसरा एक समारोह के रूप में इस्तेमाल किया जाता है:

Foo foo; 
void* ptr = foo(); // The compiler calls `operator()` here 
+0

तो कॉल करने योग्य ऑब्जेक्ट्स प्रदान करने के लिए 'ऑपरेटर() 'लागू किया जा सकता है? – JAB

+0

@ जेएबी यह सही है। –

+0

क्या यह अंतर्निहित रूपांतरण सक्षम करेगा? जैसे क्या मैं सुरक्षित रूप से फू को 'शून्य बार ([anytype]) जैसे किसी फ़ंक्शन में पास कर सकता हूं, यदि मैं' ऑपरेटर [anytype]() 'को Foo में लागू करता हूं? – GuLearn

0

यह एक प्रकार का रूपांतरण ऑपरेटर है। इसका उपयोग तब भी किया जाता है जब कक्षा Foo का ऑब्जेक्ट कास्ट किया जाता है (रूपांतरित) void* पर। यह वास्तव में void* operator() जैसा नहीं है।

5

कि समारोह को परिभाषित करता है जब वस्तु एक शून्य सूचक में बदल जाती है क्या होता है, यहाँ यह पता करने के लिए सदस्य ptr अंक के लिए मूल्यांकन करता है।

कभी-कभी इस रूपांतरण फ़ंक्शन को परिभाषित करने में उपयोगी होता है, उदा। वस्तु के बूलियन मूल्यांकन के लिए।

#include <iostream> 

struct Foo { 
    Foo() : ptr(0) { 
     std::cout << "I'm this: " << this << "\n"; 
    } 
    operator void*() { 
     std::cout << "Here, I look like this: " << ptr << "\n"; 
     return ptr; 
    } 
private: 
    void *ptr; 
}; 

int main() { 
    Foo foo; 
    // convert to void* 
    (void*)foo; 
    // as in: 
    if (foo) { // boolean evaluation using the void* conversion 
     std::cout << "test succeeded\n"; 
    } 
    else { 
     std::cout << "test failed\n"; 
    } 
} 

उत्पादन होता है:

$ g++ test.cc && ./a.out 
I'm this: 0x7fff6072a540 
Here, I look like this: 0 
Here, I look like this: 0 
test failed 

यह भी देखें:

यहाँ एक उदाहरण है कि अपने वर्तमान कोड लिखने में कोई त्रुटि है

+0

"अन्यथा यह ऑब्जेक्ट का पता ही होगा, यह।" - नहीं, यह नहीं होगा। मुझे लगता है कि आप वस्तु को पॉइंटर के साथ ऑब्जेक्ट को भ्रमित कर रहे हैं। – hvd

+0

@ एचवीडी आप सही हैं, उस बिट को सही किया। – moooeeeep

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