আমি সি ++ এর সাথে কথা বলব, যেখানে এই পার্থক্যটি সবচেয়ে প্রাসঙ্গিক।
আপনি যেমনটি সঠিকভাবে লক্ষ করেছেন, অপরিবর্তনীয় মানে হ'ল কোনও বস্তু তৈরির পরে একেবারেই পরিবর্তন করতে পারে না। এই সৃষ্টিটি অবশ্যই রানটাইম সময়ে ঘটতে পারে, অর্থাত্ কোনও constবস্তু অগত্যা একটি সংকলন-সময় ধ্রুবক নয়। সি ++ এ, (1) এবং (2) বা (3) পূরণ করা হলে কোনও অবজেক্টটি অপরিবর্তনীয়:
mutableএটিতে constসদস্যদের কার্যক্রমে পরিবর্তিত এমন কোনও সদস্যের ঘোষণা নেই
এটা ঘোষণা করা হয় const
constসদস্য ফাংশনগুলি কোনও সদস্যকে পরিবর্তন করার জন্য যোগ্যতা const_castঅপসারণ করতে ব্যবহার করে নাconst
তবে আপনি অ্যাক্সেস সংশোধকগুলিও বিবেচনা করতে পারেন: যদি কোনও ক্রিয়াকলাপ অভ্যন্তরীণভাবে কোনও উদাহরণকে রূপান্তরিত করে তবে এর সার্বজনীন ইন্টারফেসের মাধ্যমে পর্যবেক্ষণযোগ্য উদাহরণের অবস্থার উপর কোনও প্রভাব না পড়ে, তবে অবজেক্টটি "যৌক্তিকভাবে অপরিবর্তনীয়"।
সুতরাং সি ++ অপরিবর্তনীয় অবজেক্ট তৈরি করার জন্য প্রয়োজনীয় সরঞ্জাম সরবরাহ করে তবে সি ++ এর বেশিরভাগের মতো, সরঞ্জামগুলি কেবলমাত্র ন্যূনতম পর্যাপ্ত, এবং প্রকৃতপক্ষে ব্যবহারের জন্য অধ্যবসায় প্রয়োজন। উদাহরণস্বরূপের পরিস্থিতি অগত্যা দৃষ্টান্তের সদস্য ভেরিয়েবলের মধ্যে সীমাবদ্ধ নয় - কারণ সি ++ প্রাসঙ্গিক স্বচ্ছতা প্রয়োগের কোনও উপায় সরবরাহ করে না, এটি বিশ্বব্যাপী বা শ্রেণীর রাষ্ট্রও অন্তর্ভুক্ত করতে পারে।
constরেফারেন্স এবং পয়েন্টারগুলির যোগ্যতা অর্জনের জন্য সি ++ তেও অন্য একটি কার্য রয়েছে। একটি constরেফারেন্স একটি অ- constঅবজেক্টের উল্লেখ করতে পারে । const_castকোনও বিষয়টিকে constরেফারেন্সের মাধ্যমে রূপান্তর করতে আইনী (যদিও সাধারণত প্রয়োজনীয় বা পরামর্শযুক্ত না হয়) এটি বৈধ , যদি এবং কেবলমাত্র যদি সেই অবজেক্টটি অ-ঘোষণা করা হয় const:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
এবং অবশ্যই এটি কোনও constবস্তুর রূপান্তর করার জন্য অপরিবর্তিত আচরণ :
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
constপ্রতিটি ভাষায় অস্তিত্ব নেই, এবং প্রতিটি ভাষায় পরিবর্তন এবং অপরিবর্তনীয়তা বিদ্যমান নেই তাই এই ভাষাকে তাত্পর্যপূর্ণ করা প্রযোজ্য নয়। এই ধারণাগুলি কেবল যেখানে প্রয়োগ হয় এটি ভাষা নির্দিষ্ট ।