c++ कांस्टेबल सदस्य को दो बार क्यों आरंभ किया जा सकता है?




c++11 initialization (2)

इसे केवल एक बार ही इनिशियलाइज़ किया जाता है।

const int k = 666;

यदि निर्माणकर्ता में उपलब्ध नहीं कराया गया है तो इसका उपयोग किया जाएगा।

https://code.i-harness.com

नीचे एक कोड स्निपेट दिया गया है जिसे संकलित किया जा सकता है और बिना त्रुटि के vs2015 चलाया जा सकता है

#include<iostream>
using namespace std;

class A {
    public:
        A(int b) :k(b) {}//second time
    const int k = 666;//first time
};

int main() {
    A a(555);
    cout << a.k << endl;
    return 0;
}

आउटपुट 555 । लेकिन जहाँ तक मुझे पता है, const ऑब्जेक्ट को केवल एक बार इनिशियलाइज़ किया जाना चाहिए, जिसके बाद वैल्यू अनमॉडिफ़ेबल है।


इसे दो बार आरंभीकृत नहीं किया गया है; डिफ़ॉल्ट सदस्य आरंभीकरण को केवल अनदेखा किया जाता है। तो A a(555); , ak को 555 रूप में आरंभीकृत किया गया है।

यदि किसी सदस्य में एक डिफ़ॉल्ट सदस्य प्रारंभकर्ता है और एक निर्माणकर्ता में सदस्य आरंभीकरण सूची में भी दिखाई देता है, तो डिफ़ॉल्ट सदस्य प्रारंभकर्ता की उपेक्षा की जाती है।

मानक से, [class.base.init]/10 :

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

struct A {
  int i = /* some integer expression with side effects */ ;
  A(int arg) : i(arg) { }
  // ...
};

ए (इंट) कंस्ट्रक्टर केवल आरजी के मूल्य के लिए मुझे इनिशियलाइज़ करेगा, और आई डिफॉल्ट मेंबर इनिशियलाइज़र के साइड इफेक्ट्स नहीं होंगे। - अंतिम उदाहरण]

दूसरी ओर, दिया गया

class A {
public:
    A() {}            // k will be initialized via default member initializer, i.e. 666
    A(int b) :k(b) {} // k will be initialized via member initializer list, i.e. b

    const int k = 666;
};

फिर A a; , ak को 666 रूप में आरंभ किया जाएगा।







initializer-list