2012-04-20 19 views
10

मैंने सुना है कि अस्थिरता कॉन्स की तरह ओवरलोडिंग का कारक है।अस्थिर अधिभार?

यदि अस्थिर पैरामीटर द्वारा 0 फ़ंक्शन को ओवरलोड किया गया है, तो अस्थिर-संस्करण कहलाता है?

मैं अस्थिर-संस्करण कहलाता हूं जब मैं ऐसी स्थिति की कल्पना नहीं कर सकता।

#include <iostream> 

struct A { 
    void foo() { 
     std::cout << "in non-volatile" << std::endl; 
    } 
    void foo() volatile { 
     std::cout << "in volatile" << std::endl; 
    } 
}; 

int main() 
{ 
    A a; 
    a.foo(); 
    volatile A b; 
    b.foo(); 
} 

b.foo()volatile अधिभार कॉल करेगा:  

+0

जोड़ा सी ++ टैग; यदि वह भाषा नहीं है जिसके बारे में आप बात कर रहे हैं, तो कृपया अपने प्रश्न को संपादित करने के लिए महत्वपूर्ण तथ्य और उचित रूप से पुनः प्रयास करें। – Mat

+2

यह सिर्फ 'const' के समान है, यदि आपके पास' अस्थिर 'योग्य ऑब्जेक्ट है तो उस पर केवल' अस्थिर 'फ़ंक्शन कहा जा सकता है। –

+1

ओह, मैंने अपना दिमाग फिसल दिया –

उत्तर

8

अस्थिरता पैरामीटर पर लागू किया जा सकता है, लेकिन यह पैरामीटर पर सीधे लागू होने पर ओवरलोडिंग का कारक नहीं है। पैरामीटर के प्रकारों को अलग करने के लिए इसका उपयोग करना संभव है। उदाहरण के लिए, यह कानूनी है:

void f(int &p) {}; //reference to int 
void f(volatile int &p) {}; //reference to volatile int 

यह नहीं है:

void f(int p) {}; 
void f(volatile int p) {}; 

कारण पहले उदाहरण में संदर्भ क्या नहीं अस्थिर है है, लेकिन पूर्णांक है। दूसरे उदाहरण में, दोनों प्रकार पूर्णांक हैं और इसलिए एक ही प्रकार हैं।

अस्थिर तरीके भी हैं। वे अस्थिर होने के लिए this घोषित करने के समान हैं। क्योंकि this एक सूचक और नहीं युक्त प्रकार ही है, निम्नलिखित भी कानूनी है:

void c::f(int p) {}; 
void c::f(int p) volatile {}; 

यह const से अधिक भार के लिए के रूप में सभी एक ही है।

सी ++ मानक का यह प्रासंगिक हिस्सा §13.1 ओवरलोड करने योग्य घोषणा है। सी ++ 11 ड्राफ्ट n3290 से:

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

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) 

- अंत उदाहरण]

केवल पैरामीटर प्रकार विनिर्देश की सबसे बाहरी स्तर पर स्थिरांक और वाष्पशील प्रकार-विनिर्देशक इस फैशन में अनदेखी कर रहे हैं; पैरामीटर प्रकार विनिर्देश के भीतर दफन किए गए स्थिर और अस्थिर प्रकार-विनिर्देश महत्वपूर्ण हैं और ओवरलोडेड फ़ंक्शन घोषणाओं को में अंतर करने के लिए उपयोग किया जा सकता है। विशेष रूप से, किसी भी प्रकार के टी, pointer to T, pointer to const T, और pointer to volatile T को reference to T, reference to const T, और reference to volatile T के रूप में अलग पैरामीटर प्रकार माना जाता है।

124) एक पैरामीटर प्रकार इस तरह के एक पैरामीटर प्रकार के मामले कि कार्य करने के लिए एक सूचक है के रूप में एक समारोह का प्रकार, शामिल होते हैं तो स्थिरांक और के लिए पैरामीटर प्रकार विनिर्देशों की सबसे बाहरी स्तर पर अस्थिर प्रकार-विनिर्देशक आंतरिक फ़ंक्शन प्रकार भी अनदेखा कर रहे हैं।

+0

यह एक अच्छा जवाब है – Pete

10

यहाँ एक उदाहरण है। struct A में foo, b.foo() के लिए अस्थिर अधिभार नहीं था, तो अमान्य होगा।

+0

इतना तेज़ नहीं है। यह प्रश्न अस्थिर पैरामीटर के बारे में प्रतीत होता है, और वे ओवरलोडिंग का कारक नहीं हैं। –

+0

वह (मुझे नहीं) पूरी तरह से स्पष्ट नहीं था - और पीट ने पहले ही फ़ंक्शन पैरामीटर के बारे में एक उत्तर पोस्ट किया था। – Mat

+0

मैं इसके साथ ठीक हूं, लेकिन @Pete भी पूरा जवाब नहीं दे रहा है। शायद हमें समेकित करना चाहिए। –

3

पता लगाने के लिए एक परीक्षण कार्यक्रम लिखें।

void func(const int& a) 
{ 
    std::cout << "func(const)" << std::endl; 
} 

void func(const volatile int& a) 
{ 
    std::cout << "func(const volatile)" << std::endl; 
} 

int main() 
{ 
    const int a = 0; 
    const volatile int b = 0; 
    func(a); 
    func(b); 
    system("pause"); 
    return 0; 
} 

इच्छा उत्पादन:

func(const) 
func(const volatile) 
संबंधित मुद्दे