C++ में constexpr बनाम const: क्या अंतर है? पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: C++ में स्थिरांकों की शाश्वत लड़ाई

\n\n

यदि आपने कभी C++ में लिखा है (या इसे सीखना भी शुरू किया है), तो आपने निश्चित रूप से const का सामना किया होगा। यह जादुई उपसर्ग वादा करता है कि चर का मान नहीं बदलेगा। लेकिन फिर C++11 आया और अपने साथ constexpr लेकर आया। और भ्रम शुरू हो गया।

\n\n

Stack Overflow पर प्रश्न "constexpr और const में क्या अंतर है?" ने सैकड़ों हज़ारों बार देखा गया है। सभी प्रकार के प्रोग्रामर इन दो अवधारणाओं को भ्रमित करते हैं, उन्हें पर्यायवाची के रूप में उपयोग करते हैं। लेकिन यह एक बड़ी गलती है!

\n\n

इस ट्यूटोरियल में, हम एक बार और हमेशा के लिए समझेंगे कि C++ में constexpr और const कैसे भिन्न हैं। आप जानेंगे:

\n
    \n
  • संकलन-समय स्थिरांक और रनटाइम स्थिरांक क्या होते हैं।
  • \n
  • क्यों const हमेशा प्रदर्शन के बारे में नहीं है।
  • \n
  • कैसे constexpr C++ को एक आधुनिक और सुरक्षित भाषा बनाता है।
  • \n
  • इनमें से प्रत्येक निर्माण का उपयोग कब करना चाहिए।
  • \n
\n\n

चलिए शुरू करते हैं! 🚀

\n\n

अध्याय 1. const: वादा, गारंटी नहीं

\n\n

आधार से शुरू करते हैं। C++ में const एक प्रकार क्वालिफायर है जो कंपाइलर को बताता है: "अरे, आरंभीकरण के बाद इस मान को बदला नहीं जा सकता"। यह सरल लगता है, लेकिन एक बारीकी है।

\n\n

उदाहरण 1: कार्य में const

\n\n
#include <iostream>\n\nint main() {\n    const int x = 42;  // वादा: x नहीं बदलेगा\n    // x = 100;        // संकलन त्रुटि — बढ़िया!\n    \n    std::cout << x;   // 42 प्रिंट करेगा\n    return 0;\n}
\n\n

सब कुछ सुंदर है। लेकिन क्या होगा यदि const चर का मान केवल रनटाइम के दौरान गणना किया जाता है?

\n\n

उदाहरण 2: const जो runtime में गणना होता है

\n\n
#include <iostream>\n\nint get_value() {\n    return 42;  // फ़ंक्शन मान लौटाता है\n}\n\nint main() {\n    const int y = get_value();  // अभी भी const?\n    // लेकिन y का मान केवल रनटाइम के दौरान ज्ञात होता है!\n    \n    // आइए इसे एक सरणी में उपयोग करने का प्रयास करें:\n    // int arr[y];  // त्रुटि! y संकलन-समय स्थिरांक नहीं है!\n    \n    return 0;\n}
\n\n

यह रहा मुख्य झटका! const चर को बदलने से बचाता है, लेकिन यह गारंटी नहीं देता कि इसका मान संकलन चरण में ज्ञात है। यदि मान किसी फ़ंक्शन से प्राप्त होता है, तो इसकी गणना केवल प्रोग्राम चलने पर ही होती है।

\n\n

मुख्य निष्कर्ष: const अपरिवर्तनीयता के लिए एक अनुबंध है, संकलन-समय गणना के लिए नहीं।

\n\n

अध्याय 2. constexpr: स्थिरांक जो कोड में रहते हैं

\n\n

यहाँ constexpr मंच पर आता है। यह विशिष्टक C++11 में दिखाई दिया और स्थिरांकों के दृष्टिकोण को मौलिक रूप से बदल दिया। constexpr का अर्थ है: "इस मान की गणना संकलन समय पर की जानी चाहिए"। या, कम से कम, इसकी गणना की जा सकती है।

\n\n

उदाहरण 3: constexpr चर

\n\n
#include <iostream>\n\nint main() {\n    constexpr int z = 42;  // गारंटी: मान compile-time में ज्ञात है\n    \n    int arr[z];  // काम करता है! z संकलन-समय स्थिरांक है\n    \n    std::cout << sizeof(arr) / sizeof(arr[0]);  // 42 प्रिंट करेगा\n    return 0;\n}
\n\n

अंतर स्पष्ट है: constexpr चर को वहाँ उपयोग करने की अनुमति देता है जहाँ कंपाइलर को सटीक मान जानने की आवश्यकता होती है — उदाहरण के लिए, सरणी आकार या टेम्पलेट पैरामीटर के लिए।

\n\n

उदाहरण 4: constexpr फ़ंक्शन

\n\n

लेकिन सबसे दिलचस्प बात फ़ंक्शन हैं। constexpr को फ़ंक्शन पर लागू किया जा सकता है, और फिर वे संकलन समय पर गणना कर सकते हैं, यदि सभी तर्क भी संकलन-समय स्थिरांक हों।

\n\n
#include <iostream>\n\nconstexpr int square(int x) {\n    return x * x;\n}\n\nint main() {\n    constexpr int result = square(5);  // compile-time में गणना होती है!\n    int arr[result];                   // काम करता है\n    \n    std::cout << result;  // 25\n    \n    int runtime_value =                

ब्लॉग

पुस्तक अनुशंसाएँ