Const (computer programming)
কিছু প্রোগ্রামিং ভাষায়, কনস্ট একটি টাইপ কোয়ালিফায়ার (একটি ডেটা টাইপে প্রয়োগ করা একটি কীওয়ার্ড) যা নির্দেশ করে যে ডেটা শুধুমাত্র পঠনযোগ্য। যদিও এটি ধ্রুবক ঘোষণা করতে ব্যবহার করা যেতে পারে, সি পরিবারের ভাষাগুলি প্রকারের অংশ হওয়ার ক্ষেত্রে অন্যান্য ভাষার অনুরূপ গঠনগুলির থেকে পৃথক এবং এইভাবে পয়েন্টার, রেফারেন্স, যৌগিক ডেটা প্রকার এবং টাইপ-চেকিংয়ের সাথে মিলিত হলে জটিল আচরণ রয়েছে। অন্যান্য ভাষায়, তথ্য একটি একক মেমরি অবস্থানে থাকে না, তবে প্রতিটি ব্যবহারের সময় সংকলনের সময় অনুলিপি করা হয়। যে ভাষাগুলি এটি ব্যবহার করে সেগুলির মধ্যে রয়েছে সি, সি + +, ডি, জাভাস্ক্রিপ্ট, জুলিয়া এবং রাস্ট। ভূমিকা যখন কোনও বস্তুর ঘোষণায় প্রয়োগ করা হয়, তখন এটি নির্দেশ করে যে বস্তুটি একটি ধ্রুবকঃ একটি পরিবর্তনশীলের বিপরীতে এর মান পরিবর্তিত নাও হতে পারে। এই মৌলিক ব্যবহার-ধ্রুবক ঘোষণা করার জন্য-অন্যান্য অনেক ভাষায় সমান্তরাল। যাইহোক, অন্যান্য ভাষার মতো নয়, সি পরিবারের ভাষাগুলিতে কনস্ট প্রকারের অংশ, বস্তুর অংশ নয়। উদাহরণস্বরূপ, সি-তে, একটি বস্তু x-কে পূর্ণসংখ্যা ধ্রুবক ধরনের বলে ঘোষণা করা হয়-ধ্রুবকটি সেই ধরনের অংশ, যেন এটি "(পূর্ণসংখ্যা ধ্রুবক) x"-কে বিশ্লেষণ করা হয়েছে-যখন অ্যাডা-তে, একটি ধ্রুবক (এক ধরনের বস্তু) এক্স-কে পূর্ণসংখ্যা ধরনের বলে ঘোষণা করা হয়ঃ ধ্রুবকটি বস্তুর অংশ, কিন্তু প্রকারের অংশ নয়। এর দুটি সূক্ষ্ম ফলাফল রয়েছে। প্রথমত, আরও জটিল ধরনের অংশে স্থিরাংক প্রয়োগ করা যেতে পারে-উদাহরণস্বরূপ, পূর্ণসংখ্যা * ধ্রুবক x; একটি ধ্রুবক পূর্ণসংখ্যার জন্য একটি ধ্রুবক নির্দেশক ঘোষণা করে, যখন পূর্ণসংখ্যা * x; একটি ধ্রুবক পূর্ণসংখ্যার জন্য একটি পরিবর্তনশীল নির্দেশক ঘোষণা করে, এবং পূর্ণসংখ্যা * ধ্রুবক x; একটি পরিবর্তনশীল পূর্ণসংখ্যার জন্য একটি ধ্রুবক নির্দেশক ঘোষণা করে। দ্বিতীয়ত, যেহেতু কনস্ট টাইপের অংশ, তাই টাইপ-চেকিংয়ের অংশ হিসাবে এটি অবশ্যই মেলাতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি অবৈধঃ অকার্যকর f (int & x);//. int স্থিরাংক i; f (i); কারণ f-এর যুক্তি অবশ্যই একটি পরিবর্তনশীল পূর্ণসংখ্যা হতে হবে, তবে i একটি ধ্রুবক পূর্ণসংখ্যা। এই মিলটি প্রোগ্রামের সঠিকতার একটি রূপ, এবং এটি স্থির-সঠিকতা হিসাবে পরিচিত। এটি চুক্তির মাধ্যমে এক ধরনের প্রোগ্রামিংয়ের অনুমতি দেয়, যেখানে ফাংশনগুলি তাদের ধরনের স্বাক্ষরের অংশ হিসাবে নির্দিষ্ট করে যে তারা তাদের আর্গুমেন্টগুলি সংশোধন করে কিনা এবং তাদের রিটার্ন মান পরিবর্তনযোগ্য কিনা। এই টাইপ-চেকিং প্রাথমিকভাবে পয়েন্টার এবং রেফারেন্সগুলিতে আগ্রহের বিষয়-পূর্ণসংখ্যার মতো মৌলিক মানের প্রকার নয়-তবে যৌগিক ডেটা প্রকার বা টেমপ্লেটযুক্ত প্রকার যেমন পাত্রেগুলির জন্যও। এটি এই সত্য দ্বারা গোপন করা হয় যে টাইপ জবরদস্তির (অন্তর্নিহিত টাইপ রূপান্তর) এবং সি কল-বাই-ভ্যালু হওয়ার (সি + + এবং ডি হয় কল-বাই-ভ্যালু বা কল-বাই-রেফারেন্স) কারণে প্রায়শই কনস্ট বাদ দেওয়া যেতে পারে। পরিণতি কনস্ট-নেস-এর ধারণাটি বোঝায় না যে কম্পিউটারের স্মৃতিতে সঞ্চিত পরিবর্তনশীলটি অলিখিত। বরং, কনস্ট-নেস একটি কম্পাইল-টাইম গঠন যা নির্দেশ করে যে একজন প্রোগ্রামারের কী করা উচিত, অগত্যা তারা কী করতে পারে তা নয়। তবে লক্ষ্য করুন যে পূর্বনির্ধারিত তথ্যের ক্ষেত্রে (যেমন চার কনস্ট * স্ট্রিং আক্ষরিক), সি কনস্ট প্রায়শই অলিখিত হয়। ধ্রুবক থেকে পার্থক্য প্রোগ্রামটি চলার সময় একটি ধ্রুবক তার মান পরিবর্তন না করলেও, স্থির বলে ঘোষিত একটি বস্তু প্রোগ্রামটি চলার সময় প্রকৃতপক্ষে তার মান পরিবর্তন করতে পারে। একটি সাধারণ উদাহরণ হল ডিজিটাল ইনপুটের বর্তমান অবস্থার মতো এমবেডেড সিস্টেমের মধ্যে শুধুমাত্র রিড রেজিস্টার। ডিজিটাল ইনপুটগুলির জন্য ডেটা রেজিস্টারগুলিকে প্রায়শই স্থির এবং অস্থির হিসাবে ঘোষণা করা হয়। প্রোগ্রামটি কিছু না করেই এই রেজিস্টারগুলির বিষয়বস্তু পরিবর্তিত হতে পারে (অস্থির) তবে আপনি তাদের কাছেও (স্থির) লিখবেন না। অন্যান্য ব্যবহার এছাড়াও, একটি (অ-স্থির) সদস্য-ফাংশনকে স্থির হিসাবে ঘোষণা করা যেতে পারে। এই ক্ষেত্রে, এই ধরনের ফাংশনের ভিতরে এই পয়েন্টারটি কেবল অবজেক্ট টাইপ * টাইপের পরিবর্তে অবজেক্ট টাইপ কনস্ট * টাইপের হয়। এর মানে হল যে এই বস্তুর জন্য নন-কনস্ট ফাংশনগুলি এই ধরনের ফাংশনের ভিতর থেকে কল করা যায় না, বা মেম্বার ভেরিয়েবলগুলিও সংশোধন করা যায় না। সি + +-এ, একটি সদস্য পরিবর্তনশীল পরিবর্তনশীল হিসাবে ঘোষণা করা যেতে পারে, যা নির্দেশ করে যে এই সীমাবদ্ধতা এটির ক্ষেত্রে প্রযোজ্য নয়। কিছু ক্ষেত্রে, এটি কার্যকর হতে পারে, উদাহরণস্বরূপ ক্যাশিং, রেফারেন্স গণনা এবং ডেটা সিঙ্ক্রোনাইজেশনের ক্ষেত্রে। এই ক্ষেত্রে, বস্তুটির যৌক্তিক অর্থ (অবস্থা) অপরিবর্তিত থাকে, তবে বস্তুটি শারীরিকভাবে ধ্রুবক নয় কারণ এর বিটওয়াইজ উপস্থাপনা পরিবর্তিত হতে পারে। সি, সি + + এবং ডি-তে, ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ডেটা সহ সমস্ত ডেটা প্রকারকে স্থির বলে ঘোষণা করা যেতে পারে এবং স্থির-সঠিকতা নির্দেশ করে যে সমস্ত ভেরিয়েবল বা বস্তুগুলিকে পরিবর্তন করার প্রয়োজন না হলে সেগুলি হিসাবে ঘোষণা করা উচিত। কনস্ট-এর এই ধরনের সক্রিয় ব্যবহার মানগুলিকে "বোঝা, অনুসরণ করা এবং যুক্তি করা সহজ করে তোলে", এবং এইভাবে এটি কোডের পঠনযোগ্যতা এবং বোধগম্যতা বৃদ্ধি করে এবং দলে কাজ করা এবং কোড বজায় রাখা সহজ করে তোলে কারণ এটি একটি মানের উদ্দেশ্যমূলক ব্যবহার সম্পর্কে তথ্য যোগাযোগ করে। কোড সম্পর্কে যুক্তি করার সময় এটি সংকলকের পাশাপাশি বিকাশকারীকেও সাহায্য করতে পারে। এটি একটি অপ্টিমাইজিং কম্পাইলারকে আরও দক্ষ কোড তৈরি করতে সক্ষম করতে পারে। সহজ তথ্য প্রকার সাধারণ অ-নির্দেশক তথ্য প্রকারের জন্য, কনস্ট কোয়ালিফায়ার প্রয়োগ করা সোজা। ঐতিহাসিক কারণে এটি কিছু ধরনের উভয় দিকে যেতে পারে (উদাহরণস্বরূপ, কনস্ট চার ফু = 'এ'; চার কনস্ট ফু = 'এ'; এর সমতুল্য)। কিছু বাস্তবায়নে, দুইবার কনস্ট ব্যবহার করা (উদাহরণস্বরূপ, কনস্ট চার কনস্ট বা চার কনস্ট কনস্ট) একটি সতর্কতা তৈরি করে তবে ত্রুটি নয়। পয়েন্টার এবং রেফারেন্স পয়েন্টার এবং রেফারেন্স প্রকারের জন্য, কনস্ট এর অর্থ আরও জটিল-হয় পয়েন্টার নিজেই, বা যে মানটি নির্দেশ করা হচ্ছে, বা উভয়ই কনস্ট হতে পারে। উপরন্তু, বাক্য গঠন বিভ্রান্তিকর হতে পারে। একটি পয়েন্টারকে লিখনযোগ্য মানের জন্য একটি স্থির নির্দেশক, অথবা একটি স্থির মানের জন্য একটি লিখনযোগ্য নির্দেশক, অথবা স্থির মানের জন্য স্থির নির্দেশক হিসাবে ঘোষণা করা যেতে পারে। একটি কনস্ট পয়েন্টারকে প্রাথমিকভাবে নির্ধারিত বস্তুর থেকে আলাদা বস্তুর দিকে নির্দেশ করার জন্য পুনরায় নিয়োগ করা যায় না, তবে এটি যে মানটি নির্দেশ করে তা সংশোধন করতে ব্যবহার করা যেতে পারে (যাকে পয়েন্টি বলা হয়)। সি + +-এ রেফারেন্স ভেরিয়েবলগুলি কনস্ট পয়েন্টারের জন্য একটি বিকল্প সিনট্যাক্স। অন্যদিকে, একটি স্থির বস্তুর একটি নির্দেশককে অন্য স্মৃতির অবস্থান নির্দেশ করার জন্য পুনরায় নিযুক্ত করা যেতে পারে (যা একই ধরনের বা রূপান্তরযোগ্য ধরনের একটি বস্তু হওয়া উচিত), তবে এটি যে স্মৃতির দিকে নির্দেশ করছে তা সংশোধন করতে এটি ব্যবহার করা যাবে না। একটি কনস্ট বস্তুর একটি কনস্ট পয়েন্টারও ঘোষণা করা যেতে পারে এবং অ্যাপয়েন্টি সংশোধন করতে বা অন্য কোনও বস্তুর দিকে নির্দেশ করার জন্য পুনরায় নিযুক্ত করা যাবে না। নিম্নলিখিত কোডটি এই সূক্ষ্মতাগুলি ব্যাখ্যা করেঃ অকার্যকর Foo (int * ptr, int স্থিরাংক * ptrToConst, int * স্থিরাংক স্থিরাংকPtr, int ধ্রুবক * স্থিরাংক স্থিরাংকPtrToConst) {* ptr = 0;// OK: পয়েন্ট করা ডেটা ptr = null-এ পরিবর্তন করে;// OK: পয়েন্টার পরিবর্তন করে * ptrToConst = 0;// ত্রুটি! পয়েন্ট টু ডেটা পরিবর্তন করতে পারে না pttrToConst = null;// OK: পয়েন্টার পরিবর্তন করে * স্থির করে = 0;// ঠিক আছেঃ পয়েন্ট টু ডেটা পরিবর্তন করে স্থির করে;// ত্রুটি! পয়েন্টার পরিবর্তন করতে পারে না * কনস্টপিটারটোকনস্ট = 0;// ত্রুটি! তথ্যের দিকে নির্দেশিত অংশটি পরিবর্তন করা যায় না কনস্টপট্রটোকনস্ট = এন. ইউ. এল. এল;// ত্রুটি! পয়েন্টার পরিবর্তন করা যায় না} সি কনভেনশন ঘোষণার জন্য সাধারণ সি কনভেনশন অনুসরণ করে, ঘোষণাটি ব্যবহার অনুসরণ করে এবং পয়েন্টারের * পয়েন্টারের উপর লেখা থাকে, যা রেফারেন্সিং নির্দেশ করে। উদাহরণস্বরূপ, ঘোষণাপত্রে int * ptr, অনির্দিষ্ট ফর্ম * ptr একটি int, যেখানে রেফারেন্স ফর্ম ptr একটি int-এর নির্দেশক। এইভাবে কনস্ট নামটিকে তার ডানদিকে পরিবর্তন করে। সি + + কনভেনশনটি পরিবর্তে * কে প্রকারের সাথে সংযুক্ত করা হয়, যেমন int * ptr-এ, এবং বাঁ দিকের প্রকারটি পরিবর্তন করে স্থিরাংকটি পড়ুন। এইভাবে "* ptrToConst হল একটি পূর্ণসংখ্যা" (মান ধ্রুবক), অথবা "ptrToConst হল একটি পূর্ণসংখ্যা ধ্রুবক *" (নির্দেশক একটি ধ্রুবক পূর্ণসংখ্যার নির্দেশক) হিসাবে পড়া যেতে পারে। সুতরাংঃ int * ptr;// * ptr হল একটি int মান int স্থিরাংক * ptrToConst;// ptrToConst হল একটি ধ্রুবক (int: পূর্ণসংখ্যা মান) int * স্থিরাংক;// স্থিরাংক হল একটি ধ্রুবক (int *: পূর্ণসংখ্যা নির্দেশক) int স্থিরাংক * ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রুবক ধ্রু সুতরাং, তারার বাম দিকের সমস্ত কিছুকে তীক্ষ্ণ প্রকার হিসাবে চিহ্নিত করা যেতে পারে এবং তারার ডান দিকের সমস্ত কিছুই নির্দেশক বৈশিষ্ট্য। উদাহরণস্বরূপ, উপরের আমাদের উদাহরণে, int * * কে একটি লিখনযোগ্য নির্দেশক হিসাবে পড়া যেতে পারে যা একটি অ-লিখনযোগ্য পূর্ণসংখ্যাকে বোঝায় এবং int * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * আরও একটি সাধারণ নিয়ম যা আপনাকে জটিল ঘোষণা এবং সংজ্ঞাগুলি বুঝতে সাহায্য করেঃ এমন সনাক্তকারীকে খুঁজে বের করুন যার ঘোষণাটি আপনি বুঝতে চান, যতদূর সম্ভব ডানদিকে পড়ুন (অর্থাৎ, ঘোষণার শেষ অবধি বা পরবর্তী বন্ধনীতে, যেটি প্রথমে আসে) আপনি যেখানে শুরু করেছিলেন সেখানে ফিরে যান এবং বাম দিকে পিছনে পড়ুন (অর্থাৎ, ঘোষণার শুরু পর্যন্ত বা পূর্ববর্তী ধাপে পাওয়া বন্ধনীটির সাথে মেলে খোলা-বন্ধনীতে) যখন আপনি আপনার ঘোষণার শুরুতে পৌঁছেছেন। যদি তা না হয়, তবে শেষ বন্ধনীটি অতিক্রম করে দ্বিতীয় ধাপে এগিয়ে যান। এখানে একটি উদাহরণ দেওয়া হলঃ বাম দিকে পড়ার সময়, ডান থেকে বাম দিকে উপাদানগুলি পড়া গুরুত্বপূর্ণ। সুতরাং একটি ইন্ট কনস্ট * একটি কনস্ট ইন্টের পয়েন্টার হয়ে যায় এবং একটি ইন্টের কনস্ট পয়েন্টার নয়। কিছু ক্ষেত্রে সি/সি + + কনস্ট কীওয়ার্ডটিকে টাইপের বাম দিকে রাখার অনুমতি দেয়। এখানে কিছু উদাহরণ রয়েছেঃ কনস্ট্যান্ট ইন্ট * পি. টি. আর. টু কনস্ট্যান্ট;// অভিন্নঃ ইন্ট কনস্ট্যান্ট * পি. টি. আর. টু কনস্ট্যান্ট;// অভিন্নঃ ইন্ট কনস্ট্যান্ট * কনস্ট্যান্ট কনস্টপর্টটু কনস্ট্যান্ট যদিও সি/সি + + এই ধরনের সংজ্ঞাগুলির অনুমতি দেয় (যা বাম থেকে ডানে সংজ্ঞাগুলি পড়ার সময় ইংরেজি ভাষার সাথে ঘনিষ্ঠভাবে মেলে), সংকলক এখনও উপরে উল্লিখিত পদ্ধতি অনুসারে সংজ্ঞাগুলি পড়েঃ ডান থেকে বামে। কিন্তু যা অবশ্যই ধ্রুবক হতে হবে তার আগে ধ্রুবক স্থাপন করা দ্রুত আপনি যা লিখতে চান এবং সংকলক আপনি যা লিখেছেন তার মধ্যে অসামঞ্জস্যের পরিচয় দেয়। পয়েন্টারগুলিতে পয়েন্টারগুলি বিবেচনা করুনঃ int * * ptr;// একটি পয়েন্টার থেকে একটি পয়েন্টার থেকে একটি পয়েন্টার থেকে একটি পয়েন্টার থেকে ধ্রুবক int মান// (একটি ধ্রুবক পয়েন্টার থেকে একটি পয়েন্টার নয়) int * * * ptr// একটি ধ্রুবক পয়েন্টার থেকে একটি পয়েন্টার থেকে int মান// (একটি পয়েন্টার থেকে একটি ধ্রুবক পয়েন্টার নয়) int * * স্থির ptr// একটি ধ্রুবক পয়েন্টার থেকে ints// (ptr, সনাক্তকারী, ধ্রুবক হওয়ার কোনও অর্থ নেই) int * * * ধ্রুবক ptr// একটি ধ্রুবক পয়েন্টার থেকে সূচকগুলি ধ্রুবক int মানগুলিতে একটি ধ্রুবক পয়েন্টার পয়েন্টার হিসাবে পয়েন্টার সম্পর্কিত চূড়ান্ত নোট হিসাবে প্রকারের সাথে পয়েন্টার প্রতীক সংযুক্ত করা জটিল, কারণ এটি দৃঢ়ভাবে একটি পয়েন্টার প্রকারের পরামর্শ দেয়, যা ক্ষেত্রে হয় না। এখানে কিছু উদাহরণ রয়েছেঃ int * a;/* লিখুনঃ */int * a;// a একটি int * a, b-এর একটি নির্দেশক;// কনফ্যুসিং/* লিখুনঃ */int * a, b-এর একটি নির্দেশক,// কিন্তু b একটি নিছক int * a, * b;// UGLY: a এবং b উভয়ই ints/* লেখার নির্দেশকঃ */int * a, * b; এই সমস্যা এড়াতে Bjarne Stroustrup-এর FAQ সুপারিশ করে যে, C + + কনভেনশন ব্যবহার করলে প্রতি লাইনে শুধুমাত্র একটি পরিবর্তনশীল ঘোষণা করা হবে। রেফারেন্স এবং rভ্যালু রেফারেন্স সংজ্ঞায়িত করার ক্ষেত্রেও একই বিবেচনা প্রযোজ্য হয়ঃ int ভার = 22; int স্থিরাংক & ریفটোকনস্ট = ভার;// OK int স্থিরাংক & রেফ 2 = ভার, রেফ 3 = ভার;// কনফ্যুজিংঃ// রেফ 2 একটি রেফারেন্স, কিন্তু রেফ 3 নয়ঃ// রেফ 3 একটি ধ্রুবক যা// ভারের মান int & স্থিরাংক = ভার;// ERROR দিয়ে শুরু করা হয়েছে কারণ রেফারেন্সগুলি যেভাবেই হোক পরিবর্তন হতে পারে না। //সি + +: int & & rref = int (5), মান = 10;// কনফ্যুজিংঃ// rref একটি rভ্যালু রেফারেন্স, কিন্তু মান হল// একটি নিছক int। / * লিখুনঃ */int & & rref = int (5), মান = 10; পয়েন্টারগুলিতে বহুমাত্রিক অ্যারে এবং রেফারেন্স (বা পয়েন্টার) ব্যবহার করার সময় আরও জটিল ঘোষণার মুখোমুখি হয়। যদিও কখনও কখনও যুক্তি দেওয়া হয় যে এই ধরনের ঘোষণাগুলি বিভ্রান্তিকর এবং ত্রুটি-প্রবণ এবং তাই সেগুলি এড়ানো বা উচ্চ-স্তরের কাঠামো দ্বারা প্রতিস্থাপিত করা উচিত, এই বিভাগের শীর্ষে বর্ণিত পদ্ধতিটি সর্বদা অস্পষ্টতা বা বিভ্রান্তি প্রবর্তন না করেই ব্যবহার করা যেতে পারে। প্যারামিটার এবং ভেরিয়েবল কনস্ট ফাংশন প্যারামিটার এবং ভেরিয়েবল (স্ট্যাটিক বা স্বয়ংক্রিয়, গ্লোবাল বা স্থানীয় সহ) উভয় ক্ষেত্রেই ঘোষণা করা যেতে পারে। ব্যবহারভেদে এর ব্যাখ্যা ভিন্ন হয়। একটি স্থির চলক (গ্লোবাল চলক বা স্থির স্থানীয় চলক) একটি ধ্রুবক, এবং গাণিতিক ধ্রুবকের মতো তথ্যের জন্য ব্যবহার করা যেতে পারে, যেমন ডাবল স্থিরাংক পিআই = 3.14159-বাস্তবসম্মতভাবে দীর্ঘ, বা সামগ্রিক সংকলন-সময় পরামিতি। একটি স্থির স্বয়ংক্রিয় পরিবর্তনশীল (অ-স্থিতিশীল স্থানীয় পরিবর্তনশীল) মানে হল যে একক অ্যাসাইনমেন্ট ঘটছে, যদিও প্রতিবার একটি ভিন্ন মান ব্যবহার করা যেতে পারে, যেমন পূর্ণসংখ্যা x _ বর্গ = x * x। পাস-বাই-রেফারেন্সের একটি কনস্ট প্যারামিটারের অর্থ হল যে রেফারেন্সকৃত মানটি পরিবর্তিত হয় না-এটি চুক্তির অংশ-যখন পাস-বাই-ভ্যালুতে একটি কনস্ট প্যারামিটার (বা পয়েন্টার নিজেই, পাস-বাই-রেফারেন্স) ইন্টারফেসে কিছু যোগ করে না (যেমন মানটি অনুলিপি করা হয়েছে), তবে ইঙ্গিত করে যে অভ্যন্তরীণভাবে, ফাংশনটি প্যারামিটারের স্থানীয় অনুলিপি পরিবর্তন করে না (এটি একটি একক বরাদ্দ)। এই কারণে, কেউ কেউ শুধুমাত্র পাস-বাই-রেফারেন্সের জন্য পরামিতিগুলিতে কনস্ট ব্যবহার করার পক্ষে, যেখানে এটি চুক্তি পরিবর্তন করে, কিন্তু পাস-বাই-মানের জন্য নয়, যেখানে এটি বাস্তবায়নের বিষয়টি প্রকাশ করে। সি + + পদ্ধতি ব্যবহারকারী-সংজ্ঞায়িত প্রকারের (কাঠামো এবং শ্রেণী) জন্য চুক্তি পদ্ধতির মাধ্যমে নকশার সুবিধা নেওয়ার জন্য, যার পদ্ধতির পাশাপাশি সদস্যদের ডেটা থাকতে পারে, প্রোগ্রামার ইনস্ট্যান্স পদ্ধতিগুলিকে কনস্ট হিসাবে ট্যাগ করতে পারে যদি তারা বস্তুর ডেটা সদস্যদের সংশোধন না করে। উদাহরণ পদ্ধতিতে কনস্ট কোয়ালিফায়ার প্রয়োগ করা এইভাবে কনস্ট-সঠিকতার জন্য একটি অপরিহার্য বৈশিষ্ট্য, এবং জাভা এবং সি #এর মতো অন্যান্য অনেক অবজেক্ট-ভিত্তিক ভাষায় বা মাইক্রোসফ্টের সি + +/সিএলআই বা সি + + এর জন্য পরিচালিত এক্সটেনশনে উপলব্ধ নয়। যদিও কনস্ট পদ্ধতিগুলি কনস্ট এবং অ-কনস্ট বস্তু দ্বারা একইভাবে বলা যেতে পারে, অ-কনস্ট পদ্ধতিগুলি কেবল অ-কনস্ট বস্তু দ্বারা আহ্বান করা যেতে পারে। একটি ইনস্ট্যান্স পদ্ধতির কনস্ট মোডিফায়ার "এই" পয়েন্টার দ্বারা নির্দেশিত বস্তুর ক্ষেত্রে প্রযোজ্য, যা সমস্ত ইনস্ট্যান্স পদ্ধতিতে পাস করা একটি অন্তর্নিহিত যুক্তি। সুতরাং কনস্ট পদ্ধতি থাকা অন্যান্য আর্গুমেন্টের মতো অন্তর্নিহিত "এই" পয়েন্টার আর্গুমেন্টে কনস্ট-সঠিকতা প্রয়োগ করার একটি উপায়। এই উদাহরণটি ব্যাখ্যা করেঃ শ্রেণী সি {ইন্টি আই; পাবলিকঃ ইন্টি গেট () কনস্ট// নোট করুন "কনস্ট" ট্যাগটি {রিটার্ন আই;} অকার্যকর সেট (ইন্টি জে)// নোট করুন "কনস্ট"-এর অভাব লক্ষ্য করুন {আই = জে;}}; অকার্যকর ফু (সি & নন কনস্ট, সি কনস্ট & কনস্ট) {ইন্টি ওয়াই = nonConstC.Get ();// ওকে ইন্টি এক্স = constC.Get ();// ওকেঃ গেট () হল কনস্ট nonConstC.Set (10);// ওকেঃ নন-কনস্টসি পরিবর্তনযোগ্য constC.Set (10);// ত্রুটি! সেট () একটি নন-কনস্ট পদ্ধতি এবং কনস্টসি একটি কনস্ট-যোগ্য বস্তু} উপরের কোডে, সেট ()-এর অন্তর্নিহিত "এই" পয়েন্টারটিতে "সি * কনস্ট" টাইপ রয়েছে; যেখানে "এই" পয়েন্টারটিতে গেট ()-এর টাইপ "সি কনস্ট * কনস্ট" রয়েছে, যা নির্দেশ করে যে পদ্ধতিটি "এই" পয়েন্টারের মাধ্যমে তার বস্তু পরিবর্তন করতে পারে না। প্রায়শই প্রোগ্রামার উভয় ধরনের কলারকে সামঞ্জস্য করার জন্য একটি ক্লাসে একই নামের (তবে সম্ভবত বেশ ভিন্ন ব্যবহার) একটি স্থির এবং অ-স্থির পদ্ধতি উভয়ই সরবরাহ করবে। বিবেচনা করুনঃ শ্রেণী মাইএরে {int ডেটা [100]; সর্বজনীনঃ int & Get (int i) {রিটার্ন ডেটা [i];} int স্থিরাংক & Get (int i) স্থিরাংক {রিটার্ন ডেটা [i];}}; বাতিল Foo (মাইএরে & অ্যারে, মাইএরে স্থিরাংক & স্থিরাংক) {// একটি অ্যারে উপাদানের একটি রেফারেন্স পান// এবং তার উল্লেখিত মান পরিবর্তন করুন। array.Get (5) = 42;// ঠিক আছে! (কলঃ int & MyArray:: Get (int)) constArray.Get (5) = 42;// ত্রুটি! (কলঃ ইন্ট কনস্ট এবং মাইএরেঃঃ গেট (ইন্ট) কনস্ট)} কলিং অবজেক্টের কনস্ট-নেস নির্ধারণ করে যে মাইএরেঃঃ গেট ()-এর কোন সংস্করণটি আহ্বান করা হবে এবং এইভাবে কলকারীকে এমন একটি রেফারেন্স দেওয়া হয়েছে কিনা যা দিয়ে সে কেবল বস্তুর ব্যক্তিগত তথ্য পরিচালনা করতে পারে বা পর্যবেক্ষণ করতে পারে। দুটি পদ্ধতির প্রযুক্তিগতভাবে ভিন্ন স্বাক্ষর রয়েছে কারণ তাদের "এই" পয়েন্টারগুলির বিভিন্ন প্রকার রয়েছে, যা সংকলককে সঠিকটি বেছে নেওয়ার অনুমতি দেয়। (শুধুমাত্র মান দ্বারা ইন্টি ফেরত দেওয়ার পরিবর্তে, একটি ইন্টে একটি স্থির রেফারেন্স ফেরত দেওয়া, দ্বিতীয় পদ্ধতিতে ওভারকিল হতে পারে, তবে স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরির মতো নির্বিচারে প্রকারের জন্য একই কৌশল ব্যবহার করা যেতে পারে।) সি এবং সি + +-এ বিশুদ্ধ কনস্ট-সঠিকতার জন্য বেশ কয়েকটি ফাঁক রয়েছে। এগুলি মূলত বিদ্যমান কোডের সাথে সামঞ্জস্যের জন্য বিদ্যমান। প্রথমটি, যা শুধুমাত্র সি + +-এর ক্ষেত্রে প্রযোজ্য, তা হল কনস্ট কাস্ট-এর ব্যবহার, যা প্রোগ্রামারকে কনস্ট কোয়ালিফায়ারটি খুলে ফেলতে দেয়, যে কোনও বস্তুকে পরিবর্তনযোগ্য করে তোলে। বিদ্যমান কোড এবং গ্রন্থাগারগুলি ব্যবহার করার সময় যোগ্যতা অর্জনকারীকে সরিয়ে ফেলার প্রয়োজনীয়তা দেখা দেয় যা সংশোধন করা যায় না তবে যা সঠিক নয়। উদাহরণস্বরূপ, এই কোডটি বিবেচনা করুনঃ// প্রোটোটাইপ এমন একটি ফাংশনের জন্য যা আমরা পরিবর্তন করতে পারি না কিন্তু যা// আমরা জানি যে পয়েন্টটি পরিবর্তন করে না। বাতিল লাইব্রেরিফান্ক (পূর্ণসংখ্যা * পিটিআর, পূর্ণসংখ্যা); বাতিল কল লাইব্রেরিফান্ক (পূর্ণসংখ্যা * পিটিআর, পূর্ণসংখ্যা আকার) {লাইব্রেরিফান্ক (পূর্ণসংখ্যা, আকার);// ত্রুটি! তবে, কনস্ট কাস্টের মাধ্যমে কনস্ট হিসাবে ঘোষিত কোনও বস্তুকে পরিবর্তন করার যে কোনও প্রচেষ্টার ফলে আইএসও সি + + স্ট্যান্ডার্ড অনুসারে অনির্ধারিত আচরণ হয়। উপরের উদাহরণে, যদি পি. টি. আর কনস্ট হিসাবে ঘোষিত একটি গ্লোবাল, স্থানীয় বা সদস্য পরিবর্তনশীলকে উল্লেখ করে, বা নতুন ইন্ট কনস্টের মাধ্যমে হিপে বরাদ্দ করা কোনও বস্তুকে উল্লেখ করে, তবে কোডটি কেবল তখনই সঠিক হবে যদি লাইব্রেরিফাঙ্ক সত্যিই পি. টি. আর দ্বারা নির্দেশিত মানটি সংশোধন না করে। সি ভাষার একটি ফাঁকফোকরের প্রয়োজন রয়েছে কারণ একটি নির্দিষ্ট পরিস্থিতি বিদ্যমান। স্ট্যাটিক স্টোরেজ সময়কাল সহ ভেরিয়েবলগুলিকে একটি প্রাথমিক মান দিয়ে সংজ্ঞায়িত করার অনুমতি দেওয়া হয়। যাইহোক, ইনিশিয়ালাইজার শুধুমাত্র স্ট্রিং ধ্রুবক এবং অন্যান্য আক্ষরিকের মতো ধ্রুবক ব্যবহার করতে পারে, এবং পরিবর্তনশীল নামের মতো অ-ধ্রুবক উপাদানগুলি ব্যবহার করার অনুমতি নেই, ইনিশিয়ালাইজার উপাদানগুলি স্থির ঘোষণা করা হোক বা না হোক, বা স্থির সময়কালের পরিবর্তনশীলকে স্থির ঘোষণা করা হচ্ছে কি না। স্ট্যাটিক স্টোরেজ সময়কাল সহ একটি কনস্ট ভেরিয়েবল শুরু করার একটি অ-পোর্টেবল উপায় রয়েছে। পরবর্তী অ্যাসাইনমেন্টের বাম দিকে সাবধানে একটি টাইপকাস্ট তৈরি করে, একটি কনস্ট ভেরিয়েবলকে লেখা যেতে পারে, কার্যকরভাবে কনস্ট বৈশিষ্ট্যটি সরিয়ে এবং অন্যান্য কনস্ট ভেরিয়েবলের মতো অ-ধ্রুবক উপাদানগুলির সাথে এটি 'সূচনা' করা যেতে পারে। এইভাবে একটি স্থির পরিবর্তনশীলের মধ্যে লেখা উদ্দেশ্য অনুযায়ী কাজ করতে পারে, তবে এটি অনির্ধারিত আচরণের কারণ হতে পারে এবং গুরুতরভাবে স্থিরতার বিরোধিতা করেঃ সাইজ _ টি কনস্ট বাফারসাইজ = 8 * 1024; সাইজ _ টি কনস্ট ব্যবহারকারী টেক্সটবফারসাইজ;// প্রাথমিক মান কনস্ট বাফারসাইজের উপর নির্ভর করে, এখানে আরম্ভ করা যায় না। int সেটআপইউজারটেক্সটবক্স (টেক্সটবক্স _ টি * ডিফল্ট টেক্সটবক্সটাইপ, রেক্ট _ টি * ডিফল্ট টেক্সটবক্সলোকেশন) {* (সাইজ _ টি *) এবং ব্যবহারকারী টেক্সটবফারসাইজ = বাফারসাইজ-আকারের কাঠামো (টেক্সটবক্সকন্ট্রোলস);// সতর্কতাঃ কাজ করতে পারে, কিন্তু সি দ্বারা নিশ্চিত নয়। বিশেষত, ভাষাগুলি নির্দেশ করে যে সদস্যদের পয়েন্টার এবং রেফারেন্সগুলি তাদের মালিকদের স্থিরতার ক্ষেত্রে "অগভীর"-অর্থাৎ, একটি ধারণকারী বস্তু যা ধ্রুবক, সেই সদস্য পয়েন্টি (এবং রেফারি) ব্যতীত সমস্ত ধ্রুবক সদস্য এখনও পরিবর্তনযোগ্য। উদাহরণস্বরূপ, এই সি + + কোডটি বিবেচনা করুনঃ কাঠামো এস {ইন্টি ভাল; ইন্টি * পিটিআর;}; অকার্যকর ফু (এস কনস্ট এবং এস) {ইন্টি আই = 42; s.val = আই;// ত্রুটিঃ এস কনস্ট, তাই ভাল একটি কনস্ট ইন্টি s.ptr = & আই;// ত্রুটিঃ এস কনস্ট, তাই পিটিআর একটি কনস্ট পয়েন্টার ইন্টি * s.ptr = আই;// ঠিক আছেঃ পিটিআর দ্বারা নির্দেশিত ডেটা সর্বদা পরিবর্তনযোগ্য,// যদিও এটি কখনও কখনও কাম্য নয়। এই কারণে, মেয়ার্স যুক্তি দেখান যে মেম্বার পয়েন্টার এবং রেফারেন্সের ডিফল্ট "ডিপ" কনস্ট-নেস হওয়া উচিত, যা একটি পরিবর্তনযোগ্য কোয়ালিফায়ার দ্বারা ওভাররাইড করা যেতে পারে যখন পয়েন্টি ধারকটির মালিকানাধীন নয়, তবে এই কৌশলটি বিদ্যমান কোডের সাথে সামঞ্জস্যের সমস্যা তৈরি করবে। সুতরাং, ঐতিহাসিক কারণে, এই ফাঁকটি সি এবং সি + +-এ খোলা থাকে। পরবর্তী ফাঁকফোকরটি একটি স্থির-সঠিক ইন্টারফেসের পিছনে পয়েন্টারটি লুকানোর জন্য একটি শ্রেণী ব্যবহার করে বন্ধ করা যেতে পারে, তবে এই ধরনের শ্রেণীগুলি হয় একটি স্থির বস্তু থেকে স্বাভাবিক অনুলিপি শব্দার্থবিদ্যাকে সমর্থন করে না (যার অর্থ হল যে ধারণকারী শ্রেণীটি স্বাভাবিক শব্দার্থবিদ্যা দ্বারা অনুলিপি করা যায় না) অথবা অসাবধানতাবশত বা ইচ্ছাকৃত অনুলিপির মাধ্যমে স্থির-শক্তি অপসারণের অনুমতি দিয়ে অন্যান্য ফাঁকফোকরগুলিকে অনুমতি দেয়। পরিশেষে, সি স্ট্যান্ডার্ড লাইব্রেরির বেশ কয়েকটি ফাংশন সি23-এর আগে কনস্ট-সঠিকতা লঙ্ঘন করে, কারণ তারা একটি অক্ষর স্ট্রিং-এ একটি কনস্ট পয়েন্টার গ্রহণ করে এবং একই স্ট্রিংয়ের একটি অংশে একটি নন-কনস্ট পয়েন্টার ফিরিয়ে দেয়। এই ফাংশনগুলির মধ্যে রয়েছে এস. আর. এস. আর এবং এস. আর. সি. আর। সি + + স্ট্যান্ডার্ড লাইব্রেরির কিছু বাস্তবায়ন, যেমন মাইক্রোসফ্ট কিছু ফাংশনের দুটি ওভারলোড সংস্করণ সরবরাহ করে এই ফাঁকফোকরটি বন্ধ করার চেষ্টা করেঃ একটি "কনস্ট" সংস্করণ এবং একটি "নন-কনস্ট" সংস্করণ। সমস্যাগুলি ধারাবাহিকতা প্রকাশের জন্য টাইপ সিস্টেমের ব্যবহার বিভিন্ন জটিলতা এবং সমস্যার দিকে পরিচালিত করে এবং সেই অনুযায়ী সমালোচনা করা হয়েছে এবং সি, সি + +, এবং ডি. জাভা এবং সি #-এর সংকীর্ণ সি পরিবারের বাইরে গৃহীত হয়নি, যা সি এবং সি + + দ্বারা ব্যাপকভাবে প্রভাবিত, উভয়ই স্পষ্টভাবে কনস্ট-স্টাইল টাইপ কোয়ালিফায়ার প্রত্যাখ্যান করেছে, পরিবর্তে সনাক্তকারী (জাভাতে চূড়ান্ত, কনস্ট এবং সি #-তে কেবল পঠনযোগ্য)-এর ক্ষেত্রে প্রযোজ্য কীওয়ার্ড দ্বারা ধারাবাহিকতা প্রকাশ করে। এমনকি সি এবং সি + +-এর মধ্যেও, কনস্ট-এর ব্যবহার উল্লেখযোগ্যভাবে পরিবর্তিত হয়, কিছু প্রকল্প এবং সংস্থা এটি ধারাবাহিকভাবে ব্যবহার করে এবং অন্যরা এটি এড়িয়ে চলে। স্ট্রচার সমস্যা কনস্ট টাইপ কোয়ালিফায়ার অসুবিধা সৃষ্টি করে যখন কোনও ফাংশনের যুক্তি তার ইনপুট ধ্রুবক কিনা তা নিয়ে অজ্ঞেয়বাদী হয়, তবে এমন একটি মান প্রদান করে যা ইনপুটের মতো একই যোগ্য ধরণের হওয়া উচিত। অন্য কথায়, এই ফাংশনগুলির জন্য, যদি ইনপুটটি ধ্রুবক (ধ্রুবক-যোগ্য) হয়, তবে রিটার্ন মানটিও হওয়া উচিত, তবে যদি ইনপুটটি পরিবর্তনশীল হয় (ধ্রুবক-যোগ্য নয়), তবে রিটার্ন মানটিও হওয়া উচিত। যেহেতু এই ফাংশনগুলির স্বাক্ষরের ধরন আলাদা, তাই এর জন্য একই যুক্তি সহ দুটি ফাংশন (বা একাধিক ইনপুটের ক্ষেত্রে সম্ভাব্যভাবে আরও বেশি) প্রয়োজন-জেনেরিক প্রোগ্রামিংয়ের একটি রূপ। এই সমস্যাটি এমনকি সি স্ট্যান্ডার্ড লাইব্রেরির সহজ ফাংশনগুলির ক্ষেত্রেও দেখা দেয়, বিশেষত স্ট্রচার; এই পর্যবেক্ষণের কৃতিত্ব রিচি 1980-এর দশকের মাঝামাঝি সময়ে টম প্লামকে দিয়েছিলেন। স্ট্রচার ফাংশন একটি স্ট্রিং-এ একটি অক্ষরকে সনাক্ত করে; আনুষ্ঠানিকভাবে, এটি স্ট্রিং s-এ c অক্ষরের প্রথম উপস্থিতির জন্য একটি পয়েন্টার ফেরত দেয় এবং ক্লাসিক সি (কেএন্ডআরসি)-তে এর প্রোটোটাইপ হলঃ চার * স্ট্রচার (চার * এস, ইন্ট সি); স্ট্রচার ফাংশন ইনপুট স্ট্রিংকে পরিবর্তন করে না, তবে রিটার্ন মানটি প্রায়শই কলার দ্বারা স্ট্রিংটি সংশোধন করতে ব্যবহৃত হয়, যেমনঃ যদি (পি = স্ট্রচার (কিউ, '/')) * পি = '; সুতরাং একদিকে ইনপুট স্ট্রিংটি স্থির হতে পারে (যেহেতু এটি ফাংশন দ্বারা পরিবর্তিত হয় না), এবং যদি ইনপুট স্ট্রিংটি স্থির হয় তবে রিটার্ন মানটিও হওয়া উচিত-সবচেয়ে সহজ কারণ এটি ঠিক ফিরে আসতে পারে। সি + + এ এটি ফাংশন ওভারলোডিংয়ের মাধ্যমে করা হয়, সাধারণত একটি টেমপ্লেটের মাধ্যমে প্রয়োগ করা হয়, যার ফলে দুটি ফাংশন হয়, যাতে রিটার্ন মানের ইনপুটের মতো একই ধ্রুবক-যোগ্য প্রকার থাকেঃ চার * স্ট্রচার (চার * এস, ইন্ট সি); চার কনস্ট * স্ট্রচার (চার কনস্ট * এস, ইন্ট সি); এগুলি পালাক্রমে একটি টেমপ্লেট দ্বারা সংজ্ঞায়িত করা যেতে পারেঃ টেমপ্লেট <টি> টি * স্ট্রচার (টি * এস, ইন্ট সি) {। ডি-তে এটি ইনআউট কীওয়ার্ডের মাধ্যমে পরিচালিত হয়, যা কনস্ট, অপরিবর্তনীয়, বা অযোগ্য (পরিবর্তনশীল) এর জন্য ওয়াইল্ডকার্ড হিসাবে কাজ করেঃ ইনআউট (চার) * স্ট্রচার (ইনআউট (চার) * এস, ইন্ট এই সমাধানটি রিচি দ্বারা প্রস্তাবিত হয়েছিল এবং পরবর্তীকালে গৃহীত হয়েছিল। এই পার্থক্যটি সি এবং সি + + এর সামঞ্জস্যের ব্যর্থতাগুলির মধ্যে একটি। সি23 থেকে, এই সমস্যাটি জেনেরিক ফাংশন ব্যবহার করে সমাধান করা হয়। এস. আর. সি. আর এবং ইস্যুর দ্বারা প্রভাবিত অন্যান্য ফাংশনগুলি একটি কনস্ট পয়েন্টার ফেরত দেবে যদি একটি তাদের কাছে পাঠানো হয় এবং একটি অযোগ্য পয়েন্টার যদি তাদের কাছে পাঠানো হয়। ডি এর 2য় সংস্করণে, কনস্ট সম্পর্কিত দুটি কীওয়ার্ড বিদ্যমান। অপরিবর্তনীয় কীওয়ার্ডটি এমন তথ্যকে বোঝায় যা কোনও রেফারেন্সের মাধ্যমে সংশোধন করা যায় না। কনস্ট কীওয়ার্ডটি পরিবর্তনযোগ্য ডেটার একটি অ-পরিবর্তনশীল দৃশ্যকে বোঝায়। সি + + কনস্ট্যান্টের বিপরীতে, ডি কনস্ট্যান্ট এবং অপরিবর্তনীয় হল "গভীর" বা, এবং একটি কনস্ট্যান্ট বা অপরিবর্তনীয় বস্তুর মাধ্যমে পৌঁছানো যায় এমন যে কোনও কিছু যথাক্রমে কনস্ট্যান্ট বা অপরিবর্তনীয়। কনস্ট বনাম অপরিবর্তনীয়ের উদাহরণ ডি ইন্টে [] ফো = নতুন ইন্টে [5];// ফো পরিবর্তনযোগ্য। কনস্ট্যান্ট [] বার = ফো;// বার হল পরিবর্তনীয় তথ্যের একটি কনস্ট ভিউ। অপরিবর্তনীয় [] বাজ = ফো;// ত্রুটিঃ অপরিবর্তনীয় তথ্যের সমস্ত দৃষ্টিভঙ্গি অবশ্যই অপরিবর্তনীয় হতে হবে। অপরিবর্তনীয় int [] nums = নতুন অপরিবর্তনীয় (int) [5];// সংখ্যার কোনও পরিবর্তনযোগ্য রেফারেন্স তৈরি করা যাবে না। কনস্ট [] কনস্টনাম = সংখ্যা;// কাজ করে। অপরিবর্তনীয় হল অন্তর্নিহিতভাবে স্থিরাংশে রূপান্তরযোগ্য। int [] মিউট্যাবল নাম = সংখ্যা;// ত্রুটিঃ অপরিবর্তনীয় তথ্যের একটি মিউট্যাবল ভিউ তৈরি করতে পারে না। ডি শ্রেণীতে ট্রানজিটিভ বা গভীর কনস্ট্যান্টের উদাহরণ Foo {Foo পরবর্তী; int num;} অপরিবর্তনীয় Fooo = নতুন অপরিবর্তনীয় (Foo); foo.next.num = 5;// সংকলন করবে না। foo.next অপরিবর্তনীয় (Foo) ধরনের। //foo.next.num অপরিবর্তনীয় (int) ধরনের। 1981 সালে সি + +-এর পূর্বসূরি ক্লাসের সাথে সি-তে বার্ন স্ট্রস্ট্রুপ দ্বারা হিস্ট্রি কনস্ট চালু করা হয়েছিল এবং এটিকে মূলত রিড অনলি বলা হত। অনুপ্রেরণা সম্পর্কে স্ট্রস্ট্রপ লিখেছেনঃ "এটি দুটি কাজ করেছেঃ একটি প্রতীকী ধ্রুবককে সংজ্ঞায়িত করার একটি উপায় হিসাবে যা সুযোগ এবং প্রকারের নিয়মগুলি মেনে চলে (অর্থাৎ, একটি ম্যাক্রো ব্যবহার না করে) এবং স্মৃতিতে কোনও বস্তুকে অপরিবর্তনীয় বলে মনে করার একটি উপায় হিসাবে।" প্রথম ব্যবহার, ম্যাক্রোগুলির স্কোপড এবং টাইপ করা বিকল্প হিসাবে, ইনলাইন কীওয়ার্ডের মাধ্যমে ফাংশনের মতো ম্যাক্রোগুলির জন্য অনুরূপভাবে পূরণ করা হয়েছিল। কনস্ট্যান্ট পয়েন্টার এবং * কনস্ট নোটেশন, ডেনিস রিচি দ্বারা প্রস্তাবিত হয়েছিল এবং তাই গৃহীত হয়েছিল। এরপর প্রমিতকরণের অংশ হিসেবে কনস্টকে সি-তে গ্রহণ করা হয় এবং অন্যান্য ধরনের কোয়ালিফায়ারের সঙ্গে সি89-এ (এবং পরবর্তী সংস্করণগুলিতে) দেখা যায়। 1987 সালের ডিসেম্বরে এক্স3জে11 কমিটির বৈঠকে আরও একটি যোগ্যতা অর্জনকারী, নোয়ালিয়াসের পরামর্শ দেওয়া হয়েছিল, কিন্তু তা প্রত্যাখ্যান করা হয়েছিল; এর লক্ষ্য শেষ পর্যন্ত সি99-এর সীমাবদ্ধ কীওয়ার্ড দ্বারা পূরণ করা হয়েছিল। রিচি এই সংযোজনগুলির খুব বেশি সমর্থন করেননি, যুক্তি দিয়েছিলেন যে তারা "তাদের ওজন বহন করে না", তবে শেষ পর্যন্ত মান থেকে তাদের অপসারণের পক্ষে যুক্তি দেননি। ডি পরবর্তীকালে সি + + থেকে কনস্ট্রাক্টর উত্তরাধিকার সূত্রে পেয়েছিল, যেখানে এটি টাইপ কনস্ট্রাক্টর (টাইপ কোয়ালিফায়ার নয়) হিসাবে পরিচিত এবং সম্পর্কিত ব্যবহারের ক্ষেত্রে পরিচালনা করার জন্য আরও দুটি টাইপ কনস্ট্রাক্টর, অপরিবর্তনীয় এবং ইনআউট যোগ করা হয়েছিল। অন্যান্য ভাষাগুলি অন্যান্য ভাষাগুলি সি/সি + + অনুসরণ করে না, যদিও তাদের প্রায়শই উপরিভাগে অনুরূপ গঠন থাকে এবং কনস্ট কীওয়ার্ড ব্যবহার করতে পারে। সাধারণত এটি শুধুমাত্র ধ্রুবকের (ধ্রুবক বস্তু) জন্য ব্যবহৃত হয়। সি #-এর একটি কনস্ট কীওয়ার্ড রয়েছে, তবে মৌলিকভাবে ভিন্ন এবং সহজ শব্দার্থবিজ্ঞান সহঃ এর অর্থ একটি সংকলন-সময় ধ্রুবক, এবং এটি প্রকারের অংশ নয়। নিমের সি #-এর মতো একটি কনস্ট কীওয়ার্ড রয়েছেঃ এটি প্রকারের অংশ গঠনের পরিবর্তে একটি সংকলন-সময় ধ্রুবকও ঘোষণা করে। যাইহোক, নিম-এ, যে কোনও অভিব্যক্তি থেকে একটি ধ্রুবক ঘোষণা করা যেতে পারে যা সংকলন সময়ে মূল্যায়ন করা যেতে পারে। সি #-এ, শুধুমাত্র সি #অন্তর্নির্মিত প্রকারগুলিকে স্থির বলে ঘোষণা করা যেতে পারে; শ্রেণী, কাঠামো এবং অ্যারে সহ ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি স্থির হতে পারে না। জাভাতে কনস্ট নেই-এর পরিবর্তে এর ফাইনাল রয়েছে, যা স্থানীয় "পরিবর্তনশীল" ঘোষণাগুলিতে প্রয়োগ করা যেতে পারে এবং শনাক্তকারীর ক্ষেত্রে প্রযোজ্য, প্রকারের ক্ষেত্রে নয়। অবজেক্ট সদস্যদের জন্য এটির একটি ভিন্ন অবজেক্ট-ওরিয়েন্টেড ব্যবহার রয়েছে, যা নামের উৎস। জাভা ভাষার নির্দিষ্টকরণ কনস্টকে একটি সংরক্ষিত কীওয়ার্ড হিসাবে বিবেচনা করে-অর্থাৎ, যা পরিবর্তনশীল সনাক্তকারী হিসাবে ব্যবহার করা যায় না-তবে এতে কোনও শব্দার্থ বরাদ্দ করে নাঃ এটি একটি সংরক্ষিত শব্দ (এটি সনাক্তকারীগুলিতে ব্যবহার করা যায় না) তবে একটি কীওয়ার্ড নয় (এর কোনও বিশেষ অর্থ নেই)। মনে করা হয় যে জাভা ভাষার সম্প্রসারণের জন্য সি + +-শৈলীর কনস্ট পদ্ধতি এবং পয়েন্টার থেকে কনস্ট টাইপ অন্তর্ভুক্ত করার জন্য কীওয়ার্ডের সংরক্ষণ ঘটেছিল। জাভা কমিউনিটি প্রসেসে সঠিকতা বাস্তবায়নের জন্য একটি বর্ধিতকরণ অনুরোধ টিকিট বিদ্যমান, কিন্তু 2005 সালে এই ভিত্তিতে বন্ধ করে দেওয়া হয়েছিল যে পশ্চাৎ-সামঞ্জস্যপূর্ণ পদ্ধতিতে বাস্তবায়ন করা অসম্ভব ছিল। সমসাময়িক অ্যাডা 83-এর স্বাধীনভাবে একটি ধ্রুবক বস্তু এবং একটি ধ্রুবক কীওয়ার্ডের ধারণা ছিল, যেখানে ইনপুট প্যারামিটার এবং লুপ প্যারামিটারগুলি অন্তর্নিহিতভাবে ধ্রুবক ছিল। এখানে ধ্রুবকটি বস্তুর একটি বৈশিষ্ট্য, প্রকারের নয়। জাভাস্ক্রিপ্টের একটি স্থির ঘোষণা রয়েছে যা একটি ব্লক-স্কোপড পরিবর্তনশীলকে সংজ্ঞায়িত করে যা পুনরায় নিয়োগ বা পুনরায় ঘোষণা করা যায় না। এটি একটি পরিবর্তনশীলের জন্য একটি পঠনযোগ্য রেফারেন্সকে সংজ্ঞায়িত করে যা পুনরায় সংজ্ঞায়িত করা যায় না, তবে কিছু পরিস্থিতিতে পরিবর্তনশীলের মান নিজেই সম্ভাব্যভাবে পরিবর্তিত হতে পারে, যেমন যদি পরিবর্তনশীল কোনও বস্তুকে বোঝায় এবং এর একটি বৈশিষ্ট্য পরিবর্তন করা হয়। আরও দেখুন সিঙ্গল অ্যাসাইনমেন্ট রিস্ট্রিক্ট পয়েন্টার আলিয়াজিং নোটস রেফারেন্স বাহ্যিক লিঙ্ক "কনস্ট্যান্ট-করেক্টনেস" বাই হার্ব সাটার "কনস্ট্যান্ট অপ্টিমাইজেশন?" দ্য সি + + এফএকিউ লাইটঃ মার্শাল ক্লাইনের ধ্রুবক সঠিকতা বিভাগ ব্রুস একেলের মুক্ত বৈদ্যুতিন বই থিঙ্কিং ইন সি + + থেকে "মূল্য প্রতিস্থাপন" ওয়াল্টার ব্রাইটের "হিয়ার এ কনস্ট, দেয়ার এ কনস্ট" ডি প্রোগ্রামিং ভাষা নির্দিষ্টকরণ থেকে "কনস্ট এবং ইনভ্যারিয়েন্ট", সংস্করণ 2 (পরীক্ষামূলক) সি প্রোগ্রামিং ভাষা পরিবার ডেটা প্রকারের নিবন্ধগুলি উদাহরণস্বরূপ সি কোড সহ নিবন্ধগুলি উদাহরণস্বরূপ সি + + কোড প্রোগ্রামিং ভাষা বিষয় সহ নিবন্ধ