অপরিবর্তনীয় এবং কনস্টের মধ্যে পার্থক্য


28

আমি প্রায়শই শর্তাদি দেখেছি immutableএবং constবিনিময়ভাবে ব্যবহার করেছি । যাইহোক, আমার (সামান্য) অভিজ্ঞতা থেকে, কোডগুলিতে তারা যে 'চুক্তি করে' তাতে দু'জনের মধ্যে অনেক বেশি পার্থক্য রয়েছে:

অপরিবর্তনীয় চুক্তি করে যে এই বস্তুটি কোনওভাবেই পরিবর্তিত হবে না (যেমন পাইথন টিপলস, জাভা স্ট্রিং)।

কনস্ট চুক্তি করে যে এই ভেরিয়েবলের সুযোগে এটি সংশোধন করা হবে না (এই সময়কালে অন্য থ্রেডগুলি কীভাবে নির্দেশিত বস্তুর প্রতি করণীয় সে সম্পর্কে কোনও প্রতিশ্রুতি নেই, যেমন সি / সি ++ কীওয়ার্ড)।

স্পষ্টতই, দুটি ভাষা সমান নয়, যদি না ভাষা একক থ্রেডযুক্ত (পিএইচপি) হয়, না হয় লিনিয়ার বা এককভাবে টাইপিং সিস্টেম (ক্লিন, বুধ, এটিএস) থাকে has

প্রথমত, এই দুটি ধারণা সম্পর্কে আমার বোঝাটি কি সঠিক?

দ্বিতীয়ত, যদি কোনও পার্থক্য থাকে, তবে কেন তারা প্রায় একচেটিয়াভাবে বিনিময়যোগ্যভাবে ব্যবহৃত হয়?


1
constপ্রতিটি ভাষায় অস্তিত্ব নেই, এবং প্রতিটি ভাষায় পরিবর্তন এবং অপরিবর্তনীয়তা বিদ্যমান নেই তাই এই ভাষাকে তাত্পর্যপূর্ণ করা প্রযোজ্য নয়। এই ধারণাগুলি কেবল যেখানে প্রয়োগ হয় এটি ভাষা নির্দিষ্ট

