2010-02-24 8 views
14

मैं इस कोड का नमूना है:कास्टिंग ऑपरेटर स्थिरांक बनाम गैर-स्थिरांक

class Number 
{ 
    int i; 
    public: 
    Number(int i1): i(i1) {} 
    operator int() const {return i;} 
}; 

क्या कास्टिंग ऑपरेटर से const संशोधक को दूर करने के निहितार्थ क्या हैं? क्या यह ऑटो कास्टिंग को प्रभावित करता है, और क्यों?

उत्तर

28

रूपांतरण ऑपरेटर स्थिरांक नहीं है, तो आप स्थिरांक वस्तुओं परिवर्तित नहीं कर सकते:

void f(const Number& n) 
{ 
    int n1 = n; 
} 

यदि आप संकलन त्रुटि देने शुरू कर देंगे:

const Number n(5); 
int x = n; // error: cannot call non-const conversion operator 
+1

+1 - अच्छी कमाई की। हमम - मैं एक कॉन्स ऑब्जेक्ट से लिया गया मूल्य डालना चाहता हूं, लेकिन मैं नहीं कर सकता, क्योंकि रूपांतरण (जो स्रोत मान को संशोधित नहीं कर रहा है) स्थिर नहीं है। रोकें, देखो और सोचें और तर्क स्पष्ट है - यह किसी अन्य विधि से अलग नहीं है। लेकिन मैं अभी भी उस ट्वाइलाइट जोन थीम को सुनता रहता हूं। स्रोत की (कम से कम तार्किक) स्थिरता विधि के अपेक्षित व्यवहार का हिस्सा है - "रूपांतरण" का अर्थ क्या है। लेकिन फिर, लगातार नियम, कम से कम, संगत हैं। – Steve314

5

const संस्करण को इस पर ध्यान दिए बिना कहा जा सकता है कि class Number उदाहरण कॉन्स्ट है या नहीं। यदि ऑपरेटर को गैर-कॉन्स घोषित किया जाता है तो इसे केवल गैर-कॉन्स इकाइयों पर ही बुलाया जा सकता है - जब आप इसका उपयोग करने की कोशिश करते हैं जहां इसे कॉल नहीं किया जा सकता है तो आपको संकलन त्रुटि मिल जाएगी।

+0

क्या आपका मतलब था "केवल * गैर-कॉन्स * इकाइयों पर बुलाया जाना चाहिए" ?? – legends2k

+0

@ किंवदंतियों 2k: हाँ, तय है। धन्यवाद। – sharptooth

5

आप इस तरह एक समारोह है, तो कास्टिंग ऑपरेटर में कॉन्स हटा दें।