প্রথমে আমাদের মান এবং রেফারেন্স দিয়ে পাস করার অর্থ কী ফিরে যেতে হবে।
জাভা এবং এসএমএলের মতো ভাষার ক্ষেত্রে, মান অনুসারে পাস করা সোজা হয় (এবং রেফারেন্সের মাধ্যমে কোনও পাস নেই) যেমন একটি ভেরিয়েবলের মান অনুলিপি করা হয়, যেমন সমস্ত ভেরিয়েবল কেবল স্কেলার এবং বিল্টিন কপি সিমেটিক: তারা হয় যাকে গণিত হিসাবে গণনা করা হয় সি ++, বা "রেফারেন্স" টাইপ করুন (বিভিন্ন নাম এবং সিনট্যাক্স সহ পয়েন্টার)।
সিতে আমাদের স্কেলার এবং ব্যবহারকারীর সংজ্ঞায়িত প্রকার রয়েছে:
- স্কেলারের একটি সংখ্যাসূচক বা বিমূর্ত মান রয়েছে (পয়েন্টার সংখ্যা নয়, তাদের একটি বিমূর্ত মান রয়েছে) যা অনুলিপি করা হয়েছে।
- সমষ্টিগত প্রকারগুলিতে তাদের সম্ভবত সমস্ত প্রাথমিক সদস্যদের অনুলিপি করা হয়েছে:
- পণ্যের ধরণের জন্য (অ্যারে এবং কাঠামো): পুনরাবৃত্তভাবে, অ্যারের উপাদানগুলির কাঠামোর সমস্ত সদস্য এবং অনুলিপি করা হয় (সি ফাংশন সিনট্যাক্সগুলি সরাসরি মান অনুসারে অ্যারেগুলি পাস করা সম্ভব করে না, কেবল কোনও কাঠামোর সদস্যদের অ্যারে করে দেয়, তবে এটি বিশদ )।
- যোগফলের জন্য (ইউনিয়ন): "সক্রিয় সদস্য" এর মান সংরক্ষণ করা হয়; স্পষ্টতই, সদস্যের অনুলিপি সদস্য ক্রমযুক্ত নয় কারণ সমস্ত সদস্যকে আরম্ভ করা যায় না।
সি ++ ব্যবহারকারীর সংজ্ঞায়িত প্রকারগুলিতে ব্যবহারকারী সংজ্ঞায়িত অনুলিপি অনুলিপি থাকতে পারে, যা তাদের সংস্থানগুলির মালিকানা এবং "গভীর অনুলিপি" ক্রিয়াকলাপের সাথে সত্যিকারের "অবজেক্ট ওরিয়েন্টেড" প্রোগ্রামিং সক্ষম করে। এই জাতীয় ক্ষেত্রে, অনুলিপি অপারেশন হ'ল একটি ফাংশনের কল যা প্রায় স্বেচ্ছাসেবী অপারেশন করতে পারে।
সি স্ট্রাক্টের জন্য সি ++ হিসাবে সংকলিত, "অনুলিপি" এখনও ব্যবহারকারী সংজ্ঞায়িত অনুলিপি অপারেশন (কনস্ট্রাক্টর বা অ্যাসাইনমেন্ট অপারেটর) হিসাবে সংজ্ঞায়িত, যা সংকলক দ্বারা সুস্পষ্টভাবে উত্পন্ন হয়। এর অর্থ হ'ল একটি সি / সি ++ সাধারণ উপসেট প্রোগ্রামের অর্থশাস্ত্রটি সি এবং সি ++ এর মধ্যে পৃথক: সিতে পুরো সামগ্রিক প্রকারটি অনুলিপি করা হয়, সি ++ এ প্রতিটি সদস্যের অনুলিপি করার জন্য একটি স্পষ্টতভাবে উত্পন্ন অনুলিপি ফাংশন বলা হয়; শেষ ফলাফল হ'ল উভয় ক্ষেত্রেই প্রতিটি সদস্য অনুলিপি করা হয়।
(আমি মনে করি, যখন কোনও ইউনিয়নের অভ্যন্তরীণ কাঠামো অনুলিপি করা হয় তখন ব্যতিক্রম হয় exception)
সুতরাং শ্রেণীর ধরণের জন্য, নতুন উদাহরণ তৈরির একমাত্র উপায় (ইউনিয়ন অনুলিপিগুলির বাইরে) একটি কনস্ট্রাক্টর (এমনকি তুচ্ছ সংকলক উত্পাদক কনস্ট্রাক্টরদের ক্ষেত্রেও) via
আপনি ইউনিারি অপারেটরের মাধ্যমে কোনও মূল্যবোধের ঠিকানা নিতে পারবেন না &
তবে এর অর্থ এই নয় যে কোনও মূল্যমান অবজেক্ট নেই; এবং সংজ্ঞায়িত কোনও বস্তুর একটি ঠিকানা রয়েছে ; এবং এই ঠিকানাটি এমনকি একটি সিনট্যাক্স কনস্ট্রাক্ট দ্বারা প্রতিনিধিত্ব করা হয়: শ্রেণির ধরণের একটি অবজেক্ট কেবল কোনও নির্মাণকারী দ্বারা তৈরি করা যেতে পারে, এবং এটিতে একটি this
পয়েন্টার রয়েছে; তুচ্ছ ধরণের জন্য, কোনও ব্যবহারকারীর লিখিত নির্মাণকারীর উপস্থিতি নেই তাই this
অনুলিপিটি তৈরির পরে নামকরণ না করা পর্যন্ত রাখার কোনও জায়গা নেই ।
স্কেলার প্রকারের জন্য, কোনও বস্তুর মান হ'ল অবজেক্টের মূল্য, অবজেক্টে সঞ্চিত বিশুদ্ধ গাণিতিক মান।
শ্রেণীর ধরণের জন্য, অবজেক্টের মানটির একমাত্র ধারণা হ'ল বস্তুর অনুলিপি, যা কেবল একটি অনুলিপি নির্মাণকারী দ্বারা তৈরি করা যেতে পারে, একটি আসল ফাংশন (যদিও তুচ্ছ ধরণের জন্য যে ফাংশনটি বিশেষভাবে তুচ্ছ, এটি কখনও কখনও হতে পারে কনস্ট্রাক্টরকে ফোন না করে তৈরি করা হয়েছে)। তার মানে হল যে বস্তুর মান হ'ল একটি কার্যকর দ্বারা বিশ্বব্যাপী প্রোগ্রামের রাষ্ট্রের পরিবর্তনের ফলাফল । এটি গাণিতিকভাবে অ্যাক্সেস করে না।
সুতরাং মান দ্বারা পাস সত্যিই একটি জিনিস নয়: এটি কপি কনস্ট্রাক্টর কল দ্বারা পাস , যা কম সুন্দর। অনুলিপি নির্মাণকারীটি তার অভ্যন্তরীণ আক্রমণকারীদের (যা অভ্যন্তরীণ সি ++ বৈশিষ্ট্য নয়, বিমূর্ত ব্যবহারকারীর বৈশিষ্ট্যগুলি সম্মান করে) অবজেক্টের ধরণের যথাযথ শব্দার্থক অনুযায়ী একটি বুদ্ধিমান "কপি" অপারেশন করবেন বলে আশা করা হচ্ছে।
শ্রেণীর অবজেক্টের মান দ্বারা পাস করার অর্থ:
- অন্য উদাহরণ তৈরি করুন
- তারপরে সেই উদাহরণটিতে ফাংশন অ্যাক্টটি তৈরি করুন।
নোট করুন যে অনুলিপিটি নিজেই কোনও ঠিকানা সহ কোনও বস্তু কিনা: ইস্যুটির কোনও যোগসূত্র নেই: সমস্ত ফাংশন প্যারামিটারগুলি বস্তু এবং একটি ঠিকানা রয়েছে (ভাষা শব্দার্থক স্তরে)।
বিষয়টি হ'ল:
- অনুলিপিটি একটি নতুন অবজেক্ট যা মাপসই হিসাবে মুল অবজেক্টের খাঁটি গাণিতিক মান (সত্য খাঁটি মূল্য) দিয়ে শুরু করা হয়;
- বা অনুলিপি ক্লাসগুলির মতো মূল বস্তুর মান ।
তুচ্ছ শ্রেণীর ধরণের ক্ষেত্রে, আপনি এখনও মূলটির সদস্য কপির সদস্যকে সংজ্ঞায়িত করতে পারেন, তাই অনুলিপি অপারেশনগুলির অনুলিপি (অনুলিপি নির্মাণকারী এবং কার্যনির্বাহী) কারণে আপনি মূলটির খাঁটি মূল্য নির্ধারণ করতে পারেন। স্বেচ্ছাচারী বিশেষ ব্যবহারকারীর ফাংশনগুলির সাথে এটি নয়: আসলটির একটি মান একটি নির্ধারিত অনুলিপি হতে হবে।
শ্রেণীর অবজেক্টগুলি অবশ্যই কলার দ্বারা নির্মিত হতে হবে; কনস্ট্রাক্টরের আনুষ্ঠানিকভাবে একটি this
পয়েন্টার থাকে তবে আনুষ্ঠানিকতা এখানে প্রাসঙ্গিক নয়: সমস্ত অবজেক্টের আনুষ্ঠানিকভাবে একটি ঠিকানা থাকে তবে কেবল তাদের ঠিকানাটি *&i = 1;
নিখরচায় স্থানীয়ভাবে ব্যবহার করা হয় (বিপরীতভাবে ঠিকানার স্থানীয় ব্যবহারের তুলনায়) একটি ভাল সংজ্ঞা দেওয়া দরকার ঠিকানা।
এই দুটি পৃথকভাবে সংকলিত ফাংশনগুলির একটি ঠিকানা থাকতে হবে যদি কোনও অবজেক্ট অবশ্যই ঠিকঠাক দ্বারা পাস করে:
void callee(int &i) {
something(&i);
}
void caller() {
int i;
callee(i);
something(&i);
}
এখানে এমনকি যদি something(address)
একটি বিশুদ্ধ ফাংশন বা ম্যাক্রো বা যাই হোক না কেন (ভালো হয় printf("%p",arg)
) যে ঠিকানা সংরক্ষণ করতে পারবেন না বা অন্য সত্তা যোগাযোগ, আমরা প্রয়োজন ঠিকানা দ্বারা পাস কারণ ঠিকানা ভাল একটি অনন্য বস্তুর জন্য নির্ধারণ করা আবশ্যক আছে int
একটি অনন্য আছে পরিচয়।
আমরা জানি না কোনও বহিরাগত ফাংশন এতে প্রবেশের ঠিকানাগুলির ক্ষেত্রে "খাঁটি" হবে কিনা।
এখানে সম্ভাব্য পারেন একটি অ তুচ্ছ কন্সট্রাকটর বা বিনাশকারী মধ্যে ঠিকানার একটি বাস্তব ব্যবহারের জন্য আহ্বানকারী পাশ সম্ভবত নিরাপদ, সরল রুট গ্রহণ এবং বস্তুর আহ্বানকারী তার ঠিকানা একটি পরিচয় দিতে এবং পাস, যেমন জন্য কারণ এটা তোলে নিশ্চিত হয়ে নিন যে কনস্ট্রাক্টর, নির্মাণের পরে এবং ডিস্ট্রাক্টরে তার ঠিকানার কোনও অ-তুচ্ছ ব্যবহার সামঞ্জস্যপূর্ণ : this
অবশ্যই অবজেক্টের অস্তিত্বের উপরে একই হতে হবে।
অন্য কোনও ফাংশনের মতো একটি নন ট্রিভিয়াল কনস্ট্রাক্টর বা ডেস্ট্রাক্টর this
পয়েন্টারটি এমনভাবে ব্যবহার করতে পারে যার জন্য তার মানের সাথে সামঞ্জস্যতা প্রয়োজন যদিও এমনকী তুচ্ছ জিনিস সহ কিছু বস্তু নাও পারে:
struct file_handler { // don't use that class!
file_handler () { this->fileno = -1; }
file_handler (int f) { this->fileno = f; }
file_handler (const file_handler& rhs) {
if (this->fileno != -1)
this->fileno = dup(rhs.fileno);
else
this->fileno = -1;
}
~file_handler () {
if (this->fileno != -1)
close(this->fileno);
}
file_handler &operator= (const file_handler& rhs);
};
মনে রাখবেন যে this->
সেক্ষেত্রে, কোনও পয়েন্টার (স্পষ্ট স্পষ্ট বাক্য গঠন ) এর সুস্পষ্ট ব্যবহার সত্ত্বেও , অবজেক্টের পরিচয় অপ্রাসঙ্গিক: সংকলকটি সরানো এবং "কপিরাইট এলিজেন" করার জন্য বিটওয়াইসটি প্রায় ভালভাবে কপিরাইটটি ব্যবহার করতে পারে। এটি this
বিশেষ সদস্য ফাংশনগুলিতে ব্যবহারের "বিশুদ্ধতা" স্তরের উপর ভিত্তি করে (ঠিকানাটি এড়ায় না)।
তবে বিশুদ্ধতা স্ট্যান্ডার্ড ডিক্লেয়ারেশন লেভেলে কোনও বৈশিষ্ট্য উপলভ্য নয় (সংকলক এক্সটেনশানগুলি উপস্থিত রয়েছে যা নন-ইনলাইন ফাংশন ঘোষণায় বিশুদ্ধতার বিবরণ যুক্ত করে), সুতরাং আপনি কোডের বিশুদ্ধতার ভিত্তিতে কোনও এবিআইকে সংজ্ঞায়িত করতে পারবেন না যা উপলভ্য নয় (কোড হতে পারে এবং ইনলাইন এবং বিশ্লেষণের জন্য উপলব্ধ নাও থাকতে পারে)।
বিশুদ্ধতা "অবশ্যই বিশুদ্ধ" বা "অপরিষ্কার বা অজানা" হিসাবে পরিমাপ করা হয়। সাধারণ স্থল, বা শব্দার্থের উপরের সীমানা (প্রকৃতপক্ষে সর্বাধিক), বা এলসিএম (সর্বনিম্ন সাধারণ একাধিক) "অজানা"। সুতরাং এবিআই অজানা উপর স্থির।
সারসংক্ষেপ:
- কিছু কনস্ট্রাক্টসকে অবজেক্টের পরিচয় নির্ধারণের জন্য সংকলক প্রয়োজন।
- এবিআই প্রোগ্রামের ক্লাসের মেয়াদে সংজ্ঞায়িত হয় এবং নির্দিষ্ট ক্ষেত্রে নয় যেগুলি অনুকূলিত হতে পারে।
সম্ভাব্য ভবিষ্যতের কাজ:
খাঁটি বিশিষ্টতা কি সাধারণীকরণ এবং মানক করা যথেষ্ট?