2013-01-10 19 views
11

सी ++ 11 मानक (= default कक्षा की परिभाषा के बाहर) के अनुसार निम्नलिखित कानूनी है?कक्षा के बाहर डिफ़ॉल्ट कन्स्ट्रक्टर/विनाशक?

// In header file 
class Test 
{ 
    public: 
     Test(); 
     ~Test(); 
}; 

// In cpp file 
Test::Test() = default; 
Test::~Test() = default; 
+8

यह ठीक है, मानक भी इसे एक उदाहरण ('§8.4.2/3') में उपयोग करता है। '= default' और' = delete' केवल "सामान्य" फ़ंक्शन निकाय हैं (spec के अनुसार, वैसे भी), यानी आप * परिभाषा * में क्या लिखेंगे। – Xeo

+2

ध्यान दें कि फ़ंक्शन की पहली घोषणा के बाद एक डिफ़ॉल्ट परिभाषा प्रकट हो सकती है जबकि हटाए गए परिभाषा को फ़ंक्शन की पहली घोषणा होना चाहिए। – MWid

+0

@Xeo एक उत्तर की तरह लगता है। –

उत्तर

8

हां, एक विशेष सदस्य फ़ंक्शन एक .cpp फ़ाइल में डिफ़ॉल्ट-परिभाषित आउट-ऑफ़-लाइन हो सकता है। यह समझकर कि ऐसा करने से, इनलाइन-डिफॉल्ट फ़ंक्शन के कुछ गुण आपकी कक्षा पर लागू नहीं होंगे। उदाहरण के लिए, यदि आपकी प्रतिलिपि निर्माता डिफ़ॉल्ट रूप से परिभाषित है, तो आपकी कक्षा को तुलनीय रूप से कॉपी करने योग्य नहीं माना जाएगा (जो इसे पीओडी के रूप में पहचाने जाने से भी अयोग्य घोषित करता है)। इसी तरह, एक डिफ़ॉल्ट परिभाषित आउट ऑफ़ लाइन विनाशक आपके प्रकार को तुच्छ (या पीओडी) से अयोग्य घोषित कर देगा।

यह उपयोगी हो सकता है यदि आप एक गैर-इनलाइन कॉपी-कन्स्ट्रक्टर और इसे परिभाषित करने के लिए नियंत्रित करना चाहते हैं (शायद जेनरेट की गई टेम्पलेट परिभाषाओं पर नियंत्रण लेने के लिए), लेकिन मैन्युअल रूप से इसे परिभाषित नहीं करना चाहते हैं खुद को एक हाथ से तैयार सदस्य-प्रारंभिक सूची के साथ, जो श्रमिक होगा और रखरखाव के तहत बाँध सकता है।

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