2010-03-10 11 views

उत्तर

24

हर बार जब आप जानते हैं कि विधि उस वस्तु की स्थिति को नहीं बदलेगी जिसे आपको निरंतर घोषित करना चाहिए।

यह आपके कोड को पढ़ने में मदद करता है। और जब आप ऑब्जेक्ट की स्थिति बदलने की कोशिश करते हैं तो यह मदद करता है - कंपाइलर आपको रोक देगा।

+0

और यदि फ़ंक्शन ऑब्जेक्ट स्टेटस को भी स्पर्श नहीं कर रहा है लेकिन इनपुट इनपुट को पूरी तरह से वापसी मान में बदल देता है, तो यह स्थिर होना चाहिए। स्टेटिक> कॉन्स सदस्य> सामान्य सदस्य। – Lucas

6

जब आपके पास const ऑब्जेक्ट है, तो संकलक आपको कॉल करने की एकमात्र विधियां const कीवर्ड द्वारा सुरक्षित चिह्नित हैं। वास्तव में, केवल सदस्य विधियां const विधियों के रूप में समझ में आती हैं।

सी ++ में, किसी ऑब्जेक्ट की प्रत्येक विधि को ऑब्जेक्ट पर this पॉइंटर प्राप्त होता है; const विधि को केवल constthis पॉइंटर प्राप्त होगा।

3

मान लें कि आप के रूप में, तरीकों के बारे में बात कर रहे हैं:

struct Example { 
    void f() const; 
}; 

फिर अगर वे एक स्थिरांक वस्तु पर प्रतिदेय होना चाहिए, विधि स्थिरांक होना चाहिए।

11

जितनी बार संभव हो सके। जिन कार्यों को डेटा सदस्यों को बदलने की आवश्यकता नहीं है उन्हें कॉन्स के रूप में घोषित किया जाना चाहिए। यह कोड को और समझने योग्य बनाता है और अनुकूलन के लिए संकलक को संकेत दे सकता है।

2

नहीं अक्सर पर्याप्त ....

जबकि सभी प्रश्नों के उत्तर, सही कर रहे हैं अगर आप एक पुस्तकालय है कि const correct नहीं है का उपयोग कर रहे तो यह स्थिरांक सभी स्थानों आप इसका इस्तेमाल करना चाहिए उपयोग करने के लिए मुश्किल है।

आप एक पुराने एपीआई कि लेता है, तो एक चार * कि सभी तार्किक प्रयोजनों के लिए एक स्थिरांक चार * होना चाहिए, तो आप अपने कोड में स्थिरांक भूल जाते हैं या कुछ बदसूरत कास्टिंग क्या करना है या तो। उस मामले में मैं कॉन्स भूल गया।

+2

विकल्प एपीआई को लपेटना और यह निर्धारित करना है कि क्या वास्तव में लागत डेटा लेना चाहिए और यदि ऐसा है तो अपने रैपर के अंदर इनपुट डेटा की स्थिरता को दूर करें। इसका मतलब है कि आपको केवल बदसूरत कास्टिंग ओएनसीई की आवश्यकता है और आप इस तथ्य पर टिप्पणी कर सकते हैं कि आपने यह निर्धारित किया है कि यह आपके परीक्षण के माध्यम से सुरक्षित और सही था। आईएमएचओ सबसे अधिक नहीं है अगर सभी 'पुराने एपीआई' को लपेटा जाना चाहिए ... –

0

मैं कार्यों को कॉन्स के रूप में घोषित करता था लेकिन अब मैं शायद ही कभी ऐसा करता हूं।

मुख्य समस्या यह थी कि अगर मैं कॉन्स से गैर-कॉन्स में कोई फ़ंक्शन बदलना चाहता था, तो इसका मतलब यह होगा कि उस फ़ंक्शन को कॉल करने वाले अन्य सभी कॉन्स्ट फ़ंक्शंस को गैर-कॉन्स्ट में बदलना होगा।

ऑप्टिमाइज़ेशन के कारण मैंने सोचा था कि यह अक्सर होता है। उदाहरण के लिए मेरे पास एक GetData() फ़ंक्शन था जो डेटा पर पॉइंटर वापस करने के लिए उपयोग किया जाता था, लेकिन बाद में मैंने डेटा सेट अप करने के लिए ऑप्टिमाइज़ किया, अगर GetData() समाप्त हो जाता है (जो ऑब्जेक्ट की स्थिति को बदलता है, तो यह अब एक कॉन्स नहीं है समारोह)।

अन्य कार्यों के लिए वही बात जो ऑब्जेक्ट की स्थिति को बदले बिना कुछ गणना कर सकती हैं, लेकिन कुछ बिंदु पर यह परिणाम को कैशिंग कर रहा था क्योंकि समारोह को कई बार बुलाया गया था और यह एक बाधा थी।

अभ्यास में, कम से कम मेरे प्रोजेक्ट के लिए, मैंने अपने कार्यों को कॉन्स के रूप में घोषित करने से बहुत कम लाभ देखा।

+3

कार्य जो "लॉजिकल वैल्यू" नहीं बदल सकता है, फिर भी आपको अपने कैश के लिए म्यूटेबल डेटा सदस्यों का उपयोग करना होगा। –

+0

हां, रोजर की टिप्पणी से सहमत हैं। म्यूटेबल के रूप में घोषित डेटा सदस्यों को एक कॉन्स फ़ंक्शन के अंदर बदला जा सकता है। – jasonline

1

मैं लगभग हर अवसर पर कॉन्स का उपयोग करता हूं, और तथ्य यह है कि यह दोनों उद्देश्यों के दस्तावेज प्रदान करता है और उस इरादे से अनुपालन को लागू करता है। भाषा की विशेषताएं उससे बेहतर नहीं होती हैं, और फिर भी कॉन्स उत्सुकता से अनदेखा है।(वास्तविकता है कि कोडर स्वयंभू सी के ++ बहुमत int*, int*const, const int* और const int*const के बीच का अंतर व्याख्या नहीं कर सकते लगता है।)

यह कभी नहीं अपने 'सी' मूल की वजह से हो सकता था, वहीं मैं अक्सर लगता है कि सी ++ होगा एक बेहतर भाषा बनें यदि कॉन्स्ट डिफ़ॉल्ट था और 'var' या उदार छिड़काव (कहें) 'var' या कुछ समान कीवर्ड आवश्यक चर के निर्माण के संशोधन की अनुमति देने के लिए आवश्यक था।

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

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