जवाबों:
कहीं भी एक संकलन इकाई (आमतौर पर एक .cpp फ़ाइल) में होता:
foo.h
class foo {
static const string s; // Can never be initialized here.
static const char* cs; // Same with C strings.
static const int i = 3; // Integral types can be initialized here (*)...
static const int j; // ... OR in cpp.
};
foo.cpp
#include "foo.h"
const string foo::s = "foo string";
const char* foo::cs = "foo C string";
// No definition for i. (*)
const int foo::j = 4;
(*) मानकों के अनुसार आपको i
कक्षा परिभाषा के बाहर परिभाषित करना चाहिए (जैसे j
है) यदि यह कोड में केवल अभिन्न स्थिर अभिव्यक्तियों के अलावा अन्य में उपयोग किया जाता है। विवरण के लिए डेविड की टिप्पणी नीचे देखें।
i
परिभाषित किया जाना चाहिए जब इसे अभिन्न निरंतर अभिव्यक्तियों के बजाय कहीं और इस्तेमाल किया गया, सही? इस मामले में आप यह नहीं कह सकते हैं कि कोई त्रुटि है क्योंकि यह सुनिश्चित करने के लिए पर्याप्त संदर्भ नहीं है - या कड़ाई से बोलना उपरोक्त उदाहरण सही है यदि कोई अन्य कोड नहीं है। अब मैं आपकी टिप्पणी (+1) की सराहना करता हूं, मैं अभी भी चीजें सीख रहा हूं! इसलिए मैं उत्तर में उस बिंदु को स्पष्ट करने की कोशिश करूंगा, कृपया मुझे बताएं कि क्या यह बेहतर है ...
int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
ध्यान दें कि C ++ 11 'कॉन्स्टैक्सप्र' फ़ंक्शन को कॉल करने की अनुमति देता है:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
एक ही नाम स्थान के भीतर अनुवाद इकाई में, आमतौर पर शीर्ष पर:
// foo.h
struct foo
{
static const std::string s;
};
// foo.cpp
const std::string foo::s = "thingadongdong"; // this is where it lives
// bar.h
namespace baz
{
struct bar
{
static const float f;
};
}
// bar.cpp
namespace baz
{
const float bar::f = 3.1415926535;
}
केवल अभिन्न मान (उदाहरण के लिए static const int ARRAYSIZE
) को हेडर फ़ाइल में आरंभीकृत किया जाता है क्योंकि वे आमतौर पर क्लास हेडर में उपयोग किए जाते हैं जैसे कि किसी सरणी के आकार को परिभाषित करने के लिए। कार्यान्वयन फ़ाइल में गैर-अभिन्न मानों को प्रारंभ किया जाता है।
i
जाना चाहिए । §9.4.2 / 4 यदि एक स्थैतिक डेटा सदस्य कास्ट इंटीग्रल या कॉस्ट एन्यूमरेशन प्रकार का है, तो क्लास डेफिनेशन में इसकी घोषणा एक निरंतर- आरम्भक को निर्दिष्ट कर सकती है जो एक अभिन्न स्थिर अभिव्यक्ति (5.19) होगी। उस स्थिति में, सदस्य अभिन्न निरंतर अभिव्यक्तियों में प्रकट हो सकता है। सदस्य को अभी भी एक नाम-स्थान दायरे में परिभाषित किया जाएगा यदि यह कार्यक्रम में उपयोग किया जाता है और नेमस्पेस स्कोप परिभाषा में इनिशियलाइज़र नहीं होगा।