2
সম্পর্কিত, প্রস্তাবিত পাঠ্য: অপ্রচলতার প্রকারগুলি (কয়েকটি সি # উদাহরণ, তবে মূলত ভাষা-অজ্ঞাস্তিক)। কেউ এরিক লিপার্টকে মেডেল দেন।

উত্তর:


14

আমি সি ++ এর সাথে কথা বলব, যেখানে এই পার্থক্যটি সবচেয়ে প্রাসঙ্গিক।

আপনি যেমনটি সঠিকভাবে লক্ষ করেছেন, অপরিবর্তনীয় মানে হ'ল কোনও বস্তু তৈরির পরে একেবারেই পরিবর্তন করতে পারে না। এই সৃষ্টিটি অবশ্যই রানটাইম সময়ে ঘটতে পারে, অর্থাত্ কোনও constবস্তু অগত্যা একটি সংকলন-সময় ধ্রুবক নয়। সি ++ এ, (1) এবং (2) বা (3) পূরণ করা হলে কোনও অবজেক্টটি অপরিবর্তনীয়:

  1. mutableএটিতে constসদস্যদের কার্যক্রমে পরিবর্তিত এমন কোনও সদস্যের ঘোষণা নেই

  2. এটা ঘোষণা করা হয় const

  3. 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.

19

জাভাতে কথা বলতে যেখানে "চূড়ান্ত" শব্দটি "কনস্ট" উপস্থাপন করে, বিবেচনা করুন:

final Person someone = new Person();

এর অর্থ someoneঅন্য ব্যক্তির অবজেক্টটিকে কখনই উল্লেখ করতে পারে না। তবে, আপনি এখনও উল্লেখ করা ব্যক্তির বিশদটি পরিবর্তন করতে পারেন। যেমনsomeone.setMonthlySalary(10000);

তবে, যদি someoneকোনও "অপরিবর্তনীয়" অবজেক্ট হয় তবে নিম্নলিখিতগুলির মধ্যে একটি সত্য হবে: (ক) আপনার কাছে কোনও পদ্ধতি নেই setMonthlySalary (খ) কলিং সেটমাথলি স্যালারি সর্বদা একটি ব্যতিক্রম ছুঁড়ে ফেলবে যেমনUnsupportedOperationException


10

অপরিবর্তনীয় বস্তু হ'ল এটি তৈরির পরে রাষ্ট্র পরিবর্তন করে না। উদাহরণ স্বরূপ;

string prefix = "Pre";
string postfix = "Post";
string myComplexStr = prefix + postfix;

এই উদাহরণে myComplexStr অবজেক্টটি অপরিবর্তনীয় তবে ধ্রুবক নয় কারণ এর মান গণনা করা হয়। এবং এটি পরিবর্তনযোগ্য কারণ এটি একটি স্ট্রিং এবং একটি স্থির দৈর্ঘ্যের সম্পত্তি রয়েছে এবং এটি পরিবর্তন করতে পারে না।

কনস্ট অবজেক্টগুলি সাধারণত কিছু আসল ধ্রুবক সনাক্ত করতে ব্যবহৃত হয় যার মানগুলি পাই, "ইউএসএ", "স্ট্যাকওভারফ্লো ডটকম", পোর্ট নম্বর এবং এর মতো সংকলনের আগে পরিচিত।

এই দৃষ্টিকোণ থেকে কনস্ট অপরিবর্তনীয় বস্তুর থেকে পৃথক কারণ তাদের মানগুলি প্রোগ্রাম দ্বারা গণনা করা হয় না।

তবে আপনি যদি সি ++ তে "কনস্ট" কীওয়ার্ডের কথা বলছেন, আপনি বলতে পারেন যে "কনস্ট" অপরিবর্তনীয় অবজেক্ট তৈরি করতে ব্যবহৃত হয়।


1
সি ++ এ কনস্ট্যান্ট অপরিবর্তনীয় বস্তু তৈরি করবেন না, এটি কেবলমাত্র অ্যাক্সেসের স্তর।
ক্লাইম

"কনস্টল ডাবল পাই = 3.14" কীভাবে অপরিবর্তনীয় তা আপনি ব্যাখ্যা করতে পারেন?
Mert Akcakaya

আচ্ছা এটি কোথায় আছে তার উপর নির্ভর করে। আসুন আমি বলি: "ডাবল * পি_পিআই = কনস্ট_কাস্ট <ডাবল *> (& পিআই); * পি_পিআই = 42;" উদাহরণ স্বরূপ. তারপরে পাই যদি গ্লোবাল স্পেস বা নেমস্পেসে থাকে তবে আমি সেগমেন্টেশন ত্রুটি পাই, তবে এটি আমার বিশ্বাস, অপরিজ্ঞাত আচরণ, নির্দিষ্ট ত্রুটি নয়। পাই যদি রানটাইমের সময় উপলভ্য যে কোনও অবজেক্টের সদস্য হয়, যা স্থিতিশীল নয়, আমি পাই পাই == ৪২. আপনি দেখতে পাচ্ছেন, এমনকি পরিবর্তনীয় ব্যবহারও উপলব্ধ কারণ সি ++ এ কনটেন্ট অ্যাক্সেস লেভেল, শব্দার্থক, ডেটা অপরিবর্তনীয়তা সম্পর্কে নয় সি ++ এ অর্জন করা প্রায় অসম্ভব। আপনি কেবল এটি "অনুকরণ" করতে পারেন। কনস্ট পরিবর্তনযোগ্য নয়।
ক্লাইম

1
constআইআইআরসি, নির্ধারিত স্থান নির্বিশেষে @ ক্লেইমকে এরকম পরিবর্তন করা অপরিজ্ঞাত আচরণ। এবং অনির্ধারিত আচরণ হওয়ার নিশ্চয়তার সাথে নির্দিষ্ট কোনও ত্রুটির চেয়েও খারাপ । এর অর্থ হল আপনি আর সি ++ ব্যবহার করবেন না - সি ++ কোনও constমান পরিবর্তন করার কোনও উপায় সরবরাহ করে না ( mutableঅবশ্যই সদস্য ব্যতীত তবে এটি আপনার বক্তব্য নয়), তবে সি ++ অবধি আপনি এটি করতে পারবেন না। সুনির্দিষ্ট বাস্তবায়নের অনুমতি দেওয়ার জন্য যা ঘটে থাকে তা পুরোপুরি আরেকটি বিষয় (এবং আমি আপনাকে বাজি ধরছি, আপনি যদি অনুকূলিতকরণগুলি সংকলন করেন তবে আপনি যে স্টান্টটি টানছেন সেটি পরবর্তী piবিকল্পগুলি প্রভাবিত করবে না কারণ এটি প্রতিস্থাপিত হয়েছে)।

"সি ++ এ কনটেন্ট অপরিবর্তনীয় বস্তুগুলি তৈরি করবেন না" এখনও ভুল কারণ এটি এখনও আপনার নিজের উত্তরে যেমন বলেছে বৈশ্বিক ধ্রুবক তৈরি করে। মূলশব্দটি কোনও স্তরের অবশ্যই কোস্টের সিমনেটিক, অন্যথায় আপনি সবসময় ম্যানুয়ালি কোনও মেমরি সেলের ভোল্টেজ পরিবর্তন করতে পারেন এবং যদি আপনি অপরিজ্ঞাত আচরণগুলি ব্যবহার করতে আগ্রহী হন তবে অপরিবর্তনীয় কোনও জিনিসের মান পরিবর্তন করতে পারেন।
Mert Akcakaya

8

প্রথমত, এই দুটি ধারণা সম্পর্কে আমার বোঝাটি কি সঠিক?

হ্যাঁ তবে আপনার দ্বিতীয় প্রশ্নটি দেখায় যে আপনি এই পার্থক্যগুলি বুঝতে পারেন না।

দ্বিতীয়ত, যদি কোনও পার্থক্য থাকে, তবে কেন তারা প্রায় একচেটিয়াভাবে বিনিময়যোগ্যভাবে ব্যবহৃত হয়?

constসি ++ এ কেবল অ্যাক্সেস স্তরের জন্য ব্যবহৃত হয় (এর অর্থ "কেবলমাত্র পঠনযোগ্য") অপরিবর্তনীয়তার জন্য নয়। এটি বোঝায় যে অ্যাক্সেস নিজেই ডেটা থেকে সম্পূর্ণ পৃথক। উদাহরণস্বরূপ আপনি কিছু ডেটা ম্যানিপুলেট করতে পারেন তবে কনস্টের রেফারেন্সের মাধ্যমে এটি প্রকাশ করতে পারেন। অ্যাক্সেস কেবল পঠনযোগ্য, তবে ডেটা নিজেই, যেমন সমস্ত ডেটাম পরিবর্তনীয়।

কেবলমাত্র অ্যাক্সেসের সীমাবদ্ধতাগুলিকে গ্যারান্টি দেয়, অপরিবর্তনীয়তা (উদাহরণস্বরূপ ডি তে যেমন) অবজেক্টের জীবনের যে কোনও পর্যায়ে ডেটা পরিবর্তন করার কোনও উপায়ই বোঝায় না

এখন, আপনি সি ++ তে অপরিবর্তনীয়তা অনুকরণ করতে পারেন কনস্টের ব্যতীত অন্য কোনও উপায়ে অ্যাক্সেস করা সম্ভব নয় এবং নিশ্চিত হয়ে নিন যে এটি আরম্ভ করা হয়েছে তবে আর স্পর্শ করা হয়নি। তবে এটি দৃ strong় গ্যারান্টি নয় কারণ আপনি যখন আপনার ডেটাটিকে পরিবর্তনহীন হিসাবে চিহ্নিত করেন তখন ডি এর মতো ভাষা আপনাকে দেয়। ভাষাটি নিশ্চিত করে যে সেই ডেটা সংশোধন করে যে কোনও অপারেশন করা মোটেই সম্ভব নয়, যদিও সি ++ এ আপনি এখনও প্রয়োজনে কনস্টের কাস্টিং এবং মিউটেবিলিটির মাধ্যমে ডেটা পরিবর্তন করতে সম্ভাব্য।

শেষ পর্যন্ত, এটি মোটেও একই নয় কারণ এটি সমস্ত একই গ্যারান্টি সরবরাহ করে না।


3

জাভাস্ক্রিপ্টের কথা বলছি, মূল শব্দ constএবংObject.freeze

constবাইন্ডিংয়েরvariables ক্ষেত্রে প্রযোজ্য । এটি একটি অপরিবর্তনীয় বাঁধাই তৈরি করে, আপনি এটিতে কোনও নতুন মান নির্ধারণ করতে পারবেন না।

Object.freezeঅবজেক্ট ভ্যালুতে কাজ করে। এটি কোনও বস্তুকে স্থাবর করে তোলে । যথা, আপনি এর বৈশিষ্ট্যগুলি পরিবর্তন করতে পারবেন না।


0

সি ++ এ সেগুলি একই রকম। যদিও আপনি কোনও constবস্তুর পরিবর্তন করতে পারবেন যদি আপনার মেমরিতে অবস্থান থাকে এবং সেই মেমরিতে লেখার জন্য ওএসের অনুমতি থাকে।


1
প্রকৃতপক্ষে এগুলি তাদের সমান হওয়ার বিরুদ্ধে যুক্তিযুক্ত : সি ++ এর কেবল কোনও অপরিবর্তনীয় কীওয়ার্ড বা ভাষা সমর্থন নেই। এবং এছাড়াও, আমি ধরে নিচ্ছি যে প্রোগ্রামার ভাষাটি বুদ্ধিমানভাবে ব্যবহার করে: অন্যথায়, কনস্টেরও, এর কোনও মূল্য নেই।
স্টেফ

1
@ কে.স্টেফ - সম্ভবত এটি বলা ভাল যে সি ++ এ কনস্টের দেওয়া ছাড়া অন্য কোনও অতিরিক্ত অপরিবর্তনীয় নেস নেই
মার্টিন বেকেট

একেবারে সুনির্দিষ্ট :)
কে.স্টেফ

