Const-ness (Lecture 29)-apdzg2A90CI 55 KB
Newer Older
Vandan Mujadia's avatar
Vandan Mujadia committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
सी(C) ++ में प्रोग्रामिंग के मॉड्यूल 15 में आपका स्वागत है।
 इस मॉड्यूल में, हम कोंस्त-नेस्स(Const-ness) के बारे में चर्चा करेंगे।
 सी(C) ++ के कॉन्स्ट-नेसConst-ness) को समझने के लिए, ऑब्जेक्ट्स(objectives) इस मॉड्यूल के लिए मुख्य उद्देश्य होंगे और हम यह भी देखेंगे कि कैसे कॉन्स्ट-नेसConst-ness) को क्लास डिजाइन में इस्तेमाल किया जा सकता है।
 (स्लाइडसमय देखें: 00:51) जैसा कि रूपरेखा दी गई है, यह बाएं हाथ की ओर होगा।
 हम निरंतर वस्तुओं(constant objects) के बारे में बात करेंगे; मेम्बर कार्य(member functions); डेटा सदस्य एक विस्तृत उदाहरण लेते हैं और परस्पर डेटा सदस्यों पर भी चर्चा करते हैं।
 सबसे पहले, हम निरंतर वस्तुओं(constant objects) का परिचय देते हैं।
 हमने पहले कॉन्स्ट-नेसConst-ness) देखा है जब हमने सी(C) ++ के प्रक्रियात्मक विस्तार, बेहतर सी(C) ++ भाग के बारे में बात की थी।
 हमने देखा था कि यदि हम किसी वस्तु को स्थिर(constant) बनाते हैं, या एक डेटा स्थिरांक(constant), एक चर स्थिरांक(constant) तो उसे बदला नहीं जा सकता है; कि आरंभीकरण समय पर एक मूल्य निर्धारित किया गया है और उसके बाद, उस मूल्य को बदला नहीं जा सकता है।
 तो, यह हमने अंतर्निहित(built-in) प्रकार के डेटा के लिए देखा था – इंट(int), डबल(double), पॉइंटर(pointer) और इतने पर।
 अब वही काम C ++ ऑब्जेक्ट्स(objects) के साथ किया जा सकता है।
 तो, हम ध्यान दें कि एक निर्मित(built-in) प्रकार की वस्तुओं की तरह, उपयोगकर्ता परिभाषित प्रकार की वस्तुओं को भी स्थिर(constant) बनाया जा सकता है।
 अब, स्वाभाविक रूप से यदि किसी वस्तु को स्थिर(constant) बनाया जाता है, तो उसके किसी भी डेटा सदस्य को नहीं बदला जा सकता है; ऑब्जेक्ट(object) में एक या अधिक डेटा सदस्य होते हैं।
 एक बार जब आप इसे स्थिर(constant) कर देते हैं तो उनमें से कोई भी नहीं बदला जा सकता है।
 किसी ऑब्जेक्ट(object) को स्थिर(constant) बनाने का प्राथमिक परिणाम यह है कि इसका प्रकार इस पॉइंटर(pointer) है।
 हमें याद है कि यह पॉइंटर उस पते को संदर्भित करता है जहाँ यह ऑब्जेक्ट(object) रहता है, यह पॉइंटर(pointer) अब एक स्थिर(constant) ऑब्जेक्ट(object) का पॉइंटर(pointer) बन जाता है।
 इसलिए, पहले जब हमने इस पॉइंटर(pointer) को पेश किया, तो हमने देखा कि यह इस पॉइंटर(pointer) का प्रकार है, यह क्लास के ऑब्जेक्ट(object) के लिए एक निरंतर पॉइंटर(pointer) है, लेकिन अब यह क्लास के एक स्थिर(constant) ऑब्जेक्ट(object) के लिए एक निरंतर पॉइंटर(pointer) बन जाता है।
 तो, इस कोंस्त(const) को इस पॉइंटर(pointer) के प्रकार में पेश करना एक वस्तु को स्थिर(constant) घोषित करने का परिणाम है।
 स्वाभाविक रूप से, एक स्थिर(constant) वस्तु कक्षा के सामान्य तरीकों का आह्वान नहीं कर सकती है।
 यह समझ में आता है क्योंकि हम कह रहे हैं कि किसी स्थिर(constant) ऑब्जेक्ट(object) को ऑब्जेक्ट(object) के डेटा सदस्यों को बदलने की अनुमति नहीं दी जानी चाहिए।
 अब, सीधे बदलने के बजाय, यदि कोई विधि लागू की जाती है, तो वह विधि बदले में डेटा सदस्य को बदल सकती है।
 इसलिए, यह बताने के लिए कि निरंतर ऑब्जेक्ट्स(objects) को डेटा सदस्य को आमंत्रित करने की अनुमति नहीं है, हम सदस्य कार्यों को लागू करते हैं।
 हम देखेंगे, इसके बावजूद कि निरंतर वस्तुएं(constant objects) वास्तव में कैसे कार्य कर सकती हैं।
 (स्लाइडसमय देखें: 03:43) तो, आइए इसे समझने के लिए सबसे पहले एक उदाहरण लेते हैं।
 तो, यहाँ एक गैर स्थिर वस्तु(non constant object) का एक उदाहरण है।
 तो, इस गैर स्थिर वस्तु(non constant object) में दो सदस्य हैं, एक जो निजी है।
 तो, इस गैर स्थिर वस्तु में एक निजी सदस्य और एक सार्वजनिक सदस्य है।
 इसलिए, हमने दो सदस्य कार्य शुरू किए हैं; सदस्य प्राप्त करें और निजी सदस्य को पढ़ने और लिखने के लिए सदस्य सेट करें और स्वाभाविक रूप से सार्वजनिक सदस्य को सीधे पढ़ा या लिखा नहीं जा सकता है।
 तो, यहां एक एप्लिकेशन है जो निजी सदस्य को पढ़ने की कोशिश कर रहा है, निजी सदस्य को लिखता है, सार्वजनिक सदस्य को पढ़ता है और सभी वस्तु को प्रिंट करता है।
 तो, ये सभी ठीक काम करेंगे आप पहले से ही इसे अच्छी तरह से समझते हैं।
 अब, हम एक स्थिर वस्तु(constant object) लेते हैं।
 तो, एक ही उदाहरण, जो अंतर हम बना रहे हैं वह अब है; आपने वस्तु को स्थिर बना दिया है।
 इसलिए, वस्तु की घोषणा से पहले हमने कोंस्त(const) लिखा है।
 तो, इस ऑब्जेक्ट(object) द्वारा मेरी कोंस्त(const) ओब्ज एक स्थिर ऑब्जेक्ट(constant object) बन जाती है, बाकी क्लास समान होती है।
 यह केवल उस वस्तु का उपयोग है जिसे हमने निरंतर बनाया है, अब इसके साथ ही आप देखेंगे कि इन चारों का उपयोग संकलन-कोंपिलतिओन(compilation) त्रुटि देता है।
 इसलिए, पहले मामले में यह एक सदस्य को निजी सदस्य को पढ़ने और इसे प्रिंट करने के लिए आमंत्रित करने की कोशिश कर रहा है।
 अब, यह एक त्रुटि(error) देता है जैसा कि आप यहां देख सकते हैं, यह कहता है कि इस पॉइंटर फॉर्म कोंस्त(const) myClass को myClass & मे परिवर्तित नहीं कर सकता है।
 हम वास्तव में इसका क्या मतलब है, इसके बारे में थोड़ा अधिक समझेंगे, लेकिन नीचे की रेखा लेने के लिए, कंपाइलर(compiler) कह रहा है कि चूंकि ऑब्जेक्ट स्थिर है, आप इसका उपयोग सदस्य फ़ंक्शन(function) को आमंत्रित करने के लिए नहीं कर सकते।
 एक ही त्रुटि सेट सदस्य के इस मामले में प्राप्त की जाती है, प्रिंट त्रुटि(error) 1, 2 और 4 के मामले में, वे सभी एक ही त्रुटि(error) देते हैं और अगर हम जनता के सदस्य को सीधे लिखने की कोशिश करते हैं जैसा कि हम यहां करने की कोशिश कर रहे हैं; एक सार्वजनिक सदस्य है।
 इसलिए, यदि हम सीधे इस सार्वजनिक सदस्य को लिखने का प्रयास करते हैं, तो हमें एक अलग त्रुटि(error) मिलती है, जो कहती है कि ऑब्जेक्ट(object) स्थिर(constant) होने पर आप डेटा सदस्य को असाइन नहीं कर सकते।
 तो, यह सुनिश्चित करता है कि यदि वस्तु को स्थिर(constant) घोषित किया जाता है तो हम उस वस्तु के माध्यम से उस विशेष वर्ग के डेटा सदस्य के कार्यों को एक्सेस या बदल नहीं सकते हैं।
 अब, स्वाभाविक रूप से इसके एक तरफ उद्देश्य को प्राप्त करता है क्योंकि यह डेटा सदस्यों की सुरक्षा करने में सक्षम रहा है, निरंतर होने के कारण इसे डेटा सदस्यों की सुरक्षा करना है जो उन्हें बदला नहीं जा सकता है, लेकिन अब दूसरी तरफ यह मूल रूप से उद्देश्य को हरा देता है, क्योंकि उदाहरण के लिए, अगर मैं सिर्फ यहाँ की तरह पढ़ना चाहता था, मैं सिर्फ निजी सदस्य को पढ़ना चाहता था, तो मैं ऐसा करने में सक्षम नहीं हो रहा हूँ या मैं सिर्फ ऑब्जेक्ट(object) को प्रिंट करना चाहता था।
 मैं ऐसा इसलिए भी नहीं कर सकता क्योंकि मैं किसी भी सदस्य समारोह को लागू नहीं कर सकता।
 तो, हमें ऐसा करने में सक्षम होने के लिए C ++ में एक और समर्थन की आवश्यकता है, अर्थात निरंतर सदस्य कार्यों के लिए, निरंतर वस्तुओं के लिए हमें निरंतर सदस्य कार्यों को शुरू करने की आवश्यकता है।
 हम देखेंगे कि यह कैसे किया जाएगा।
 इसलिए, C ++ में कॉन्स्ट-नेस(Const-ness) का समर्थन करने के लिए निरंतर सदस्य फ़ंक्शन एक नई सुविधा है।
 यह एक अन्य सदस्य फ़ंक्शन की तरह है, केवल अंतर यह है कि फंक्शन प्रोटोटाइप(function prototype) के बाद निरंतर सदस्य फ़ंक्शन में हेडर; यह शीर्ष लेख भाग है और यह फ़ंक्शन का मुख्य भाग है।
 इन दोनों के बीच में, आप कीवर्ड कॉन्स्ट(keyword const) लिखते हैं और जब आप इस कीवर्ड कॉन्स्ट(keyword const) को लिखते हैं, तो सदस्य फ़ंक्शन को एक स्थिर(constant) सदस्य फ़ंक्शन कहा जाता है।
 अब, यह क्या करता है, जैसा कि हम सभी जानते हैं कि जब कोई ऑब्जेक्ट(object) वर्ग के सदस्य फ़ंक्शन को आमंत्रित करना चाहता है, तो उस ऑब्जेक्ट(object) का पता उस सदस्य फ़ंक्शन में इस पॉइंटर(pointer) के रूप में पास हो जाता है और हम इस पॉइंटर(pointer) के प्रकार को जानते हैं।
 अब, जब आप निरंतर सदस्य फ़ंक्शन की घोषणा करते हैं तो यह पॉइंटर(pointer) जो पास हो जाता है, उसके हस्ताक्षर में बदल जाता है।
 यह अब है, एक स्थिर ऑब्जेक्ट के लिए एक संकेतक क्योंकि आप कह रहे हैं कि सदस्य पॉइंटर(pointer) एक स्थिर सदस्य फ़ंक्शन है, इसलिए कंपाइलर क्या जोर देना चाहता है; केवल निरंतर ऑब्जेक्ट(object) ही इस सदस्य फ़ंक्शन को लागू कर सकते हैं।
 तो, हम पहले ही देख चुके हैं कि स्थिर वस्तुओं में इस प्रकार का पॉइंटर(pointer) फीचर होता है, जो निरंतर पॉइंट होते हैं निरंतर ऑब्जेक्ट(objects) और निरंतर सदस्य फ़ंक्शन को उसी प्रकार के इस पॉइंटर(pointer) की आवश्यकता होती है।
 तो, अब, यह संभव है कि एक स्थिर ऑब्जेक्ट(object) इस निरंतर सदस्य फ़ंक्शन को लागू करने में सक्षम होगा।
 इसका परिणाम यह है कि यहाँ क्या दिया गया है, यदि कोई सदस्य कार्य स्थिर है तो उस फ़ंक्शन में कोई डेटा सदस्य नहीं बदला जा सकता है।
 इसलिए, यदि हमारे पास सेट सदस्य फ़ंक्शन है और यदि हम यह घोषणा करते हैं कि एक स्थिर सदस्य फ़ंक्शन है।
 तो, एक स्थिर वस्तु इसे लागू कर सकती है तब हमें एक संकलन त्रुटि मिलेगी क्योंकि इस फ़ंक्शन में हम इसे असाइनमेंट(assignment) बनाकर डेटा सदस्य को बदलने का प्रयास कर रहे हैं।
 इसलिए, एक निरंतर सदस्य फ़ंक्शन का योग करने के लिए केवल डेटा सदस्यों को पढ़ने के लिए केवल डेटा सदस्यों तक पहुंचने के लिए निरंतर ऑब्जेक्ट्स(objects) का उपयोग किया जा सकता है, लेकिन उनका उपयोग डेटा सदस्यों को लिखने या बदलने के लिए नहीं किया जा सकता है और किसी भी मामले में गैर निरंतर सदस्य कार्यों को लागू नहीं किया जा सकता है निरंतर वस्तु द्वारा।
 इसलिए, इन दोनों के संयोजन से, हम इस उद्देश्य को प्राप्त करते हैं कि एक स्थिर ऑब्जेक्ट(object) केवल डेटा सदस्यों को बनाए रख सकता है जो पहले से ही समान मान रखता है, लेकिन यह डेटा सदस्यों के मूल्यों को बदलने की अनुमति नहीं दे सकता है।
 अब, यहां अगला बिंदु भी दिलचस्प है कि एक गैर स्थिर वस्तु एक निरंतर सदस्य फ़ंक्शन को आमंत्रित कर सकती है।
 यह सरल है क्योंकि एक निरंतर सदस्य फ़ंक्शन यह गारंटी देता है कि यह किसी ऑब्जेक्ट(object) में बदलाव नहीं करेगा, यदि ऑब्जेक्ट(object) स्वयं ही स्थिर नहीं है, तो हमें परवाह नहीं है कि यह बदला गया है या इसे बदला नहीं गया है।
 तो, आप कह रहे हैं कि यह एक गैर स्थिर वस्तु है और इस पर एक निरंतर सदस्य कार्य करता है, यह कहता है कि, मैं कोई परिवर्तन नहीं करूँगा कोई विरोधाभास नहीं है।
 तो संक्षेप में, एक गैर स्थिर ऑब्जेक्ट(object) निरंतर सदस्य फ़ंक्शन के साथ-साथ गैर निरंतर सदस्य फ़ंक्शन को भी आमंत्रित कर सकता है, लेकिन एक स्थिर ऑब्जेक्ट(object) केवल निरंतर सदस्य फ़ंक्शन को आमंत्रित कर सकता है।
 इसलिए, सभी सदस्य फ़ंक्शंस जिन्हें किसी ऑब्जेक्ट(object) को बदलने की आवश्यकता नहीं है, उन्हें यह सुनिश्चित करने के लिए निरंतर सदस्य फ़ंक्शन के रूप में घोषित किया जाना चाहिए कि कोई भी निरंतर ऑब्जेक्ट(object) उनका उपयोग भी कर सकता है, उन सदस्य फ़ंक्शंस को भी आमंत्रित कर सकता है।
 आइए, हम फिर से एक उदाहरण देखें।
 हम उसी उदाहरण पर वापस लौटेंगे, अब हम क्या कर रहे हैं, हम सदस्य कार्यों को देखेंगे और तय करेंगे कि उन्हें स्थिर होना चाहिए या उन्हें स्थिर नहीं होना चाहिए; प्राप्त सदस्य केवल एक मान पढ़ रहा है जिससे आप इसे निरंतर बनाते हैं, प्रिंट केवल पढ़ने के लिए है और डेटा सदस्यों के मुद्रण मूल्य इसे निरंतर बनाएंगे, लेकिन यह एक, सेट सदस्य हम एक निरंतर सदस्य कार्य नहीं कर सकते क्योंकि सेट सदस्य डेटा बदलने का इरादा रखता है सदस्य।
 यदि हमारे पास अभी दो वस्तुएं हैं, एक गैर स्थिर और एक स्थिर, तो जैसा कि आप देख सकते हैं कि गैर स्थिर वस्तु सभी परिवर्तन कर सकती है जैसा कि हमने पहले देखा है।
 लगातार ऑब्जेक्ट(object) अब प्राप्त सदस्य फ़ंक्शन को आमंत्रित कर सकता है क्योंकि यह एक निरंतर सदस्य फ़ंक्शन है और myprime सदस्य डेटा का मूल्य पढ़ता है।
 यह प्रिंट(print) कर सकता है क्योंकि प्रिंट(print) एक निरंतर सदस्य कार्य है, लेकिन यह इनमें से कोई भी नहीं कर सकता है, इसीलिए मैंने उनकी टिप्पणी की है।
 यह न तो निजी सदस्य के मूल्य को बदलने के लिए सेट सदस्य को आमंत्रित कर सकता है; क्योंकि सेट सदस्य एक गैर स्थिर सदस्य फ़ंक्शन है जिसे निरंतर ऑब्जेक्ट(object) द्वारा और निश्चित रूप से नहीं लगाया जा सकता है, यह सीधे सार्वजनिक सदस्य को असाइनमेंट नहीं कर सकता है क्योंकि यह एक निरंतर ऑब्जेक्ट(object) है।
 तो, यह, हम इस उद्देश्य को प्राप्त करते हैं कि हम वास्तव में नियंत्रित कर सकते हैं जो एक सदस्य के कार्यों को निरंतर ऑब्जेक्ट(object) द्वारा आमंत्रित किया जा सकता है और डेटा सदस्यों के सभी मूल्यों की रक्षा कर सकता है क्योंकि वे निर्माण के समय निर्धारित किए गए हैं।
 अब, हम एक तीसरे प्रकार का कॉन्स्ट-नेस(Const-ness) पेश करते हैं जो C ++ सपोर्ट(support) करता है।
 हमने केवल निरंतर वस्तुओं के बारे में बात की है, जहां अगर मैं किसी वस्तु को स्थिर बनाता हूं तो उस वस्तु का पूरा भाग स्थिर है।
 मैं सिर्फ उस वस्तु में कोई बदलाव नहीं कर सकता, कोई भी डेटा(Data) सदस्य नहीं बदला जा सकता है, लेकिन अक्सर हमें जिस चीज की आवश्यकता होती है, हमें कुछ डेटा(Data) सदस्यों को बदलने की आवश्यकता होगी जबकि कुछ अन्य डेटा(Data) सदस्यों को स्थिर रहना चाहिए और मैंने कई उदाहरणों का उल्लेख किया है।
 उदाहरण के लिए, यहां कर्मचारी रिकॉर्ड बनाना और उस कर्मचारी रिकॉर्ड के लिए आपके पास कर्मचारी आईडी है, आपके पास जन्म तिथि है।
 निश्चित रूप से, एक बार रिकॉर्ड बन जाने के बाद, हम उम्मीद नहीं करते हैं कि कर्मचारी आईडी बदल सकते हैं और निश्चित रूप से, जन्म तिथि नहीं बदल सकते हैं, लेकिन एक ही रिकॉर्ड एक ही वस्तु का पदनाम, पता, वेतन होगा, इन सभी को परिवर्तनशील होना चाहिए क्योंकि प्रोग्रामिंग(programming) क्या है।
 इसलिए, कई अन्य उदाहरण यदि मैं एक छात्र के साथ काम कर रहा हूं तो फिर से रोल नंबर, जन्म तिथि गैर परिवर्तनशील होना चाहिए, यदि हम क्रेडिट कार्ड के उदाहरण के बारे में बात कर रहे हैं तो हमने पहले चर्चा की थी, तब कार्ड सुन्नएर और कार्ड का धारक गैर परिवर्तनशील होना चाहिए, जबकि कार्डों की एक निश्चित अवधि होती है।
 इसलिए, एक बार जब वे खत्म हो जाते हैं, तो हम कार्ड को फिर से जारी करना चाहते हैं।
 इसलिए, समाप्ति की तारीख जारी करने की तिथि, इन सभी को बदल देगा cvv यहां तक कि धारक आवेदन कर सकता है और एक पता के लिए बदल सकता है।
 तो, यह परिवर्तनशील होना चाहिए।
 तो, निरंतर डेटा(data) सदस्य इस तरह का चयन करने के लिए एक विशेषता है कि चयनात्मक कॉन्स्ट-नेस(Const-ness) ऑब्जेक्ट(object) का एक हिस्सा है।
 तो, हम इसकी घोषणा के सामने एक कोंस्त कीवर्ड(const keyword) का उपयोग करके डेटा(data) सदस्यों को स्थिर बनाकर ऐसा करते हैं।
 इसलिए, एक स्थिर डेटा(data) सदस्य को तब भी नहीं बदला जा सकता है जब ऑब्जेक्ट(object) स्थिर नहीं होता है।
 बेशक, यदि कोई वस्तु स्थिर है, तो कुछ भी नहीं बदला जा सकता है, लेकिन फिर भी यदि कोई वस्तु निरंतर नहीं है, तो निरंतर डेटा(data) सदस्य इसके मूल्य को बदलने में सक्षम नहीं होगा, इसलिए इसे ऑब्जेक्ट(object) के आरंभीकरण के समय निर्धारित किया जाना चाहिए।
 तो, हम इस पर ध्यान दें।
 अब, हमारे पास एक उदाहरण है जहां हमारे दो निजी सदस्य हैं, यह एक निरंतर स्थिरांक है और यह एक निरंतर है, हमने इस कॉन्स्ट कीवर्ड(const keyword) को डालकर इसे निरंतर बना दिया है।
 इसी तरह, मैंने दो सार्वजनिक डेटा सदस्यों को दिखाया है, उनमें से एक निरंतर है, और दूसरा गैर निरंतर है।
 हमारे पास निर्माणकर्ता हैं जो इन सभी को आरंभ करते हैं और हमारे पास इन सभी सदस्यों के लिए सेट है।
 स्वाभाविक रूप से, क्या होगा यदि मैं कह रहा हूं कि मेरा यह डेटा(data) सदस्य स्थिर है, तो मैं इसे बदलने की उम्मीद नहीं करता हूं।
 इसलिए, जब हम इस डेटा(data) सदस्य पर एक सेट फ़ंक्शन लिखने का प्रयास करते हैं जो कि cprimem के लिए एक मान प्रदान करेगा, तो कंपाइलर(compiler) आपको एक त्रुटि देता है क्योंकि यदि यह बिना किसी त्रुटि के संकलित कर सकता है, तो एक वस्तु इस पर आक्रमण करने और डेटा सदस्य को परिवर्तन करने में सक्षम होगी।
 यह समझने के लिए सावधान रहें कि, इस मामले में सदस्य फ़ंक्शन को एक सदस्य फ़ंक्शन होने की आवश्यकता नहीं है।
 यह एक नॉन कॉन्स्ट(non const) मेंबर फंक्शन है, लेकिन आपको त्रुटि मिलने का कारण यह होगा क्योंकि वह सदस्य, वह डेटा(data) सदस्य जो आप बदलना चाहते हैं, को स्थिर घोषित किया गया है।
 इसलिए, सेट फ़ंक्शन को लागू नहीं किया जा सकता है।
 इसी तरह, यदि आप इस पंक्ति को देखते हैं, जहां हम सार्वजनिक डेटा सदस्य को मान देने की कोशिश कर रहे हैं, जिसे निरंतर घोषित किया गया है, तो हमें कंपाइलर(compiler) से एक और त्रुटि मिलेगी क्योंकि यदि आप सार्वजनिक डेटा(data) सदस्य की घोषणा को देखते हैं, तो सार्वजनिक डेटा(data) सदस्य को स्थिर घोषित किया गया है।
 तो, यह परिवर्तनशील नहीं होना चाहिए।
 तो, यह है कि डेटा(data) सदस्यों के सामने कोंस्त-नेस(const-ness) का उपयोग करके आप चुनिंदा रूप से डेटा(data) सदस्यों को स्थिर बना सकते हैं, जबकि हम बदलाव करने में सक्षम हैं, उदाहरण के लिए, हम यहां इस विशेष के लिए असाइनमेंट(assignment) बना रहे हैं डेटा सदस्य, जो कि सार्वजनिक सदस्य है और यह असाइनमेंट(assignment) आपको कोई त्रुटि नहीं देता है, हम इसे बदल रहे हैं, जिसकी अनुमति भी है क्योंकि यह निरंतर सदस्य नहीं है।
 तो, अब हम अपने क्रेडिट कार्ड उदाहरण में फिर से नज़र डालते हैं और देखते हैं कि क्रेडिट कार्ड वर्ग के बेहतर डिज़ाइन(design) के लिए निरंतर डेटा(data) सदस्य का उपयोग कैसे किया जा सकता है।
 इन सभी कोडस और क्लास डिज़ाइन(class design) को आपने पहले ही देख लिया है।
 इसलिए, मैं उन्हें नहीं दोहराऊंगा, बस जो छोटे बदलाव किए गए हैं, उन पर ध्यान दें, उदाहरण के लिए, यदि आप इस स्ट्रिंग क्लास को देखते हैं तो हमने यहां पेश किया है।
 हमने कॉपी कंस्ट्रक्टर(constructor) और कॉपी असाइनमेंट(assignment) ऑपरेटर(operator) को पेश किया है, यह एक मॉड्यूल 14 में चर्चा की गई थी और महत्वपूर्ण रूप से प्रिंट फ़ंक्शन में, हमने एक कास्ट पेश किया है क्योंकि जैसा कि आपने कहा, प्रिंट फ़ंक्शन से किसी भी डेटा सदस्य को बदलने की उम्मीद नहीं है और हमारे पास बस है सीखा कि कोई भी सदस्य फ़ंक्शन जो डेटा सदस्यों को नहीं बदलता है, को यह सुनिश्चित करने के लिए निरंतर सदस्य फ़ंक्शन के रूप में घोषित किया जाना चाहिए कि विज्ञापन में कोई निरंतर ऑब्जेक्ट(object) इसे बदल नहीं सकता है।
 इसलिए, हम यह सभी प्रिंट फ़ंक्शंस कोंस्त(const) के रूप में करेंगे।
 तिथि वर्ग; फिर से दिनांक वर्ग में हमने प्रतिलिपि के लिए प्रावधान प्रदान किए हैं और हम इन सभी कार्यों को प्रिंट, मान्य तिथि, दिन, इन सभी कार्यों को कॉन्स्ट(const) सदस्य के रूप में पूरा कर चुके हैं जैसा कि प्रोटोकॉल(protocol) है जिसमें हम सहमत हुए हैं।
 नाम वर्ग फिर से प्रतियां जोड़ दी जाती हैं और प्रिंट फ़ंक्शन को एक निरंतर सदस्य फ़ंक्शन में बनाया गया है।
 हमने इस वर्ग को पहले भी देखा है इसका उपयोग किसी भी व्यक्ति के नाम को परिभाषित करने के लिए किया जा सकता है।
 पता वर्ग की प्रति जोड़ी जाती है और मुझे लगता है कि प्रिंट फ़ंक्शन को एक निरंतर सदस्य फ़ंक्शन बना दिया गया है।
 अब, अंत में, हम क्रेडिट कार्डस(credit cards) वर्ग के साथ हैं, जो इस स्ट्रिंग तिथि, नाम, पते का उपयोग करता है, इन सभी वर्गों और हमारे पास डेटा(data) सदस्यों और कार्यक्षमता का एक ही सेट है।
 अब, हम क्या करते हैं, हम कई निर्धारित विधियों का परिचय देते हैं।
 पहले हम सिर्फ क्रेडिट कार्ड ऑब्जेक्ट(credit card object) का निर्माण करते रहे हैं और इसे प्रिंट करते रहे हैं।
 अब, हमने कई सेट विधियों की शुरुआत की है, जिनके द्वारा क्रेडिट कार्ड(credit card) ऑब्जेक्ट(object) के विभिन्न डेटा(data) सदस्यों को बदला जा सकता है, जो कि मैं एक नए धारक का नाम सेट कर सकता हूं, मैं पता सेट कर सकता हूं, मैं इश्यू डेट सेट कर सकता हूं और इसी तरह पर और निश्चित रूप से, प्रिंट को स्थिर बनाया गया है।
 तो, यह वह परिवर्तन है जो हमने किया है और इसके साथ ही देखते हैं कि परिणाम क्या होते हैं।
 इसलिए, यदि आप क्रेडिट कार्ड(credit card) एप्लिकेशन को देखते हैं।
 अब, एप्लिकेशन में हमने परिवर्तन करने के लिए सेट सदस्यों का उपयोग किया है।
 इसलिए, इन सभी परिवर्तनों को मूल रूप से बनाया गया था, यह वस्तु शर्लक होम्स के लिए निश्चित पते और कुछ निश्चित तिथियों के लिए बनाई गई थी और अब, इसे अलग-अलग पते के साथ एक अलग धारक के नाम के लिए संपादित किया गया है और इसी तरह।
 इसलिए, हम इन सभी अलग-अलग क्षेत्रों को बदल सकते हैं जो ठीक हैं, लेकिन परेशान करने वाली बात यह है कि हम धारक के नाम को बदलने में सक्षम हैं जो कि क्रेडिट कार्ड(credit card) जारी करने की प्रणाली के अनुसार संभव नहीं होना चाहिए।
 कुछ लोगों को कार्ड जारी करना किसी और को जारी नहीं किया जा सकता है।
 इसलिए, हमें धारक का नाम बदलने की इस संभावना को रोकना होगा।
 तो, यह वह जगह है जहां हम अब निरंतर डेटा(data) सदस्य के उपकरण का उपयोग करेंगे।
 तो, अब हम क्या करते हैं, हमने सीखा है कि यह कैसे करना है।
 यदि हम नहीं चाहते हैं कि धारक का नाम बदला जाए, तो धारक के नाम की घोषणा से पहले हमने एक प्रस्ताव रखा।
 इसलिए, धारक का नाम अब एक निरंतर डेटा सदस्य बन जाता है।
 इसलिए, क्रेडिट ऑब्जेक्ट(object) में इसे संपादित नहीं किया जा सकता है जिसका अर्थ है कि सेट होल्डर(holder) फ़ंक्शन जिसे हमने सेट होल्डर(holder) फ़ंक्शन लिखा था अब त्रुटि हो जाती है क्योंकि यह उस धारक को असाइन करने का प्रयास कर रहा है जो इस स्थिरांक को परिभाषित करता है।
 तो, आपको यह कहते हुए कुछ कंपाइलर(compiler) एरर(error) मिलेंगे कि आपके पास इस तरह का फंक्शन नहीं हो सकता।
 यदि मेरे पास इस प्रकार का कोई कार्य नहीं हो सकता है, तो स्वाभाविक रूप से मैं धारक का नाम नहीं बदल सकता।
 तो, हम उस उद्देश्य को प्राप्त करते हैं।
 तो, यह सिर्फ उसी वर्ग को साफ किया गया है।
 हमने अब सेट होल्डर(holder) फ़ंक्शन को हटा दिया है क्योंकि उस फ़ंक्शन को संकलित नहीं किया जा सकता है और इसलिए, सेट होल्डर(holder) को बदलने का कोई तरीका नहीं है और हम इसका उपयोग भी करेंगे।
 फिर से एक बार आवेदन के माध्यम से जाना।
 अब, आवेदन में, हमारे पास यह टिप्पणी की गई है कि यह नहीं किया जा सकता है, लेकिन बाकी बदलाव अभी भी किए जा सकते हैं।
 वे अभी भी पता, मुद्दे की तारीख और उन सभी को बदल सकते हैं।
 तो, हम सुरक्षित हैं, लेकिन यह अभी भी संभव है कि मैं वास्तव में कार्ड नंबर(card number) को ही बदल सकता हूं।
 मैं कार्ड नंबर(card number) संपादित कर सकता हूं या कार्ड नंबर(card number) बदल सकता हूं, अलग कार्ड नंबर(card number) डाल सकता हूं।
 तो, हम उस से कैसे बचाव करते हैं? हम कैसे ध्यान रखें कि इसे बदला नहीं जा सकता है? इसके लिए हमें यह देखना होगा कि कार्ड नंबर(card number) एक पॉइंटर वैरिएबल है।
 इसलिए, इसे आवंटित किया जाना चाहिए और यह एक स्ट्रिंग को इंगित करेगा।
 तो, दो तरीके हैं जिनसे कार्ड नंबर(card number) प्रभावित हो सकता है, एक यह है कि मैं इस पॉइंटर को आगे बढ़ा सकता हूं और स्ट्रिंग को बदल सकता हूं, मैं ऑब्जेक्ट(object) को खुद ही एडिट कर सकता हूं।
 दूसरा यह है कि मैं एक नई वस्तु को पुनः प्राप्त कर सकता हूं और कार्ड संख्या के स्थान पर रख सकता हूं वह है मैं इसे पुनः प्राप्त कर सकता हूं।
 तो, यह इस तरह की स्थिति है कि यह एक कार्ड नंबर(card number) है, यहां कार्ड नंबर 4, 3, 8, 6 और इसी तरह का एक आवंटन है।
 इसलिए, मैं इसे संपादित कर सकता हूं या बदल सकता हूं, नया कार्ड नंबर(card number) जोड़ सकता हूं।
 इसलिए इन दोनों को रोकना होगा।
 यह संभव नहीं होना चाहिए और हम इस स्थिति पर चर्चा करते हैं, जहां हमने पॉइंटर्स के कोंस्त-नेस(const-ness) के बारे में चर्चा की कि यहां हमें क्या चाहिए हमें पॉइंटर के साथ-साथ दोनों को स्थिर होने के लिए पॉइंटेड ऑब्जेक्ट(object) की आवश्यकता है।
 तो, यह वही है जो हम बस करते हैं, हम इसे एक निरंतर सूचक बनाते हैं और हम इसे निरंतर स्ट्रिंग स्थिर वस्तु की ओर इंगित करते हैं और इसके साथ यह संभव नहीं होना चाहिए, इसे बदलना संभव नहीं होगा यह, लेकिन अब यह एक अलग तरह की समस्या का सामना करता है।
 समस्या यह है कि निर्माणकर्ता के शरीर में इसे कैसे आरम्भ किया गया था, आप यह जानते हैं कि इस बिंदु पर जिस वस्तु का निर्माण किया गया है, आरंभीकरण समाप्त हो गया है और इसमें हमने कार्ड के सदस्य को आरंभीकृत नहीं किया है क्योंकि लिखने के लिए काफी कुछ कोड हैं, आरंभ करें।
 आपको उस स्ट्रिंग को आवंटित करना होगा जो हम यहां करते हैं।
 इससे पहले हमें स्ट्रिंग की लंबाई प्राप्त करनी होगी फिर हम स्ट्रिंग को आवंटित करते हैं और फिर हम इसमें दी गई संख्याओं को कॉपी करते हैं।
 इसलिए, हमने कंस्ट्रक्टर(constructor) के शरीर में ऐसा करने का फैसला किया, लेकिन अब जब यह एक निरंतर सूचक बन गया है तो यह असाइनमेंट(assignment) संभव नहीं है, क्योंकि कार्ड के सदस्य को पहले से ही आगे की सूची में आरंभीकृत किया जा चुका है, ऑब्जेक्ट(object) स्वयं स्थिर है।
 यह प्रतिलिपि संभव नहीं है क्योंकि वस्तु भी स्थिर है, यह एक स्थिर वस्तु की ओर इशारा करती है।
 इसलिए, अगर मैं स्ट्रैपी(strcpy) करता हूं, अगर मैं स्ट्रिंग की नकल करता हूं तो मैं वास्तव में उस स्ट्रिंग ऑब्जेक्ट को बदल रहा हूं।
 तो, ये दोनों एक त्रुटि देंगे।
 इसलिए, हमें यह सुनिश्चित करना होगा कि हमें इस बात का ध्यान रखना होगा कि हम वास्तव में इन सभी कार्यों को आरंभीकरण सूची में ही करते हैं।
 हम कंस्ट्रक्टर(constructor) के शरीर में ऐसा नहीं कर पाएंगे।
 अब, अगर आप ध्यान से देखें, तो हमने यहाँ कार्ड मेंबर के इनिशियलाइज़ेशन(initialization) को पेश किया है।
 कृपया इसे समझने की कोशिश करें, इस अभिव्यक्ति की थोड़ी जटिलता से घबराएं नहीं, अगर आप एक-एक करके सी नंबर मूल रूप से दिए गए कार्ड स्ट्रिंग(string) हैं।
 तो, पहले हम इसकी लंबाई का पता लगाते हैं फिर हम इसके लिए एक आवंटन बनाते हैं।
 तो, हमें एक पॉइंटर मिलता है जिसमें पर्याप्त जगह होती है जहां कार्ड नंबर डाला जा सकता है और फिर हम सी(C) नंबर को इस स्थान पर कॉपी करने के लिए प्रयास करते हैं।
 तो, यह ऐसा है जैसे पहले हम लंबाई प्राप्त करते हैं।
 तो, लंबाई 16 है, हम 1 जोड़ते हैं; इसलिए हमें 17 मिलते हैं।
 यह 1 अशक्त चरित्र के लिए है तो आप एक आवंटन करते हैं।
 इसलिए, हमारे पास किसी स्थान पर 16 की एक सरणी का आवंटन है और फिर हम strcp y का उपयोग करके मेरे इनपुट स्ट्रिंग(string) को कॉपी करते हैं।
 इसलिए, मेरे कार्ड के सदस्य को इस स्ट्रिंग(string) के लिए आरंभीकृत किया गया है और इसे यहाँ करना होगा, इसे आरंभीकरण सूची में करना होगा क्योंकि दोनों पॉइंटर कार्ड एमईएम(MEM) नंबर पॉइंटर के साथ-साथ स्ट्रिंग जो यह इंगित करेगा कि यह निरंतर हो जाएगा अब, लेकिन इसके साथ हम एक तरह से ऑब्जेक्ट की सुरक्षा और निर्माण करने में सक्षम हैं, ताकि आप क्रेडिट कार्ड(credit card) ऑब्जेक्ट(object) बन जाने के बाद कार्ड नंबर में कोई बदलाव न कर सकें।
 हमने अभी देखा है कि कैसे निरंतर वस्तुओं, निरंतर सदस्य कार्यों और निरंतर डेटा सदस्यों को बनाने के लिए और डिजाइन में इसका उपयोग कैसे करें।