2010-09-28 13 views
23

नीचे "ऑपरेटर int" फ़ंक्शन क्या है? यह क्या करता है?"ऑपरेटर int" फ़ंक्शन क्या है?

class INT 
{ 
    int a; 

public: 
    INT(int ix = 0) 
    { 
     a = ix; 
    } 

    /* Starting here: */ 
    operator int() 
    { 
     return a; 
    } 
    /* End */ 

    INT operator ++(int) 
    { 
     return a++; 
    } 
}; 
+0

क्या बोल्ड कोड है? अन्यथा यह मूल रूप से 'int' और ऑपरेटर '++' में रूपांतरण के साथ' int' के लिए एक रैपर है। –

+3

मूल पोस्ट के स्रोत को देखते हुए, 'ऑपरेटर int() 'बोल्ड कोड माना जाता है। –

+6

यदि मैं कर सकता, तो मैं ईमानदारी से इसे फिर से खोलने के लिए वोट दूंगा। मूल प्रश्न खराब रूप से स्वरूपित किया गया था लेकिन बोल्ड में स्पष्ट रूप से कोड का एक खंड था। बाद में संपादित (ओपी द्वारा नहीं) ने कोड को गैर-बोल्ड बनाया और इसलिए सवाल को असंगत लग रहा था। – eldarerathis

उत्तर

24

बोल्ड कोड एक रूपांतरण ऑपरेटर है। (उर्फ cast operator)

यह आप एक तरह से अपने कस्टम INT प्रकार से परिवर्तित करने के लिए अन्य प्रकार के (इस मामले, int में) एक विशेष रूपांतरण समारोह स्पष्ट रूप से कॉल करने के लिए बिना देता है।

उदाहरण के लिए, परिवर्तित ऑपरेटर के साथ, इस कोड को संकलित कर देगा:

INT i(1234); 
int i_2 = i; // this will implicitly call INT::operator int() 

परिवर्तित ऑपरेटर के बिना, ऊपर कोड संकलन नहीं होगा, और आप एक INT से जाने के लिए कुछ और करने के लिए होता है एक int करने के लिए, जैसे:

INT i(1234); 
int i_2 = i.a; // this wont compile because a is private 
4

ऐसा लगता है कि यह एक INT वर्ग जो नियमित पूर्णांक की तरह एक छोटे से बर्ताव करता है बनाने के लिए, सिर्फ इतना है कि कुछ अन्य ऑपरेटरों अभी तक परिभाषित नहीं कर रहे हैं।

क्या यह एक होमवर्क समस्या है?

3

ऐसा लगता है कि यह कक्षा से एक प्रश्न है, इसलिए मैं आपको कक्षा बनाने के तरीके पर दस्तावेज़ देखने के लिए आमंत्रित करूंगा।

class Foo 
{ 
public 
    Foo() {} // Constructor 

    Foo operator++ {} // Operation ++ on foo like: 
    // Foo foo; 
    // foo++; 
}; 
15

operator int() एक रूपांतरण ऑपरेटर है, जो इस वर्ग के एकके स्थान पर इस्तेमाल किया जा करने की अनुमति देता है 10। यदि इस प्रकार का ऑब्जेक्ट उस स्थान पर उपयोग किया जाता है जहां int (या अन्य संख्यात्मक प्रकार) की अपेक्षा की जाती है, तो इस कोड का उपयोग सही प्रकार के मान प्राप्त करने के लिए किया जाएगा।

उदाहरण के लिए:

int i(1); 
INT I(2); // Initialised with constructor; I.a == 2 
i = I; // I is converted to an int using `operator int()`, returning 2. 
4

सबसे पहली बात:

$ 12.3.1/1 - "एक निर्माता समारोह-विनिर्देशक बिना घोषित स्पष्ट से एक रूपांतरण को निर्दिष्ट के प्रकार इसके पैरामीटर अपनी कक्षा के प्रकार के लिए। इस तरह के एक निर्माता को एक कनवर्टिंग कन्स्ट्रक्टर कहा जाता है। "

आपके उदाहरण में, आईएनटी एक उपयोगकर्ता परिभाषित वर्ग है जिसमें 'int' से कनवर्ट करने वाला कन्स्ट्रक्टर है।

इसलिए निम्नलिखित कोड अच्छी तरह से गठित किया गया है:

INT i(1024);  // direct initialization syntax 

इसका मतलब यह है कि आप एक पूर्णांक से एक INT वस्तु प्राप्त कर सकते हैं। हालांकि, अगर कोई आईएनटी ऑब्जेक्ट को एक पूर्णांक में परिवर्तित किया जाना है, तो कोई क्या करता है? संक्रामिता?

एक कह सकते हैं कि वर्ग INT समझाया पूर्णांक सदस्य

int x = i.geta(); 

हालांकि यह बहुत सहज ज्ञान युक्त नहीं है और एक मानकीकृत तरीका नहीं है वापस जाने के लिए एक सदस्य समारोह प्रदान कर सकते हैं।साथ ही यह अंतर्निहित नहीं है जब इस तरह की स्थितियों में अंतर्निहित प्रकार काम करते हैं।

int z = 0; 
int y1 = z; // copy initialization or 
int y2(z); // direct initialization 
double d = (int)z; // explicit cast 

स्टैंडर्ड वजह कह कर इस तरह के मानकीकरण और उपयोगकर्ता निर्धारित प्रकार परिवर्तित करने की intuitiveness के लिए अनुमति देता है:

$ 12,3/2 - "एक दसवीं कक्षा एक नाम के साथ कोई पैरामीटर होने के एक सदस्य समारोह फार्म की [...]

ऑपरेटर रूपांतरण प्रकार आईडी

[ ...] रूपांतरण-प्रकार-आईडी द्वारा निर्दिष्ट एक्स से प्रकार का रूपांतरण निर्दिष्ट करता है। ऐसे कार्य रूपांतरण कार्यों कहलाते हैं। कोई वापसी प्रकार निर्दिष्ट किया जा सकता है। यदि कोई रूपांतरण फ़ंक्शन एक सदस्य फ़ंक्शन है, तो रूपांतरण फ़ंक्शन (8.3.5) का प्रकार है " पैरामीटर रूपांतरण-प्रकार-आईडी लौटने पर पैरामीटर नहीं ले रहा है"।

यह बनाता है निम्न में से सभी अच्छी तरह से गठित और रास्ता के साथ सद्भाव को बरकरार रखे हुए निर्मित प्रकार काम

int y1 = i; // copy initialization or 
int y2(i); // direct initialization 
double d = (int)i; // explicit cast 
संबंधित मुद्दे