সি ++ এ তারা মোটেও এক রকম নয়। কনস্ট হ'ল "পঠনযোগ্য" অ্যাক্সেস স্তর, এর অর্থ এই নয় যে ডেটা অপরিবর্তনীয়। আপনি বেশিরভাগ সময় সি ++ এ বাইপাস করতে পারেন।
ক্লাইম

0

সি, সি ++ এবং সম্পর্কিত ভাষায়, কোনও বস্তু কনস্ট এবং আপনার রেফারেন্স বা অবজেক্টের স্থির রেফারেন্স হিসাবে পয়েন্টার মধ্যে পার্থক্য রয়েছে।

আপনি যদি একটি ধ্রুবক অবজেক্টটি সংশোধন করার চেষ্টা করেন তবে আপনি সংজ্ঞায়িত আচরণ পান। (আপনি উদাহরণস্বরূপ এর ঠিকানা গ্রহণ করে, ঠিকানাটি কোনও অ-কনস্ট্যান্ট পয়েন্টারে castালাই করে এবং তারপরে অবজেক্টটি সংশোধন করতে সেই নন-কনস্ট পয়েন্টার ব্যবহার করে একটি ধ্রুবক বস্তুটি সংশোধন করার চেষ্টা করতে পারেন )।

অন্যদিকে ধ্রুবক পয়েন্টার বা রেফারেন্স কেবল সংকলককে বলে যে আপনি এই পয়েন্টার বা রেফারেন্সটি অবজেক্টটি সংশোধন করতে ব্যবহার করতে পারবেন না। আপনি পয়েন্টার বা রেফারেন্স কাস্ট করতে পারেন এবং অবজেক্টটি সংশোধন করার চেষ্টা করতে পারেন। যদি বস্তু নিজেই ধ্রুব ছিল, খারাপ জিনিস ঘটবে। যদি বস্তুটি আসলে ধ্রুব না হয় তবে এটি পরিবর্তিত হবে। এটি অবশ্যই আপনার কোড ব্যবহারকারীদের বিভ্রান্ত করতে পারে এবং সম্ভবত বাগের কারণ হতে পারে।

