সি ++ এর কোনও ক্রিয়াকলাপে প্যারামিটারগুলি পাস করার জন্য তিনটি উপায় রয়েছে: মান দ্বারা, লভ্যালু রেফারেন্স দ্বারা এবং মূল্যসূচক রেফারেন্স দ্বারা। এর মধ্যে, মান দ্বারা প্রেরণ করা এই অর্থে মালিকানা তৈরি করে যে ডাকা ফাংশনটি তার নিজস্ব অনুলিপি গ্রহণ করে এবং মূল্যসূচক রেফারেন্সের মধ্য দিয়ে যাওয়ার ফলে ইঙ্গিত হয় যে মানটি গ্রাস হতে পারে, অর্থাত আর কলকারী ব্যবহার করবে না। লভ্যালু রেফারেন্স দিয়ে যাওয়ার অর্থ এই যে অবজেক্টটি অস্থায়ীভাবে কলারের কাছ থেকে ধার করা হয়েছে।
যাইহোক, এগুলি "কনভেনশন দ্বারা" হয়ে থাকে এবং সর্বদা সংকলক দ্বারা পরীক্ষা করা যায় না। এবং আপনি দুর্ঘটনাক্রমে ব্যবহার করে একটি মূল্যমানের রেফারেন্সকে একটি মূল্যবান রেফারেন্সে রূপান্তর করতে পারেন std::move()
। কংক্রিটের সাথে তিনটি সমস্যা রয়েছে:
একটি রেফারেন্স তার উল্লেখ রেফারেন্সটিকে আউটলাইভ করতে পারে। জং এর আজীবন ব্যবস্থা এটি প্রতিরোধ করে।
একসাথে একাধিক মিউটেবল / নন-কনস্ট্যান্ট রেফারেন্স সক্রিয় থাকতে পারে যে কোনও সময়। জং এর bণ চেকার এটি প্রতিরোধ করে।
আপনি উল্লেখগুলি থেকে বেরিয়ে আসতে পারবেন না। কল ফাংশনটির স্বাক্ষর না জেনে ফাংশনটি আপনার অবজেক্টের একটি রেফারেন্স তৈরি করে কিনা আপনি কোনও কল সাইটে দেখতে পারবেন না। অতএব আপনি নির্ভরযোগ্যভাবে উল্লেখগুলি প্রতিরোধ করতে পারবেন না, না আপনার ক্লাসের কোনও বিশেষ পদ্ধতি মোছা বা কিছু "কোনও রেফারেন্স" শৈলীর গাইডের সাথে সম্মতি জন্য কল সাইট অডিট করে।
আজীবন সমস্যাটি মূল মেমরির সুরক্ষা সম্পর্কে। রেফারেন্সযুক্ত জিনিসটির মেয়াদ শেষ হয়ে গেলে অবশ্যই কোনও রেফারেন্স ব্যবহার করা অবৈধ। আপনি যখন কোনও অবজেক্টের মধ্যে একটি রেফারেন্স সঞ্চয় করেন, বিশেষত যখন সেই বস্তুটি বর্তমান সুযোগকে ছাড়িয়ে যায় তবে আজীবন ভুলে যাওয়া খুব সহজ। সি ++ টাইপ সিস্টেম এটির জন্য অ্যাকাউন্ট করতে পারে না কারণ এটি লাইফটাইমকে মোটেও মডেল করে না।
std::weak_ptr
স্মার্ট পয়েন্টার একটি প্লেইন রেফারেন্স অনুরূপ সঙ্কেতাক্ষরে লিখা মালিকানা শব্দার্থবিদ্যা না, কিন্তু প্রয়োজন যে রেফারেন্সড বস্তুর একটি মাধ্যমে পরিচালিত হয় shared_ptr
, অর্থাত্ রেফারেন্স-গণনা করা হয়। এটি কোনও শূন্য ব্যয়ের বিমূর্ততা নয়।
সি ++ এর একটি কনস্ট সিস্টেম থাকা সত্ত্বেও, এটি কোনও অবজেক্টটি সংশোধন করা যায় কিনা তা সনাক্ত করে না, তবে নির্দিষ্ট রেফারেন্সের মাধ্যমে কোনও অবজেক্টটি সংশোধন করা যায় কিনা তা সনাক্ত করে । এটি "নির্ভীক সম্মতি" এর জন্য পর্যাপ্ত গ্যারান্টি সরবরাহ করে না। বিপরীতে, মরিচা গ্যারান্টি দেয় যে যদি সেখানে একটি সক্রিয় পরিবর্তনীয় রেফারেন্স থাকে যা কেবলমাত্র একমাত্র রেফারেন্স হয় ("আমিই কেবল এই বিষয়টিকে পরিবর্তন করতে পারি") এবং যদি অ-পরিবর্তনীয় রেফারেন্স থাকে তবে অবজেক্টের সমস্ত রেফারেন্স অ-পরিবর্তনীয় ("আমি যখন অবজেক্টটি থেকে পড়তে পারি, কেউ এটিকে পরিবর্তন করতে পারে না"))।
সি ++ এ আপনাকে মুউটেক্স সহ একটি স্মার্ট পয়েন্টারের মাধ্যমে কোনও অ্যাক্সেস অ্যাক্সেস রক্ষা করতে প্ররোচিত হতে পারে। তবে উপরে একবার আলোচনা হিসাবে আমাদের কাছে একটি রেফারেন্স থাকলে এটি এর প্রত্যাশিত জীবদ্দশায় এড়াতে পারে। সুতরাং এই জাতীয় স্মার্ট পয়েন্টার গ্যারান্টি দিতে পারে না যে এটি তার পরিচালিত বস্তুর অ্যাক্সেসের একক পয়েন্ট। এই জাতীয় স্কিমটি বাস্তবে বাস্তবে কাজ করতে পারে কারণ বেশিরভাগ প্রোগ্রামাররা নিজেরাই নাশকতা করতে চান না, তবে একটি টাইপ-সিস্টেমের দৃষ্টিকোণ থেকে এটি এখনও সম্পূর্ণ নিখুঁত।
স্মার্ট পয়েন্টারগুলির সাথে সাধারণ সমস্যা হ'ল তারা মূল ভাষার শীর্ষে গ্রন্থাগার। মূল ভাষার বৈশিষ্ট্যগুলির সেট এই স্মার্ট পয়েন্টারগুলিকে সক্ষম করে, যেমন মুভি std::unique_ptr
-কনস্ট্রাক্টরগুলির প্রয়োজন। তবে তারা মূল ভাষার মধ্যে ঘাটতিগুলি ঠিক করতে পারে না। কোনও ফাংশন কল করার সময় স্পষ্টতই রেফারেন্স তৈরি করার দক্ষতা এবং একসাথে জড়িয়ে থাকা রেফারেন্স থাকার অর্থ মূল সি ++ ভাষা নিরবচ্ছিন্ন। একক একের জন্য পরিবর্তনীয় রেফারেন্সকে সীমাবদ্ধ করতে অক্ষমতার অর্থ সি ++ কোনও ধরণের সম্মতিতে বর্ণের অবস্থার বিরুদ্ধে সুরক্ষার গ্যারান্টি দিতে পারে না।
অবশ্যই অনেক ক্ষেত্রে সি ++ এবং মরিচা অপছন্দের চেয়ে আরও বেশি সমান, বিশেষত স্থিতিশীলভাবে নির্ধারিত অবজেক্টের জীবনকাল সম্পর্কে তাদের ধারণার বিষয়ে। তবে যদিও সঠিক সি ++ প্রোগ্রাম লেখার সম্ভাবনা রয়েছে (প্রদত্ত কোনও প্রোগ্রামার কোনওরই ভুল করে না), মর্ট আলোচিত বৈশিষ্ট্য সম্পর্কিত নির্ভুলতার গ্যারান্টি দেয় ।