2009-04-01 13 views
5

मेरे पास निम्नलिखित सी ++ कोड था, जहां घोषणा में मेरे कन्स्ट्रक्टर के लिए तर्क कन्स्ट्रक्टर की परिभाषा की तुलना में अलग स्थिरता थी।कन्स्ट्रक्टर परिभाषा और घोषणा के बीच विसंगति

//testClass.hpp 
class testClass { 
    public: 
    testClass(const int *x); 
}; 

//testClass.cpp 
testClass::testClass(const int * const x) {} 

मैं जी ++ इस कोड संकलन का उपयोग कर, चाहिए या कम से कम कुछ चेतावनी कोई चेतावनी के साथ इस संकलन करने में सक्षम था? यह पता चला है कि 64 बिट सोलरिस पर अंतर्निहित सी ++ कंपाइलर ने मुझे एक लिंकर त्रुटि दी, जिस तरह मैंने देखा कि एक मुद्दा था।

इस मामले में तर्क मिलान करने का नियम क्या है? क्या यह कंपाइलर्स पर है?

//testClass.hpp 
class testClass { 
    public: 
    testClass(const int x); 
}; 

//testClass.cpp 
testClass::testClass(int x) {} 

कौन सा भी संकलित के बीच एक ही अंतर के रूप में इसके बारे में

उत्तर

7

" अस्थिर टी के संदर्भ में " इस तरह के मामलों में, कॉन्स विनिर्देशक को ओमिट होने की अनुमति है घोषणा से एड क्योंकि यह कॉलर के लिए कुछ भी नहीं बदलेगा।

यह केवल कार्यान्वयन के विवरण के संदर्भ में महत्वपूर्ण है। इसलिए यही कारण है कि यह परिभाषा पर है लेकिन घोषणा पर नहीं है।

उदाहरण:

//Both f and g have the same signature 
void f(int x); 
void g(const int x); 

void f(const int x)//this is allowed 
{ 
} 

void g(const int x) 
{ 
} 

किसी को भी बुला च परवाह नहीं करेंगे कि आप स्थिरांक के रूप में यह इलाज के लिए है क्योंकि यह चर के अपने खुद के प्रति है जा रहे हैं।

int * const x के साथ, यह वही है, यह सूचक की आपकी प्रति है। चाहे आप किसी और चीज को इंगित कर सकें, कॉलर से कोई फर्क नहीं पड़ता।

यदि आपने पहले कॉन्स्ट को कॉन्स इंट * कॉन्स में छोड़ दिया है, तो इससे कोई फर्क पड़ेगा क्योंकि यह कॉलर के लिए महत्वपूर्ण है यदि आप उस डेटा को बदलते हैं जो यह इंगित कर रहा है।

संदर्भ: सी ++ स्टैंडर्ड, 8.3.5 पैरा 3:

"कोई भी सीवी-क्वालीफायर एक पैरामीटर प्रकार संशोधित हटा दी जाती है ... इस तरह के सीवी-क्वालिफायर केवल को प्रभावित समारोह के शरीर के साथ पैरामीटर की परिभाषा, वे समारोह प्रकार "को प्रभावित नहीं करते

+0

कृपया मानक का संदर्भ प्रदान करें। –

+0

यदि आपने अधिक उदाहरणों की आवश्यकता है, तो मैंने इसके बारे में यहां लिखा है: http://stackoverflow.com/questions/269882/c-const-question/274888#274888 –

+0

@ onebyone.livejournal.com: धन्यवाद। –

4

Think। आप पास-दर-मान पैरामीटर के कॉन्स्ट-नेस के आधार पर ओवरलोड नहीं कर सकते हैं। इस मामले की कल्पना कीजिए:

void f(int x) { } 
void f(const int x) { } // Can't compile both of these. 

int main() 
{ 
    f(7); // Which gets called? 
} 

मानक से:

पैरामीटर घोषणाओं कि केवल उपस्थिति या स्थिरांक और/या अस्थिर बराबर हैं के अभाव में भिन्न होते हैं। यही है, निर्धारित करते समय प्रत्येक पैरामीटर प्रकार के लिए प्रकार-विनिर्देशक निर्धारित करते समय, परिभाषित या कॉल किया गया है, तो स्थिरांक या अस्थिर प्रकार-विनिर्देशक को अनदेखा किया जाता है। [उदाहरण:

typedef const int cInt; 
int f (int); 
int f (const int); // redeclaration of f(int) 
int f (int) { ... } // definition of f(int) 
int f (cInt) { ... } // error: redefinition of f(int) 

अंत उदाहरण] केवल स्थिरांक और पैरामीटर प्रकार विनिर्देश इस फैशन में अनदेखी कर रहे हैं की सबसे बाहरी स्तर पर अस्थिर प्रकार-विनिर्देशक; स्थिरांक और वाष्पशील प्रकार-विनिर्देशक एक पैरामीटर प्रकार विनिर्देश के भीतर दफन महत्वपूर्ण होती हैं और को समारोह अतिभारित भेद declarations.112, किसी भी प्रकार टी, के लिए "सूचक टी करने के लिए," "सूचक के लिए इस्तेमाल किया जा सकता है) विशेष रूप से स्थिरांक टी, "और" अस्थिर टी करने के लिए सूचक ", अलग पैरामीटर प्रकार माना जाता है के रूप में कर रहे हैं" टी के संदर्भ में, "" संदर्भ const करने के लिए टी, "और

0

012 हैconst int * x जैसा नहीं है जैसा कि आप पहले ही बना चुके हैं?

+0

नहीं। पहले मामले में, एक्स एक कॉन्स पूर्णांक के लिए एक कॉन्स सूचक है। दूसरे मामले में, एक्स एक कॉन्स पूर्णांक के लिए एक * गैर-स्थिर * सूचक है। –

+0

विशेष रूप से, पहली जगह में आप न तो एक्स और न ही * x संशोधित कर सकते हैं। दूसरे मामले में, आप एक्स * को संशोधित नहीं कर सकते हैं, लेकिन आप एक्स को संशोधित कर सकते हैं। उदाहरण के लिए, दूसरा सरणी के माध्यम से चलने के लिए इस्तेमाल किया जा सकता है (उदाहरण के लिए x ++ के साथ), और पहले नहीं कर सका। –

5

यह उदाहरण अधिभार संकल्प खंड में स्पष्ट रूप से कवर किया जाता है, 13.1/3b4:

पैरामीटर घोषणाओं कि केवल उपस्थिति या स्थिरांक और/या के अभाव में अलग अस्थिर बराबर हैं। यही है, प्रत्येक पैरामीटर प्रकार के लिए कॉन्स्ट और अस्थिर प्रकार-विनिर्देशों को को अनदेखा किया जाता है जब यह निर्धारित किया जाता है कि कौन सा फ़ंक्शन घोषित, परिभाषित किया गया है या कहा जाता है।

[उदाहरण:

typedef const int cInt; 
int f (int); 
int f (const int); // redeclaration of f(int) 
int f (int) { ... } // definition of f(int) 
int f (cInt) { ... } // error: redefinition of f(int) 

अंत उदाहरण]

तो, यह निश्चित रूप से ठीक है।

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