সি-তে, আপনি যদি "হ্যালো" এর মতো স্ট্রিং আক্ষরিক ব্যবহার করেন, পাঁচটি অক্ষর এবং পিছনের শূন্য বাইটগুলি আসলে ধ্রুবক, তবে আপনি একটি অবিচ্ছিন্ন পয়েন্টার পান। অবজেক্টটি পরিবর্তন করতে সেই অবিচ্ছিন্ন পয়েন্টারটি ব্যবহার করা খুব খারাপ ধারণা।

সি তে, আপনার কাছে "কনস্ট্রেট সীমাবদ্ধ" পয়েন্টার থাকতে পারে। তার মানে যে বিষয়টিকে নির্দেশ করা হয়েছে তা সাময়িকভাবে ধ্রুবক। "কন্ট্রাক্ট সীমাবদ্ধ" পয়েন্টারটি সুযোগের মধ্যে থাকা অবস্থায় যদি কোনও উপায়ে অবজেক্টটি সংশোধন করা হয়, আপনি অপরিবর্তিত আচরণ পাবেন। এটি কনস্ট পয়েন্টারের চেয়ে শক্তিশালী যা কেবল আপনাকে এই পয়েন্টারটির মাধ্যমে কোনও অবজেক্ট পরিবর্তন করতে বাধা দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.