C++
परिवर्तनीय घोषणा कीवर्ड
खोज…
स्थिरांक
एक प्रकार का विनिर्देशक; जब एक प्रकार पर लागू किया जाता है, तो प्रकार का कॉन्स्ट-योग्य संस्करण तैयार करता है। देखें स्थिरांक कीवर्ड के अर्थ पर जानकारी के लिए const
।
const int x = 123;
x = 456; // error
int& r = x; // error
struct S {
void f();
void g() const;
};
const S s;
s.f(); // error
s.g(); // OK
decltype
इसके ऑपरेंड के प्रकार का उत्पादन करता है, जिसका मूल्यांकन नहीं किया जाता है।
यदि ऑपरेंड
e
बिना किसी अतिरिक्त कोष्ठक के एक नाम है, तोdecltype(e)
घोषित प्रकार काe
।int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
यदि ऑपरेंड
e
किसी भी अतिरिक्त कोष्ठक के बिना एक वर्ग का सदस्य अभिगम है, तोdecltype(e)
सदस्य की पहुंच का घोषित प्रकार है।struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
अन्य सभी मामलों में,
decltype(e)
की पैदावार दोनों प्रकार और मूल्य वर्ग अभिव्यक्ति कीe
, के रूप में इस प्रकार है:- यदि
e
टाइपT
का एक प्रकार है, तोdecltype(e)
T&
। - यदि
e
टाइपT
का एक xvalue है, तोdecltype(e)
T&&
। - यदि
e
टाइपT
decltype(e)
, तोdecltype(e)
T
।
इसमें बहिर्विरोधी कोष्ठक के साथ मामला शामिल है।
int f() { return 42; } int& g() { static int x = 42; return x; } int x = 42; decltype(f()) a = f(); // a has type int decltype(g()) b = g(); // b has type int& decltype((x)) c = x; // c has type int&, since x is an lvalue
- यदि
विशेष प्रपत्र decltype(auto)
अपने इनिशियलाइज़र से एक वैरिएबल के प्रकार को या auto
decltype
के टाइप डिडक्शन नियमों का उपयोग करते हुए, इसकी परिभाषा में return
स्टेटमेंट्स से किसी फंक्शन के return
प्रकार को decltype
।
const int x = 123;
auto y = x; // y has type int
decltype(auto) z = x; // z has type const int, the declared type of x
पर हस्ताक्षर किए
एक कीवर्ड जो कुछ पूर्णांक प्रकार के नामों का हिस्सा है।
- जब अकेले उपयोग किया जाता है, तो
int
निहित होता है, ताकिsigned
,signed int
, औरint
एक ही प्रकार के हों। - जब
char
के साथ संयुक्त किया जाता है, तोsigned char
प्रकार की पैदावार होती है, जोchar
से अलग प्रकार की होती है, भले हीchar
पर हस्ताक्षर किए गए हों।signed char
में एक सीमा होती है जिसमें कम से कम -127 से +127, समावेशी शामिल होते हैं। - जब
short
,long
, याlong long
के साथ संयुक्त किया जाता है, तो यह बेमानी है, क्योंकि उन प्रकार के पहले से ही हस्ताक्षरित हैं। -
signed
कोbool
,wchar_t
,char16_t
, याchar32_t
के साथ नहीं जोड़ा जा सकता है।
उदाहरण:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
अहस्ताक्षरित
एक प्रकार विनिर्देशक जो पूर्णांक प्रकार के अहस्ताक्षरित संस्करण का अनुरोध करता है।
- जब अकेले इस्तेमाल किया,
int
निहित है, इसलिएunsigned
के रूप में एक ही प्रकार हैunsigned int
। - प्रकार
unsigned char
प्रकार से अलग हैchar
भले ही,char
अहस्ताक्षरित है। यह कम से कम 255 तक पूर्णांक पकड़ सकता है। -
unsigned
कोshort
,long
, याlong long
के साथ जोड़ा जा सकता है। इसेbool
,wchar_t
,char16_t
, याchar32_t
के साथ नहीं जोड़ा जा सकता है।
उदाहरण:
char invert_case_table[256] = { ..., 'a', 'b', 'c', ..., 'A', 'B', 'C', ... };
char invert_case(char c) {
unsigned char index = c;
return invert_case_table[index];
// note: returning invert_case_table[c] directly does the
// wrong thing on implementations where char is a signed type
}
परिवर्तनशील
एक प्रकार का पात्र; जब एक प्रकार पर लागू किया जाता है, तो प्रकार का अस्थिर-योग्य संस्करण तैयार करता है। अस्थिर योग्यता उसी प्रकार की भूमिका निभाती है, जो टाइप सिस्टम में const
योग्यता के रूप में होती है, लेकिन volatile
वस्तुओं को संशोधित होने से नहीं रोकती है; इसके बजाय, यह संकलक को ऐसी वस्तुओं तक सभी पहुँच के साइड इफेक्ट के रूप में व्यवहार करने के लिए मजबूर करता है।
नीचे दिए गए उदाहरण में, यदि memory_mapped_port
अस्थिर नहीं थे, तो कंपाइलर फ़ंक्शन को ऑप्टिमाइज़ कर सकता है, ताकि यह केवल अंतिम लेखन करे, जो कि गलत होगा यदि sizeof(int)
1 से अधिक है। volatile
योग्यता इसे अपने sizeof(int)
का इलाज करने के लिए मजबूर करती है sizeof(int)
विभिन्न दुष्प्रभावों के रूप में लिखते हैं और इसलिए उनमें से सभी (क्रम में) करते हैं।
extern volatile char memory_mapped_port;
void write_to_device(int x) {
const char* p = reinterpret_cast<const char*>(&x);
for (int i = 0; i < sizeof(int); i++) {
memory_mapped_port = p[i];
}
}