Const (computer programming)
کچھ پروگرامنگ زبانوں میں، کانسٹ ایک ٹائپ کوالیفائر (ڈیٹا ٹائپ پر لاگو ہونے والا کلیدی لفظ) ہے جو اس بات کی نشاندہی کرتا ہے کہ ڈیٹا صرف پڑھنے کے لیے ہے۔ اگرچہ اس کا استعمال مستقلات کا اعلان کرنے کے لیے کیا جا سکتا ہے، لیکن سی خاندان میں زبانیں اس قسم کا حصہ ہونے کی وجہ سے دوسری زبانوں میں اسی طرح کی تعمیرات سے مختلف ہوتی ہیں، اور اس طرح جب اشارے، حوالہ جات، جامع ڈیٹا کی اقسام، اور ٹائپ چیکنگ کے ساتھ ملایا جاتا ہے تو اس کا طرز عمل پیچیدہ ہوتا ہے۔ دوسری زبانوں میں، ڈیٹا ایک ہی میموری لوکیشن میں نہیں ہوتا ہے، بلکہ ہر استعمال پر مرتب کرنے کے وقت کاپی کیا جاتا ہے۔ جو زبانیں اسے استعمال کرتی ہیں ان میں سی، سی + +، ڈی، جاوا اسکرپٹ، جولیا اور رسٹ شامل ہیں۔ تعارف جب کسی آبجیکٹ ڈیکلریشن میں لاگو کیا جاتا ہے، تو یہ اس بات کی نشاندہی کرتا ہے کہ آبجیکٹ ایک مستقل ہے: اس کی قیمت متغیر کے برعکس تبدیل نہیں کی جا سکتی ہے۔ یہ بنیادی استعمال-مستقلات کا اعلان کرنے کے لیے-بہت سی دوسری زبانوں میں متوازی ہے۔ تاہم، دوسری زبانوں کے برعکس، زبانوں کے سی خاندان میں کانسٹ قسم کا حصہ ہے، آبجیکٹ کا حصہ نہیں۔ مثال کے طور پر، سی میں، ایک آبجیکٹ x کو انٹی کانسٹ قسم کا اعلان کرتا ہے-کانسٹ اس قسم کا حصہ ہے، جیسے کہ اسے "(انٹی کانسٹ) x" تجزیہ کیا گیا ہو-جبکہ اڈا میں، انٹیگر قسم کا ایک مستقل (ایک قسم کا آبجیکٹ) X اعلان کرتا ہے: مستقل آبجیکٹ کا حصہ ہے، لیکن اس قسم کا حصہ نہیں ہے۔ اس کے دو باریک نتائج ہوتے ہیں۔ سب سے پہلے، کانسٹ کا اطلاق زیادہ پیچیدہ قسم کے حصوں پر کیا جا سکتا ہے-مثال کے طور پر، انٹی کانسٹ * کانسٹ x ؛ ایک مستقل عدد کے لیے ایک مستقل پوائنٹر کا اعلان کرتا ہے، جبکہ انٹی کانسٹ * x ؛ ایک متغیر پوائنٹر کو ایک مستقل عدد کے لیے اعلان کرتا ہے، اور انٹی * کانسٹ x ؛ ایک متغیر عدد کے لیے ایک مستقل پوائنٹر کا اعلان کرتا ہے۔ دوسرا، چونکہ کانسٹ ٹائپ کا حصہ ہے، اس لیے اسے ٹائپ چیکنگ کے حصے کے طور پر ملنا چاہیے۔ مثال کے طور پر، درج ذیل کوڈ غلط ہے: وایڈ f (int & x) ؛//. int کانسٹ i ؛ f (i) ؛ کیونکہ f کی دلیل متغیر عدد ہونا ضروری ہے، لیکن i ایک مستقل عدد ہے۔ یہ مماثلت پروگرام کی درستگی کی ایک شکل ہے، اور اسے مستقل درستگی کے نام سے جانا جاتا ہے۔ یہ معاہدے کے ذریعے پروگرامنگ کی ایک شکل کی اجازت دیتا ہے، جہاں افعال اپنی قسم کے دستخط کے حصے کے طور پر وضاحت کرتے ہیں کہ آیا وہ اپنے دلائل میں ترمیم کرتے ہیں یا نہیں، اور آیا ان کی واپسی کی قیمت قابل ترمیم ہے یا نہیں۔ اس قسم کی جانچ بنیادی طور پر پوائنٹرز اور حوالہ جات میں دلچسپی کا باعث ہے-نہ کہ بنیادی قدر کی اقسام جیسے انٹیجرز-بلکہ جامع ڈیٹا کی اقسام یا ٹیمپلیٹڈ اقسام جیسے کنٹینرز کے لیے بھی۔ یہ اس حقیقت سے چھپا ہوا ہے کہ ٹائپ جبر (مضمر قسم کی تبدیلی) اور C کال بہ ویلیو ہونے کی وجہ سے کانسٹ کو اکثر خارج کیا جا سکتا ہے (C + + اور D یا تو کال بہ ویلیو یا کال بہ حوالہ ہیں)۔ نتائج کانسٹ-نیس کے خیال کا مطلب یہ نہیں ہے کہ متغیر جیسا کہ کمپیوٹر میموری میں محفوظ کیا گیا ہے وہ ناقابل تحریر ہے۔ بلکہ، کانسٹ-نیس ایک مرتب وقت کی تعمیر ہے جو اس بات کی نشاندہی کرتی ہے کہ ایک پروگرامر کو کیا کرنا چاہیے، ضروری نہیں کہ وہ کیا کر سکتے ہیں۔ تاہم، نوٹ کریں کہ پہلے سے طے شدہ ڈیٹا (جیسے چار کانسٹ * سٹرنگ لیٹرلز) کے معاملے میں، سی کانسٹ اکثر ناقابل تحریر ہوتا ہے۔ مستقلات سے فرق اگرچہ ایک مستقل پروگرام کے چلنے کے دوران اپنی قدر کو تبدیل نہیں کرتا ہے، لیکن ایک مستقل قرار دیا گیا آبجیکٹ پروگرام کے چلنے کے دوران واقعتا اس کی قدر کو تبدیل کر سکتا ہے۔ ایک عام مثال سرایت شدہ نظاموں کے اندر صرف پڑھنے والے رجسٹر ہیں جیسے ڈیجیٹل ان پٹ کی موجودہ حالت۔ ڈیجیٹل ان پٹ کے لیے ڈیٹا رجسٹروں کو اکثر مستقل اور غیر مستحکم قرار دیا جاتا ہے۔ ان رجسٹروں کا مواد پروگرام کے کچھ بھی کیے بغیر تبدیل ہو سکتا ہے (اتار چڑھاؤ والا) لیکن آپ انہیں بھی (مستقل) نہیں لکھیں گے۔ دیگر استعمال اس کے علاوہ، ایک (غیر جامد) ممبر فنکشن کو مستقل قرار دیا جا سکتا ہے۔ اس صورت میں، اس طرح کے فنکشن کے اندر یہ پوائنٹر صرف آبجیکٹ ٹائپ * کے بجائے آبجیکٹ ٹائپ کانسٹ * ٹائپ کا ہوتا ہے۔ اس کا مطلب یہ ہے کہ اس آبجیکٹ کے لیے نان کانسٹ فنکشنز کو اس طرح کے فنکشن کے اندر سے نہیں بلایا جا سکتا، اور نہ ہی ممبر متغیرات میں ترمیم کی جا سکتی ہے۔ سی + + میں، ممبر متغیر کو متغیر قرار دیا جا سکتا ہے، جس سے یہ ظاہر ہوتا ہے کہ یہ پابندی اس پر لاگو نہیں ہوتی ہے۔ بعض صورتوں میں، یہ مفید ہو سکتا ہے، مثال کے طور پر کیشنگ، حوالہ شمار، اور ڈیٹا سنکرونائزیشن کے ساتھ۔ ان صورتوں میں، آبجیکٹ کا منطقی معنی (حالت) تبدیل نہیں ہوتا ہے، لیکن آبجیکٹ جسمانی طور پر مستقل نہیں ہوتا ہے کیونکہ اس کی بٹ وائز نمائندگی بدل سکتی ہے۔ نحو C، C + +، اور D میں، ڈیٹا کی تمام اقسام، بشمول صارف کی طرف سے بیان کردہ، کو مستقل قرار دیا جا سکتا ہے، اور مستقل درستگی یہ حکم دیتی ہے کہ تمام متغیرات یا اشیاء کو اس طرح قرار دیا جانا چاہیے جب تک کہ ان میں ترمیم کرنے کی ضرورت نہ ہو۔ کانسٹ کا اس طرح کا فعال استعمال اقدار کو "سمجھنے، ٹریک کرنے اور اس کے بارے میں استدلال کرنے میں آسان" بناتا ہے، اور اس طرح یہ کوڈ کی پڑھنے کی اہلیت اور فہم کو بڑھاتا ہے اور ٹیموں میں کام کرنے اور کوڈ کو برقرار رکھنے کو آسان بناتا ہے کیونکہ یہ قدر کے مطلوبہ استعمال کے بارے میں معلومات کا تبادلہ کرتا ہے۔ کوڈ کے بارے میں استدلال کرتے وقت یہ مرتب کرنے والے کے ساتھ ساتھ ڈویلپر کی بھی مدد کر سکتا ہے۔ یہ زیادہ موثر کوڈ تیار کرنے کے لیے ایک بہتر مرتب کرنے والے کو بھی فعال کر سکتا ہے۔ سادہ ڈیٹا کی اقسام سادہ نان پوائنٹر ڈیٹا کی اقسام کے لیے، کانسٹ کوالیفائر کا اطلاق کرنا سیدھا ہے۔ یہ تاریخی وجوہات کی بناء پر کچھ اقسام کے دونوں طرف جا سکتا ہے (مثال کے طور پر، کانسٹ چار فو = 'اے' ؛ چار کانسٹ فو = 'اے' کے برابر ہے ؛)۔ کچھ نفاذات پر، دو بار کانسٹ کا استعمال کرنا (مثال کے طور پر، کانسٹ چار کانسٹ یا چار کانسٹ کانسٹ) ایک انتباہ پیدا کرتا ہے لیکن غلطی نہیں۔ پوائنٹر اور حوالہ جات پوائنٹر اور حوالہ جات کی اقسام کے لیے، کانسٹ کے معنی زیادہ پیچیدہ ہوتے ہیں-یا تو خود پوائنٹر، یا جس قدر کی طرف اشارہ کیا جا رہا ہے، یا دونوں، کانسٹ ہو سکتے ہیں۔ مزید یہ کہ نحو الجھن کا باعث بن سکتی ہے۔ ایک پوائنٹر کو لکھنے کے قابل ویلیو کے لیے کانسٹ پوائنٹر، یا کانسٹ ویلیو کے لیے لکھنے کے قابل پوائنٹر، یا کانسٹ ویلیو کے لیے کانسٹ پوائنٹر کے طور پر قرار دیا جا سکتا ہے۔ ایک کانسٹ پوائنٹر کو کسی مختلف شے کی طرف اشارہ کرنے کے لیے دوبارہ تفویض نہیں کیا جا سکتا جو اسے ابتدائی طور پر تفویض کیا گیا ہے، لیکن اسے اس قدر میں ترمیم کرنے کے لیے استعمال کیا جا سکتا ہے جس کی طرف یہ اشارہ کرتا ہے (جسے پوائنٹ کہا جاتا ہے)۔ C + + میں حوالہ متغیرات کانسٹ پوائنٹرز کے لیے ایک متبادل نحو ہیں۔ دوسری طرف، کسی کانسٹ آبجیکٹ کی طرف اشارہ کرنے والے کو میموری کے دوسرے مقام کی طرف اشارہ کرنے کے لیے دوبارہ تفویض کیا جا سکتا ہے (جو کہ ایک ہی قسم کا یا بدلنے کے قابل قسم کا آبجیکٹ ہونا چاہیے)، لیکن اسے اس میموری میں ترمیم کرنے کے لیے استعمال نہیں کیا جا سکتا جس کی طرف وہ اشارہ کر رہا ہے۔ کانسٹ آبجیکٹ کے لیے کانسٹ پوائنٹر کا اعلان بھی کیا جا سکتا ہے اور اسے نہ تو اپائنٹی میں ترمیم کرنے کے لیے استعمال کیا جا سکتا ہے اور نہ ہی کسی اور آبجیکٹ کی طرف اشارہ کرنے کے لیے دوبارہ تفویض کیا جا سکتا ہے۔ مندرجہ ذیل کوڈ ان باریکیوں کی وضاحت کرتا ہے: وایڈ فو (انٹی * پی ٹی آر، انٹی کانسٹ * پی ٹی آر ٹو کانسٹ، انٹی * کانسٹ کانسٹ پی ٹی آر، انٹی کانسٹ * کانسٹ پی ٹی آر ٹو کانسٹ) {* پی ٹی آر = 0 ؛// اوکے: پوائنٹ کو ڈیٹا پی ٹی آر = این یو ایل ایل میں تبدیل کرتا ہے ؛// اوکے: پوائنٹر کو تبدیل کرتا ہے * پی ٹی آر ٹو کانسٹ = 0 ؛// ایرر! پوائنٹ ٹو ڈیٹا پی ٹی آر ٹو کانسٹ = این یو ایل ایل میں ترمیم نہیں کر سکتا ؛// اوکے: پوائنٹ کو تبدیل کرتا ہے * کانسٹ پی ٹی آر = 0 ؛// اوکے: پوائنٹ ٹو ڈیٹا کو تبدیل کرتا ہے کانسٹ پی ٹی آر = این یو ایل ایل ؛// ایرر! پوائنٹر میں ترمیم نہیں کی جا سکتی * کانسٹ پیٹر ٹو کانسٹ = 0 ؛// ایرر! پوائنٹ ٹو ڈیٹا کانسٹ پیٹر ٹو کانسٹ = این یو ایل ایل میں ترمیم نہیں کر سکتا ؛// ایرر! پوائنٹر} سی کنونشن میں ترمیم نہیں کی جا سکتی اعلامیے کے لیے معمول کے سی کنونشن کے بعد، اعلامیہ استعمال کے بعد آتا ہے، اور پوائنٹر میں * پوائنٹر پر لکھا جاتا ہے، جس سے ڈی ریفرنسنگ کی نشاندہی ہوتی ہے۔ مثال کے طور پر، ڈیکلیریشن انٹ * پی ٹی آر میں، غیر حوالہ شدہ فارم * پی ٹی آر ایک انٹ ہے، جبکہ حوالہ فارم پی ٹی آر ایک انٹ کا پوائنٹر ہے۔ اس طرح کانسٹ نام کو اس کے دائیں طرف تبدیل کرتا ہے۔ سی + + روایت اس کے بجائے * کو قسم کے ساتھ جوڑنا ہے، جیسا کہ انٹی * پی ٹی آر میں ہے، اور کانسٹ کو بائیں طرف کی قسم میں ترمیم کرتے ہوئے پڑھنا ہے۔ اس طرح انٹی کانسٹ * پی ٹی آر ٹو کانسٹ کو "* پی ٹی آر ٹو کانسٹ ایک انٹی کانسٹ ہے" (قدر مستقل ہے)، یا "پی ٹی آر ٹو کانسٹ ایک انٹی کانسٹ ہے *" (پوائنٹر ایک مستقل عدد کا پوائنٹر ہے) کے طور پر پڑھا جا سکتا ہے۔ اس طرح: انٹی * پی ٹی آر ؛// * پی ٹی آر ایک انٹی ویلیو انٹیٹ کانسٹ * پی ٹی آر ٹو کانسٹ ہے ؛// پی ٹی آر ٹو کانسٹ ایک مستقل (انٹیجر ویلیو) انٹیجر کانسٹ کانسٹ پی ٹی آر ہے ؛// کانسٹ پی ٹی آر ایک مستقل (انٹیجر پوائنٹر) انٹیجر کانسٹ * کانسٹ کانسٹ پی ٹی آر ٹو کانسٹ ہے ؛// کانسٹ پی ٹی آر ٹو کانسٹ ایک مستقل پوائنٹر ہے اور ایک مستقل قیمت سی + + کنونشن کی طرف اشارہ کرتا ہے۔ سی + + کے بعد قسم کا تجزیہ کرنے کے کنونشن کے بعد، قیمت نہیں، انگوٹھے کا ایک قاعدہ ہے کہ اعلامیے کو دائیں سے بائیں پڑھنا ہے۔ اس طرح ستارے کے بائیں طرف کی ہر چیز کو نوک دار قسم کے طور پر پہچانا جا سکتا ہے اور ستارے کے دائیں طرف کی ہر چیز نوک دار خصوصیات ہیں۔ مثال کے طور پر، اوپر دی گئی ہماری مثال میں، انٹی کانسٹ * کو ایک تحریری پوائنٹر کے طور پر پڑھا جا سکتا ہے جو ایک غیر تحریری انٹیجر کا حوالہ دیتا ہے، اور انٹی * کانسٹ کو غیر تحریری پوائنٹر کے طور پر پڑھا جا سکتا ہے جو تحریری انٹیجر کا حوالہ دیتا ہے۔ ایک زیادہ عام قاعدہ جو آپ کو پیچیدہ اعلانات اور تعریفیں سمجھنے میں مدد کرتا ہے اس طرح کام کرتا ہے: اس شناخت کنندہ کو تلاش کریں جس کے اعلامیے کو آپ سمجھنا چاہتے ہیں جہاں تک ممکن ہو دائیں طرف پڑھیں (یعنی اعلامیے کے اختتام تک یا اگلے اختتامی قوسین میں، جو بھی پہلے آئے) جہاں سے آپ نے شروع کیا تھا، اور بائیں طرف پیچھے کی طرف پڑھیں (یعنی اعلامیے کے آغاز تک یا پچھلے مرحلے میں پائے جانے والے اختتامی قوسین سے ملنے والے کھلے قوسین میں) جب آپ اپنے اعلامیے کے آغاز تک پہنچ چکے ہوں۔ اگر نہیں، تو مرحلہ 2 پر جاری رکھیں، اختتامی قوسین سے آگے جو آخری بار ملا تھا۔ یہاں ایک مثال ہے: بائیں طرف پڑھتے وقت، یہ ضروری ہے کہ آپ دائیں سے بائیں عناصر کو پڑھیں۔ لہذا ایک انٹی کانسٹ * ایک کانسٹ انٹی کا پوائنٹر بن جاتا ہے نہ کہ انٹی کا کانسٹ پوائنٹر۔ بعض صورتوں میں C/C + + کانسٹ مطلوبہ الفاظ کو قسم کے بائیں طرف رکھنے کی اجازت دیتا ہے۔ یہاں کچھ مثالیں ہیں: کانسٹ انٹ * پی ٹی آر ٹو کانسٹ ؛// یکساں: انٹ کانسٹ * پی ٹی آر ٹو کانسٹ، کانسٹ انٹ * کانسٹ کانسٹ پی ٹی آر ٹو کانسٹ ؛// یکساں: انٹ کانسٹ * کانسٹ کانسٹ پی ٹی آر ٹو کانسٹ اگرچہ سی/سی + + اس طرح کی تعریفوں کی اجازت دیتا ہے (جو تعریفوں کو بائیں سے دائیں پڑھتے وقت انگریزی زبان سے قریب سے ملتا ہے)، مرتب کرنے والا اب بھی مذکورہ بالا طریقہ کار کے مطابق تعریفوں کو پڑھتا ہے: دائیں سے بائیں۔ لیکن جس چیز کو مستقل ہونا چاہیے اس سے پہلے مستقل کو رکھنا آپ جو لکھنے کا ارادہ رکھتے ہیں اور مرتب کرنے والا جو فیصلہ کرتا ہے اس کے درمیان عدم مطابقت کو فوری طور پر متعارف کراتا ہے۔ پوائنٹرز کے لیے پوائنٹرز پر غور کریں: int * * ptr ؛// an پوائنٹر ٹو an پوائنٹر ٹو int کانسٹ * * ptr/ایک پوائنٹر ٹو ایک پوائنٹر ٹو کانسٹینٹ int ویلیو// (کوئی پوائنٹر ٹو کانسٹ پوائنٹر نہیں) int * کانسٹ * ptr// ایک پوائنٹر ٹو کانسٹ پوائنٹر ٹو int ویلیوز// (کوئی مستقل پوائنٹر ٹو انٹس نہیں) int * * کانسٹ ptr// ایک مستقل پوائنٹر ٹو پوائنٹرز ٹو ints// (ptr، شناخت کنندہ، کانسٹ ہونے کا کوئی مطلب نہیں ہے) int * * کانسٹ ptr/ایک مستقل پوائنٹر ٹو پوائنٹرز ٹو کانسٹینٹ int ویلیوز کے حوالے سے ایک حتمی نوٹ کے طور پر۔ پوائنٹر کی علامت کو قسم سے جوڑنا مشکل ہے، کیونکہ یہ ایک پوائنٹر کی قسم کی سختی سے تجویز کرتا ہے، جو کہ ایسا نہیں ہے۔ یہاں کچھ مثالیں ہیں: انٹی * اے ؛/* لکھیں: */انٹی * اے ؛// اے ایک انٹی * اے، بی کا پوائنٹر ہے ؛// کنفیوزنگ/* لکھیں: */انٹی * اے، بی ؛// اے ایک انٹی کا پوائنٹر ہے،// لیکن بی محض انٹی * اے، * بی ہے ؛// یوجیلی: اے اور بی دونوں انٹیس/* لکھنے کے پوائنٹر ہیں: */انٹی * اے، * بی ؛ اس مسئلے سے بچنے کے لیے بجرن سٹروسٹرپ کا عمومی سوالنامہ فی لائن صرف ایک متغیر کا اعلان کرنے کی سفارش کرتا ہے۔ حوالہ جات اور قیمت کے حوالہ جات کی وضاحت پر بھی یہی تحفظات لاگو ہوتے ہیں: انتر ور = 22 ؛ انتر کانسٹ اور ریفٹو کانسٹ = ور ؛// اوکے انتر کانسٹ اور ریف 2 = ور، ریف 3 = ور ؛// کنفیوزنگ:// ریف 2 ایک حوالہ ہے، لیکن ریف 3 نہیں ہے:// ریف 3 ایک مستقل انتر ہے جسے// ور کی قیمت انتر اور کانسٹرف = ور کے ساتھ شروع کیا گیا ہے۔// ایرر: جیسا کہ حوالہ جات ویسے بھی تبدیل نہیں ہو سکتے۔ //C + +: int & & rref = int (5)، ویلیو = 10 ؛// کنفیوزنگ:// rref ایک r ویلیو ریفرنس ہے، لیکن ویلیو// محض int ہے۔ / * لکھیں: */int & & rref = int (5)، ویلیو = 10 ؛ پوائنٹرز پر کثیر جہتی صفوں اور حوالوں (یا پوائنٹرز) کا استعمال کرتے وقت زیادہ پیچیدہ اعلانات کا سامنا کرنا پڑتا ہے۔ اگرچہ بعض اوقات یہ استدلال کیا جاتا ہے کہ اس طرح کے اعلانات الجھن اور غلطی کا شکار ہیں اور اس لیے ان سے گریز کیا جانا چاہیے یا انہیں اعلی سطح کے ڈھانچوں سے تبدیل کیا جانا چاہیے، اس حصے کے اوپری حصے میں بیان کردہ طریقہ کار کو ہمیشہ ابہام یا الجھن کو متعارف کرائے بغیر استعمال کیا جا سکتا ہے۔ پیرامیٹرز اور متغیرات کانسٹ کو فنکشن پیرامیٹرز اور متغیرات (جامد یا خودکار، بشمول عالمی یا مقامی) دونوں پر اعلان کیا جا سکتا ہے۔ تشریح استعمال کے لحاظ سے مختلف ہوتی ہے۔ ایک کانسٹ جامد متغیر (عالمی متغیر یا جامد مقامی متغیر) ایک مستقل ہے، اور اسے ریاضیاتی مستقل جیسے ڈیٹا کے لیے استعمال کیا جا سکتا ہے، جیسے کہ ڈبل کانسٹ PI = 3.14159-حقیقت پسندانہ طور پر لمبا، یا مجموعی طور پر مرتب وقت کے پیرامیٹرز۔ ایک کانسٹ آٹومیٹک متغیر (غیر جامد مقامی متغیر) کا مطلب ہے کہ واحد تفویض ہو رہی ہے، حالانکہ ہر بار ایک مختلف قدر استعمال کی جا سکتی ہے، جیسے کہ انٹی کانسٹ x _ مربع = x * x۔ پاس بائی ریفرنس میں ایک کانسٹ پیرامیٹر کا مطلب ہے کہ حوالہ شدہ ویلیو میں ترمیم نہیں کی گئی ہے-یہ معاہدے کا حصہ ہے-جبکہ پاس بائی ویلیو میں ایک کانسٹ پیرامیٹر (یا خود پوائنٹر، پاس بائی ریفرنس میں) انٹرفیس میں کچھ بھی شامل نہیں کرتا ہے (جیسا کہ ویلیو کاپی کی گئی ہے)، لیکن اس بات کی نشاندہی کرتا ہے کہ اندرونی طور پر، فنکشن پیرامیٹر کی مقامی کاپی میں ترمیم نہیں کرتا ہے (یہ ایک واحد تفویض ہے)۔ اس وجہ سے، کچھ لوگ پیرامیٹرز میں کانسٹ کو صرف پاس بائی ریفرنس کے لیے استعمال کرنے کے حق میں ہیں، جہاں یہ معاہدہ کو تبدیل کرتا ہے، لیکن پاس بائی ویلیو کے لیے نہیں، جہاں یہ عمل درآمد کو بے نقاب کرتا ہے۔ سی + + طریقے صارف کے طے شدہ اقسام (ڈھانچے اور کلاسیں) کے لیے معاہدہ کے نقطہ نظر کے ذریعے ڈیزائن سے فائدہ اٹھانے کے لیے، جس میں طریقوں کے ساتھ ساتھ ممبر ڈیٹا بھی ہو سکتا ہے، پروگرامر مثال کے طریقوں کو کانسٹ کے طور پر ٹیگ کر سکتا ہے اگر وہ آبجیکٹ کے ڈیٹا اراکین میں ترمیم نہیں کرتا ہے۔ مثال کے طریقوں پر کانسٹ کوالیفائر کا اطلاق کرنا اس طرح کانسٹ درستگی کے لیے ایک لازمی خصوصیت ہے، اور یہ بہت سی دوسری آبجیکٹ پر مبنی زبانوں جیسے جاوا اور سی #یا مائیکروسافٹ کے سی + +/سی ایل آئی یا سی + + کے لیے مینجڈ ایکسٹینشنز میں دستیاب نہیں ہے۔ جبکہ کانسٹ طریقوں کو کانسٹ اور غیر کانسٹ اشیاء کے ذریعے یکساں طور پر بلایا جا سکتا ہے، غیر کانسٹ طریقوں کو صرف غیر کانسٹ اشیاء کے ذریعے ہی استعمال کیا جا سکتا ہے۔ مثال کے طریقہ پر کانسٹ ماڈیفائر "اس" پوائنٹر کی طرف اشارہ کردہ آبجیکٹ پر لاگو ہوتا ہے، جو کہ تمام مثال کے طریقوں کو منتقل کی جانے والی ایک مضمر دلیل ہے۔ اس طرح کانسٹ میتھڈز کا ہونا دوسرے دلائل کی طرح مضمر "اس" پوائنٹر دلیل پر کانسٹ-درستگی کا اطلاق کرنے کا ایک طریقہ ہے۔ یہ مثال واضح کرتی ہے: کلاس C {int i; پبلک: int Get () کانسٹ// نوٹ کریں کہ "کانسٹ" ٹیگ {ریٹرن i;} وایڈ سیٹ (int j)// نوٹ کریں کہ "کانسٹ" کی کمی ہے {i = j;}} ؛ وایڈ فو (C & نان کانسٹ، C کانسٹ & کانسٹ) {int y = nonConstC.Get () ؛// Ok int x = constC.Get () ؛// Ok: Get () کانسٹ nonConstC.Set (10) ہے ؛// Ok: نان کانسٹ قابل ترمیم ہے constC.Set (10) ؛// ایرر! سیٹ () ایک غیر کانسٹ طریقہ ہے اور کانسٹ سی ایک کانسٹ کوالیفائیڈ آبجیکٹ ہے۔ مندرجہ بالا کوڈ میں، سیٹ () کے لیے مضمر "یہ" پوائنٹر کی قسم "سی * کانسٹ" ہے ؛ جبکہ "یہ" پوائنٹر حاصل کرنے کے لیے () ٹائپ "سی کانسٹ * کانسٹ" ہے، جس سے یہ ظاہر ہوتا ہے کہ طریقہ "اس" پوائنٹر کے ذریعے اپنے آبجیکٹ میں ترمیم نہیں کر سکتا۔ اکثر پروگرامر دونوں قسم کے کال کرنے والوں کو ایڈجسٹ کرنے کے لیے کلاس میں ایک ہی نام (لیکن ممکنہ طور پر بالکل مختلف استعمال) کے ساتھ کانسٹ اور نان کانسٹ دونوں طریقے فراہم کرتا ہے۔ غور کریں: کلاس MyArray {int ڈیٹا [100] ؛ عوامی: int & Get (int i) {ریٹرن ڈیٹا [i];} int کانسٹ & Get (int i) کانسٹ {ریٹرن ڈیٹا [i];}} ؛ کالعدم Foo (MyArray & array, MyArrey کانسٹ & کانسٹ آرے) {// کسی صف عنصر کا حوالہ حاصل کریں// اور اس کی حوالہ شدہ قیمت میں ترمیم کریں۔ array.Get (5) = 42 ؛// ٹھیک ہے! (کالز: int & MyArray:: Get (int)) constArray.Get (5) = 42 ؛// ایرر! (کالز: انٹی کانسٹ اور مائی آرری:: گیٹ (انٹی) کانسٹ)} کالنگ آبجیکٹ کا کانسٹ-نیس اس بات کا تعین کرتا ہے کہ مائی آرری کا کون سا ورژن:: گیٹ () بلایا جائے گا اور اس طرح کال کرنے والے کو کوئی حوالہ دیا گیا ہے یا نہیں جس کے ساتھ وہ ہیرا پھیری کر سکے یا صرف آبجیکٹ میں موجود نجی ڈیٹا کا مشاہدہ کر سکے۔ تکنیکی طور پر دونوں طریقوں کے مختلف دستخط ہوتے ہیں کیونکہ ان کے "یہ" اشارے مختلف قسم کے ہوتے ہیں، جو مرتب کرنے والے کو صحیح کا انتخاب کرنے کی اجازت دیتے ہیں۔ (صرف قیمت کے لحاظ سے انٹی کو واپس کرنے کے بجائے، ایک انٹی کو کانسٹ حوالہ واپس کرنا، دوسرے طریقہ کار میں اوورکل ہو سکتا ہے، لیکن وہی تکنیک من مانی اقسام کے لیے استعمال کی جا سکتی ہے، جیسا کہ اسٹینڈرڈ ٹیمپلیٹ لائبریری میں ہے۔) سی اور سی + + میں خالص مستقل درستگی کے لیے کئی خامیاں ہیں۔ وہ بنیادی طور پر موجودہ کوڈ کے ساتھ مطابقت کے لیے موجود ہیں۔ پہلا، جو صرف سی + + پر لاگو ہوتا ہے، کانسٹ کاسٹ کا استعمال ہے، جو پروگرامر کو کانسٹ کوالیفائر کو اتارنے کی اجازت دیتا ہے، جس سے کسی بھی شے میں ترمیم کی جا سکتی ہے۔ کوالیفائر کو ہٹانے کی ضرورت اس وقت پیدا ہوتی ہے جب موجودہ کوڈ اور لائبریریوں کا استعمال کیا جاتا ہے جن میں ترمیم نہیں کی جا سکتی لیکن جو درست نہیں ہیں۔ مثال کے طور پر، اس کوڈ پر غور کریں:// ایک فنکشن کے لیے پروٹوٹائپ جسے ہم تبدیل نہیں کر سکتے لیکن جو// ہم جانتے ہیں کہ پاس کیے گئے پوائنٹ میں ترمیم نہیں کرتا ہے۔ کال لائبریری فنک (انٹی * پی ٹی آر، انٹی سائز) کو کال کریں (انٹی * پی ٹی آر، انٹی سائز) {لائبریری فنک (پی ٹی آر، سائز) ؛// غلطی! ڈراپز کانسٹ کوالیفائر int * nonConstPtr = स्थिर کوالیفائر لائبریری فنک (غیر کانسٹ پیٹر، سائز) ؛// اوکے) تاہم، کسی ایسی شے میں ترمیم کرنے کی کوئی بھی کوشش جسے خود ایک مستقل کاسٹ کے ذریعے غیر متعین قرار دیا جاتا ہے، آئی ایس او سی + + معیار کے مطابق غیر متعین رویے کا باعث بنتی ہے۔ مندرجہ بالا مثال میں، اگر پی ٹی آر کسی عالمی، مقامی، یا ممبر متغیر کا حوالہ دیتا ہے جسے کانسٹ قرار دیا گیا ہے، یا نیو انٹ کانسٹ کے ذریعے ڈھیر پر مختص کردہ کسی شے کا حوالہ دیتا ہے، تو کوڈ صرف اس صورت میں درست ہے جب لائبریری فنک واقعی پی ٹی آر کی طرف اشارہ کردہ قدر میں ترمیم نہیں کرتا ہے۔ سی زبان کو ایک خامی کی ضرورت ہے کیونکہ ایک مخصوص صورتحال موجود ہے۔ جامد اسٹوریج کی مدت والے متغیرات کو ابتدائی قدر کے ساتھ بیان کرنے کی اجازت ہے۔ تاہم، ابتدا کرنے والا صرف مستقلات جیسے سٹرنگ مستقل اور دیگر لفظی استعمال کر سکتا ہے، اور اسے غیر مستقل عناصر جیسے متغیر ناموں کو استعمال کرنے کی اجازت نہیں ہے، چاہے ابتدا کرنے والے عناصر کو مستقل قرار دیا گیا ہو یا نہیں، یا آیا جامد دورانیے کے متغیر کو مستقل قرار دیا جا رہا ہے یا نہیں۔ جامد اسٹوریج کی مدت والے کانسٹ متغیر کو شروع کرنے کا ایک غیر پورٹیبل طریقہ ہے۔ بعد میں تفویض کے بائیں ہاتھ کی طرف احتیاط سے ٹائپ کاسٹ بنا کر، ایک کانسٹ متغیر کو لکھا جا سکتا ہے، جس سے مؤثر طریقے سے کانسٹ خاصیت کو ہٹا دیا جاتا ہے اور اسے غیر مستقل عناصر جیسے دیگر کانسٹ متغیرات اور اس طرح کے ساتھ 'شروع' کیا جاتا ہے۔ کانسٹ متغیر میں اس طرح لکھنا مطلوبہ طریقے سے کام کر سکتا ہے، لیکن یہ غیر متعین رویے کا سبب بنتا ہے اور سنجیدگی سے کانسٹ درستگی سے متصادم ہے: سائز _ t کانسٹ بفر سائز = 8 * 1024 ؛ سائز _ t کانسٹ صارف ٹیکسٹ بفر سائز ؛// ابتدائی قیمت کانسٹ بفر سائز پر منحصر ہے، یہاں شروع نہیں کیا جا سکتا۔ int سیٹ اپ یوزر ٹیکسٹ باکس (ٹیکسٹ باکس _ t * ڈیفالٹ ٹیکسٹ باکس ٹائپ، ریکٹ _ t * ڈیفالٹ ٹیکسٹ باکس لوکیشن) {* (سائز _ t *) اور یوزر ٹیکسٹ بفر سائز = بفر سائز-سائز (ساخت ٹیکسٹ باکس کنٹرولز) ؛// انتباہ: کام کر سکتا ہے، لیکن سی کی طرف سے ضمانت نہیں ہے۔ خاص طور پر، زبانیں یہ حکم دیتی ہیں کہ ممبر کے اشارے اور حوالہ جات ان کے مالکان کی مستقل حیثیت کے حوالے سے "اتلی" ہیں-یعنی، ایک ایسی چیز جس میں مستقل تمام مستقل اراکین ہوتے ہیں سوائے اس کے کہ ممبر کے اشارے (اور ریفری) اب بھی قابل تغیر ہیں۔ مثال کے طور پر، اس سی + + کوڈ پر غور کریں: اسٹرکچر ایس {انٹ وال ؛ انٹ * پی ٹی آر ؛} ؛ وایڈ فو (ایس کانسٹ اینڈ ایس) {انٹ آئی = 42 ؛ s.val = آئی ؛// ایرر: ایس کانسٹ ہے، اس لیے ویل ایک کانسٹ انٹ ہے s.ptr = اینڈ آئی ؛// ایرر: ایس کانسٹ ہے، اس لیے پی ٹی آر انٹ * s.ptr = آئی ؛// اوکے کا کانسٹ پوائنٹر ہے: پی ٹی آر کے ذریعے اشارہ کردہ ڈیٹا ہمیشہ متغیر ہوتا ہے،// اگرچہ یہ کبھی کبھی مطلوب نہیں ہوتا ہے۔ اس وجہ سے، میئرز کا استدلال ہے کہ ممبر پوائنٹروں اور حوالہ جات کے لیے ڈیفالٹ "ڈیپ" کانسٹ-نیس ہونا چاہیے، جسے ایک متغیر کوالیفائر کے ذریعے اوور رائڈ کیا جا سکتا ہے جب پوائنٹ کنٹینر کی ملکیت نہیں ہے، لیکن یہ حکمت عملی موجودہ کوڈ کے ساتھ مطابقت کے مسائل پیدا کرے گی۔ اس طرح، تاریخی وجوہات کی بناء پر، یہ خامی C اور C + + میں کھلی رہتی ہے۔ مؤخر الذکر خامی کو کانسٹ-کریکٹ انٹرفیس کے پیچھے پوائنٹر کو چھپانے کے لیے کلاس کا استعمال کرکے بند کیا جا سکتا ہے، لیکن ایسی کلاسیں یا تو کانسٹ آبجیکٹ سے معمول کی کاپی سیمنٹکس کی حمایت نہیں کرتی ہیں (جس کا مطلب یہ ہے کہ موجود کلاس کو معمول کے سیمنٹکس کے ذریعے کاپی نہیں کیا جا سکتا ہے) یا نادانستہ یا جان بوجھ کر کاپی کرنے کے ذریعے کانسٹ-نیس کو نکالنے کی اجازت دے کر دیگر خامیوں کی اجازت دیتی ہیں۔ آخر میں، سی سٹینڈرڈ لائبریری میں کئی فنکشن C23 سے پہلے کانسٹ-درستگی کی خلاف ورزی کرتے ہیں، کیونکہ وہ ایک کریکٹر سٹرنگ پر کانسٹ پوائنٹر کو قبول کرتے ہیں اور اسی سٹرنگ کے ایک حصے پر نان کانسٹ پوائنٹر کو واپس کرتے ہیں۔ ایس ٹی آر ایس ٹی آر اور ایس ٹی آر سی ایچ آر ان افعال میں سے ہیں۔ سی + + معیاری لائبریری کے کچھ نفاذ، جیسے کہ مائیکروسافٹ کچھ افعال کے دو اوورلوڈ ورژن فراہم کر کے اس خامی کو ختم کرنے کی کوشش کرتا ہے: ایک "کانسٹ" ورژن اور ایک "نان کانسٹ" ورژن۔ مسائل تسلسل کا اظہار کرنے کے لیے ٹائپ سسٹم کے استعمال سے مختلف پیچیدگیاں اور مسائل پیدا ہوتے ہیں، اور اس کے مطابق تنقید کی گئی ہے اور اسے سی، سی + +، اور ڈی جاوا اور سی #کے تنگ سی خاندان سے باہر نہیں اپنایا گیا ہے، جو سی اور سی + + سے بہت زیادہ متاثر ہیں، دونوں نے واضح طور پر کانسٹ اسٹائل ٹائپ کوالیفائرز کو مسترد کر دیا، اس کے بجائے شناخت کنندہ پر لاگو ہونے والے مطلوبہ الفاظ کے ذریعے مستقل مزاجی کا اظہار کیا (جاوا میں فائنل، کانسٹ اور سی #میں صرف پڑھنے کے لیے)۔ یہاں تک کہ سی اور سی + + کے اندر بھی، کانسٹ کا استعمال نمایاں طور پر مختلف ہوتا ہے، کچھ پروجیکٹس اور تنظیمیں اسے مستقل طور پر استعمال کرتی ہیں، اور دیگر اس سے گریز کرتے ہیں۔ ایس ٹی آر سی ایچ آر مسئلہ کانسٹ ٹائپ کوالیفائر اس وقت مشکلات کا باعث بنتا ہے جب کسی فنکشن کی منطق اس بات پر اگنوسٹک ہوتی ہے کہ آیا اس کا ان پٹ مستقل ہے یا نہیں، لیکن ایک ایسی ویلیو واپس کرتی ہے جو ان پٹ کی طرح ہی اہل قسم کی ہونی چاہیے۔ دوسرے لفظوں میں، ان افعال کے لیے، اگر ان پٹ مستقل (کانسٹ کوالیفائیڈ) ہے، تو واپسی کی قیمت بھی ہونی چاہیے، لیکن اگر ان پٹ متغیر ہے (کانسٹ کوالیفائیڈ نہیں)، تو واپسی کی قیمت بھی ہونی چاہیے۔ چونکہ ان افعال کے ٹائپ سگنیچر مختلف ہوتے ہیں، اس لیے ایک ہی منطق کے ساتھ دو افعال (یا ممکنہ طور پر زیادہ، متعدد ان پٹ کی صورت میں) کی ضرورت ہوتی ہے-عام پروگرامنگ کی ایک شکل۔ یہ مسئلہ یہاں تک کہ سی اسٹینڈرڈ لائبریری میں سادہ افعال کے لیے بھی پیدا ہوتا ہے، خاص طور پر ایس ٹی آر سی آر ؛ اس مشاہدے کا سہرا رچی نے 1980 کی دہائی کے وسط میں ٹام پلم کو دیا ہے۔ اسٹرچر فنکشن سٹرنگ میں کسی کردار کا پتہ لگاتا ہے۔ رسمی طور پر، یہ سٹرنگ ایس میں کردار سی کی پہلی موجودگی پر ایک پوائنٹر واپس کرتا ہے، اور کلاسک سی (کے اینڈ آر سی) میں اس کا پروٹو ٹائپ ہے: چار * اسٹرچر (چار * ایس، انٹ سی) ؛ اسٹرچر فنکشن ان پٹ سٹرنگ میں ترمیم نہیں کرتا ہے، لیکن واپسی کی قیمت اکثر کالر کے ذریعہ سٹرنگ میں ترمیم کرنے کے لیے استعمال کی جاتی ہے، جیسے: اگر (پی = اسٹرچر (کیو، '/') * پی = '؛ اس طرح ایک طرف ان پٹ سٹرنگ مستقل ہو سکتی ہے (چونکہ اس میں فنکشن کے ذریعے ترمیم نہیں کی گئی ہے)، اور اگر ان پٹ سٹرنگ مستقل ہے تو واپسی کی قیمت بھی اتنی ہی ہونی چاہیے-سب سے آسان ہے کیونکہ یہ بالکل واپس آسکتی ہے۔ C + + میں یہ فنکشن اوورلوڈنگ کے ذریعے کیا جاتا ہے، عام طور پر ایک ٹیمپلیٹ کے ذریعے لاگو کیا جاتا ہے، جس کے نتیجے میں دو فنکشن ہوتے ہیں، تاکہ واپسی کی قیمت میں ان پٹ کی طرح ہی مستقل اہلیت والی قسم ہو: چار * اسٹرچر (چار * ایس، انٹی سی) ؛ چار کانسٹ * اسٹرچر (چار کانسٹ * ایس، انٹی سی) ؛ ان کی وضاحت بدلے میں ایک ٹیمپلیٹ کے ذریعے کی جا سکتی ہے: ٹیمپلیٹ <T> T * اسٹرچر (T * ایس، انٹی سی) {.} D میں یہ ان آؤٹ مطلوبہ الفاظ کے ذریعے سنبھالا جاتا ہے، جو کانسٹ، غیر متغیر، یا غیر اہل (متغیر) کے لیے وائلڈ کارڈ کے طور پر کام کرتا ہے، جس سے حاصل ہوتا ہے: ان آؤٹ (چار) * اسٹرچر (ان آؤٹ (چار) * ایس، انٹیٹ یہ حل رچی نے تجویز کیا تھا اور بعد میں اسے اپنایا گیا۔ یہ فرق سی اور سی + + کی مطابقت کی ناکامیوں میں سے ایک ہے۔ C23 کے بعد سے، یہ مسئلہ عام افعال کے استعمال سے حل ہوتا ہے۔ ایس ٹی آر سی ایچ آر اور اس مسئلے سے متاثر ہونے والے دیگر افعال ایک کانسٹ پوائنٹر واپس کریں گے اگر ایک ان کے پاس منتقل کیا گیا تھا اور ایک غیر اہل پوائنٹر اگر ان کے پاس ایک غیر اہل پوائنٹر منتقل کیا گیا تھا۔ ڈی کے ورژن 2 میں، کانسٹ سے متعلق دو کلیدی الفاظ موجود ہیں۔ غیر متغیر کلیدی لفظ ان اعداد و شمار کی نشاندہی کرتا ہے جن میں کسی حوالہ کے ذریعے ترمیم نہیں کی جا سکتی۔ کانسٹ کلیدی لفظ متغیر ڈیٹا کے غیر متغیر نقطہ نظر کی نشاندہی کرتا ہے۔ سی + + کانسٹ کے برعکس، ڈی کانسٹ اور غیر متغیر "گہرے" یا ہیں، اور کانسٹ یا غیر متغیر شے کے ذریعے قابل رسائی کوئی بھی چیز بالترتیب کانسٹ یا غیر متغیر ہے۔ ڈی انٹ [] فو = نیو انٹ [5] میں غیر متغیر کانسٹ بمقابلہ غیر متغیر کی مثال ؛// فو قابل تغیر ہے۔ کانسٹ انٹ [] بار = فو ؛// بار متغیر ڈیٹا کا ایک کانسٹ ویو ہے۔ غیر متغیر انٹ [] باز = فو ؛// غلطی: غیر متغیر ڈیٹا کے تمام نظریات غیر متغیر ہونے چاہئیں۔ غیر متغیر int [] nums = نیا غیر متغیر (int) [5] ؛// nums کا کوئی متغیر حوالہ نہیں بنایا جا سکتا۔ کانسٹ انٹ [] کانسٹ نام = nums ؛// کام کرتا ہے۔ غیر متغیر مضمر طور پر کانسٹ میں تبدیل کرنے کے قابل ہے۔ int [] میوٹیبل نام = nums ؛// غلطی: غیر متغیر ڈیٹا کا میوٹیبل ویو نہیں بنا سکتا۔ ڈی کلاس میں ٹرانزیکٹو یا ڈیپ کانسٹ کی مثال فو {فو اگلا ؛ انٹ نمبر ؛} غیر متغیر فو فو = نیا غیر متغیر (فو) ؛ foo.next.num = 5 ؛// مرتب نہیں کرے گا۔ foo.next غیر متغیر (Foo) قسم کا ہے۔ //foo.next.num غیر متغیر (int) قسم کا ہے۔ ہسٹری کانسٹ کو 1981 میں کلاسز کے ساتھ سی میں بجرنی اسٹروسٹرپ نے متعارف کرایا تھا، جو سی + + کا پیشرو تھا، اور اسے اصل میں صرف پڑھنے کے لیے کہا جاتا تھا۔ محرک کے بارے میں، اسٹروسٹرپ لکھتے ہیں: "اس نے دو افعال انجام دیے: ایک علامتی مستقل کی وضاحت کرنے کے طریقے کے طور پر جو دائرہ کار اور قسم کے اصولوں کی پابندی کرتا ہے (یعنی میکرو کا استعمال کیے بغیر) اور میموری میں کسی شے کو غیر متغیر سمجھنے کے طریقے کے طور پر۔" میکرو کے اسکوپڈ اور ٹائپڈ متبادل کے طور پر پہلا استعمال، ان لائن مطلوبہ الفاظ کے ذریعے فنکشن جیسے میکرو کے لیے یکساں طور پر پورا کیا گیا۔ مستقل اشارے، اور * کانسٹ نوٹیشن، ڈینس رچی نے تجویز کیے تھے اور اس طرح انہیں اپنایا گیا۔ کانسٹ کو پھر سی میں معیاری کاری کے حصے کے طور پر اپنایا گیا، اور دوسری قسم کے کوالیفائر، اتار چڑھاؤ کے ساتھ C89 (اور اس کے بعد کے ورژن) میں ظاہر ہوتا ہے۔ ایکس 3 جے 11 کمیٹی کے دسمبر 1987 کے اجلاس میں ایک اور کوالیفائر، نوالیس کی تجویز پیش کی گئی تھی، لیکن اسے مسترد کر دیا گیا تھا۔ اس کا مقصد بالآخر سی 99 میں محدود مطلوبہ الفاظ سے پورا ہوا۔ رچی ان اضافے کے زیادہ حامی نہیں تھے، یہ دلیل دیتے ہوئے کہ انہوں نے "اپنا وزن نہیں اٹھایا"، لیکن بالآخر معیار سے انہیں ہٹانے کے لیے بحث نہیں کی۔ D نے بعد میں C + + سے کانسٹ وراثت میں حاصل کیا، جہاں اسے ٹائپ کنسٹرکٹر (ٹائپ کوالیفائر نہیں) کے طور پر جانا جاتا ہے اور متعلقہ استعمال کے معاملات کو سنبھالنے کے لیے دو مزید ٹائپ کنسٹرکٹر، غیر متغیر اور ان آؤٹ شامل کیے۔ دوسری زبانیں دیگر زبانیں سی/سی + + کی پیروی نہیں کرتی ہیں جس میں اس قسم کا مستقل حصہ ہوتا ہے، حالانکہ ان میں اکثر سطحی طور پر ایک جیسی تعمیرات ہوتی ہیں اور وہ کانسٹ کلیدی لفظ استعمال کر سکتی ہیں۔ عام طور پر یہ صرف مستقلات (مستقل اشیاء) کے لیے استعمال ہوتا ہے۔ سی #میں ایک کانسٹ کلیدی لفظ ہے، لیکن یکسر مختلف اور آسان الفاظ کے ساتھ: اس کا مطلب ایک مرتب وقت مستقل ہے، اور یہ اس قسم کا حصہ نہیں ہے۔ نیم میں سی #کی طرح ایک کانسٹ کلیدی لفظ ہے: یہ قسم کا حصہ بنانے کے بجائے ایک مرتب وقت مستقل کا بھی اعلان کرتا ہے۔ تاہم، نیم میں، کسی بھی اظہار سے ایک مستقل کا اعلان کیا جا سکتا ہے جس کا تجزیہ مرتب کرنے کے وقت کیا جا سکتا ہے۔ سی #میں، صرف سی #بلٹ ان اقسام کو کانسٹ کے طور پر قرار دیا جا سکتا ہے ؛ صارف سے متعین اقسام، بشمول کلاسیں، ڈھانچے، اور صف، کانسٹ نہیں ہو سکتے۔ جاوا میں کانسٹ نہیں ہے-اس کے بجائے اس میں فائنل ہے، جس کا اطلاق مقامی "متغیر" اعلانات پر کیا جا سکتا ہے اور شناخت کنندہ پر لاگو ہوتا ہے، قسم پر نہیں۔ آبجیکٹ ممبروں کے لیے اس کا ایک مختلف آبجیکٹ پر مبنی استعمال ہے، جو کہ نام کی ابتدا ہے۔ جاوا زبان کی تفصیلات کانسٹ کو ایک مخصوص مطلوبہ الفاظ کے طور پر دیکھتی ہیں-یعنی وہ جسے متغیر شناخت کنندہ کے طور پر استعمال نہیں کیا جا سکتا-لیکن اس کے لیے کوئی الفاظ تفویض نہیں کرتا: یہ ایک مخصوص لفظ ہے (اسے شناخت کنندگان میں استعمال نہیں کیا جا سکتا) لیکن مطلوبہ الفاظ نہیں ہے (اس کا کوئی خاص معنی نہیں ہے)۔ یہ خیال کیا جاتا ہے کہ کلیدی لفظ کا ریزرویشن جاوا زبان کی توسیع کی اجازت دینے کے لیے ہوا ہے جس میں C + + طرز کے کانسٹ طریقے اور پوائنٹر سے کانسٹ ٹائپ شامل ہیں۔ جاوا کمیونٹی پروسیس میں مستقل درستگی کو نافذ کرنے کے لیے ایک اضافہ کی درخواست ٹکٹ موجود ہے، لیکن اسے 2005 میں اس بنیاد پر بند کر دیا گیا تھا کہ بیک ورڈ مطابقت پذیر انداز میں نافذ کرنا ناممکن تھا۔ عصری اڈا 83 میں آزادانہ طور پر ایک مستقل آبجیکٹ اور ایک مستقل مطلوبہ الفاظ کا تصور تھا، جس میں ان پٹ پیرامیٹرز اور لوپ پیرامیٹرز مضمر طور پر مستقل تھے۔ یہاں مستقل شے کی خاصیت ہے، قسم کی نہیں۔ جاوا اسکرپٹ میں ایک کانسٹ ڈیکلریشن ہے جو ایک بلاک اسکوپڈ متغیر کی وضاحت کرتا ہے جسے دوبارہ تفویض نہیں کیا جا سکتا اور نہ ہی دوبارہ اعلان کیا جا سکتا ہے۔ یہ کسی متغیر کے لیے صرف پڑھنے کے حوالے کی وضاحت کرتا ہے جس کی نئی تعریف نہیں کی جا سکتی، لیکن کچھ حالات میں متغیر کی قدر خود ممکنہ طور پر تبدیل ہو سکتی ہے، جیسے کہ اگر متغیر کسی شے سے مراد ہے اور اس کی خاصیت کو تبدیل کر دیا گیا ہے۔ سنگل اسائنمنٹ پابندی پوائنٹر عرفی نوٹ حوالہ جات بیرونی لنکس "مستقل درستگی" بذریعہ ہرب سٹر "مستقل اصلاح؟" بھی دیکھیں۔ دی سی + + ایف اے کیو لائٹ: مارشل کلائن کی مستقل درستگی بروس ایکیل کی مفت الیکٹرانک کتاب تھنکنگ ان سی + + سے "ویلیو سبسیٹیوشن" سیکشن "ہیئر اے کانسٹ، دیئر اے کانسٹ" والٹر برائٹ کی "کانسٹ اینڈ انویرینٹ" ڈی پروگرامنگ زبان کی تفصیلات سے، ورژن 2 (تجرباتی) سی پروگرامنگ زبان فیملی ڈیٹا ٹائپز مضامین مثال کے طور پر سی کوڈ مضامین مثال کے طور پر سی + + کوڈ پروگرامنگ زبان کے موضوعات کے ساتھ