সি ++ এবং জাভাতে কনভেনশন কল করার ক্ষেত্রে কিছু পার্থক্য রয়েছে। সি ++ তে প্রযুক্তিগতভাবে কেবল দুটি কনভেনশন রয়েছে: পাস-বাই-ভ্যালু এবং পাস-বাই-রেফারেন্স সহ তৃতীয় পাস-বাই-পয়েন্টার কনভেনশন সহ কিছু সাহিত্য (এটি আসলে পয়েন্টারের ধরণের পাস-বাই-ভ্যালু)। তার উপরে, আপনি যুক্তির ধরণে কনস্ট-নেস যুক্ত করতে পারেন, শব্দার্থবিজ্ঞানকে বাড়িয়ে তোলেন।
রেফারেন্স দিয়ে পাস
রেফারেন্স দিয়ে পাস করার অর্থ হ'ল ফাংশনটি ধারণাগতভাবে আপনার অবজেক্ট উদাহরণটি গ্রহণ করবে এবং এর অনুলিপিটি নয়। রেফারেন্সটি ধারণামূলকভাবে কল করার প্রসঙ্গে ব্যবহৃত অবজেক্টটির একটি উপনাম এবং শূন্য হতে পারে না। ফাংশনের অভ্যন্তরে সঞ্চালিত সমস্ত ক্রিয়াকলাপগুলি ফাংশনের বাইরের অবজেক্টে প্রয়োগ হয়। এই সম্মেলনটি জাভা বা সি তে উপলব্ধ নয় is
মান দ্বারা পাস (এবং পাশ দিয়ে পয়েন্টার)
সংকলক কলিং প্রসঙ্গে বস্তুর একটি অনুলিপি তৈরি করবে এবং ফাংশনের ভিতরে সেই অনুলিপিটি ব্যবহার করবে। ফাংশনের অভ্যন্তরীণ সমস্ত ক্রিয়াকলাপগুলি বাহ্যিক উপাদান নয়, অনুলিপিতে সম্পন্ন হয়। এটি জাভাতে আদিম ধরণের জন্য সম্মেলন।
এর একটি বিশেষ সংস্করণ একটি ফাংশনে একটি পয়েন্টার (বস্তুর ঠিকানা) পাস করছে is ফাংশনটি পয়েন্টারটি গ্রহণ করে এবং পয়েন্টারে নিজে প্রয়োগ হওয়া যে কোনও এবং সমস্ত ক্রিয়াকলাপ অনুলিপি (পয়েন্টার) এ প্রয়োগ করা হয়, অন্যদিকে, অবহিত পয়েন্টারটিতে প্রয়োগ করা ক্রিয়াকলাপগুলি সেই মেমরির অবস্থানটিতে অবজেক্টের ক্ষেত্রে প্রয়োগ করা হবে, সুতরাং ফাংশনটি পার্শ্ব প্রতিক্রিয়া হতে পারে। অবজেক্টের পয়েন্টারের পাস-বাই-মান ব্যবহারের প্রভাব অভ্যন্তরীণ ফাংশনটিকে বাহ্যিক মানগুলিকে সংশোধন করার অনুমতি দেবে, যেমন পাস-বাই-রেফারেন্সের সাথে এবং optionচ্ছিক মানগুলির (নাল পয়েন্টারটি পাস করার জন্য) অনুমতি দেয়।
এটি সিতে ব্যবহৃত কনভেনশন হয় যখন কোনও ফাংশনটিতে বাহ্যিক চলক সংশোধন করা প্রয়োজন হয়, এবং জাভাতে রেফারেন্স প্রকারের সাথে ব্যবহৃত কনভেনশন: রেফারেন্সটি অনুলিপি করা হয় তবে রেফারেন্স করা বস্তুটি একই: রেফারেন্স / পয়েন্টারে পরিবর্তনগুলি বাইরে দৃশ্যমান হয় না ফাংশন, কিন্তু পয়েন্ট মেমরি পরিবর্তন হয়।
সমীকরণে কনস্টের যোগ করা
বিভিন্ন স্তরে ভেরিয়েবল, পয়েন্টার এবং রেফারেন্স সংজ্ঞায়িত করার সময় আপনি সি ++ তে অবজেক্টগুলিতে ধ্রুবক-নেস নির্ধারণ করতে পারেন। আপনি একটি পরিবর্তনশীলকে ধ্রুবক হিসাবে ঘোষণা করতে পারেন, আপনি একটি ধ্রুবক উদাহরণের জন্য একটি রেফারেন্স ঘোষণা করতে পারেন, এবং আপনি সমস্ত পয়েন্টারকে ধ্রুবক অবজেক্টগুলিতে, ধ্রুবক পয়েন্টারগুলিকে পরিবর্তনীয় বস্তুগুলিতে এবং ধ্রুবক উপাদানগুলিতে ধ্রুবক পয়েন্টার সংজ্ঞায়িত করতে পারেন। বিপরীতে জাভাতে আপনি কেবল ধ্রুবক-নেস (চূড়ান্ত কীওয়ার্ড) এর একটি স্তরটি নির্ধারণ করতে পারেন: চলকের (আদিম ধরণের উদাহরণ, রেফারেন্সের ধরণের জন্য রেফারেন্স), তবে আপনি একটি পরিবর্তনীয় উপাদানটির একটি রেফারেন্স নির্ধারণ করতে পারবেন না (যতক্ষণ না ক্লাস নিজেই থাকে অপরিবর্তনীয়)।
এটি C ++ কলিং কনভেনশনে ব্যাপকভাবে ব্যবহৃত হয়। যখন জিনিসগুলি ছোট হয় আপনি মান দ্বারা বস্তুটি পাস করতে পারেন। সংকলকটি একটি অনুলিপি তৈরি করবে, তবে সেই অনুলিপি কোনও ব্যয়বহুল ক্রিয়াকলাপ নয়। অন্য কোনও ধরণের জন্য, যদি ফাংশনটি বস্তুটি পরিবর্তন করে না, আপনি টাইপের ধ্রুবক উদাহরণের (সাধারণত ধ্রুবক রেফারেন্স নামে পরিচিত) একটি রেফারেন্স পাস করতে পারেন। এটি বস্তুটি অনুলিপি করবে না, তবে এটি ফাংশনে সরিয়ে দেবে। কিন্তু একই সময়ে সংকলক গ্যারান্টি দেয় যে ফাংশনের ভিতরে অবজেক্টটি পরিবর্তন করা হয়নি।
চলতি নিয়ম
এটি অনুসরণ করার জন্য কয়েকটি প্রাথমিক নিয়ম:
- আদিম ধরণের জন্য পাস-বাই-মান পছন্দ করুন
- অন্যান্য ধরণের ধ্রুবক রেফারেন্স সহ পাস বাই রেফারেন্স পছন্দ করুন
- যদি ফাংশনটির আর্গুমেন্টটি সংশোধন করতে হয় তবে পাস-বাই-রেফারেন্সটি ব্যবহার করুন
- যদি আর্গুমেন্টটি alচ্ছিক হয় তবে পাস-বাই-পয়েন্টার ব্যবহার করুন (constantচ্ছিক মানটি পরিবর্তিত করা উচিত না তবে স্থিরভাবে)
এই নিয়মগুলি থেকে অন্য ছোট বিচ্যুতি রয়েছে, যার মধ্যে প্রথমটি কোনও কোনও সামগ্রীর মালিকানা পরিচালনা করছে। যখন কোনও বস্তুটি গতিশীলভাবে নতুন দিয়ে বরাদ্দ করা হয়, তখন এটি মুছে ফেলা (বা [[] এর সংস্করণগুলি) দিয়ে অবশ্যই বিচ্ছিন্ন করতে হবে। যে অবজেক্ট বা ফাংশনটি অবজেক্টটির ধ্বংসের জন্য দায়ী তা সংস্থার মালিক হিসাবে বিবেচিত হয়। যখন কোডের একটি অংশে গতিশীলভাবে বরাদ্দকৃত অবজেক্ট তৈরি করা হয়, তবে মালিকানাটি অন্য কোনও উপাদানে স্থানান্তরিত হয় এটি সাধারণত পাস-বাই-পয়েন্টার শব্দার্থক দ্বারা সম্পন্ন করা হয়, বা স্মার্ট পয়েন্টার দিয়ে সম্ভব হলে।
সাইড নোট
সি ++ এবং জাভা রেফারেন্সের মধ্যে পার্থক্যের গুরুত্বকে গুরুত্ব দেওয়া জরুরী। সি ++ এ রেফারেন্সটি ধারণাগতভাবে অবজেক্টের উদাহরণ, এটির কোনও অ্যাক্সেসর নয়। সবচেয়ে সহজ উদাহরণটি হ'ল অদলবদল কার্যকারিতা:
// C++
class Type; // defined somewhere before, with the appropriate operations
void swap( Type & a, Type & b ) {
Type tmp = a;
a = b;
b = tmp;
}
int main() {
Type a, b;
Type old_a = a, old_b = b;
swap( a, b );
assert( a == old_b );
assert( b == old_a );
}
উপরের সোয়াপ ফাংশন উল্লেখগুলির ব্যবহারের মাধ্যমে এর উভয় যুক্তিই পরিবর্তন করে। জাভা এর নিকটতম কোড:
public class C {
// ...
public static void swap( C a, C b ) {
C tmp = a;
a = b;
b = tmp;
}
public static void main( String args[] ) {
C a = new C();
C b = new C();
C old_a = a;
C old_b = b;
swap( a, b );
// a and b remain unchanged a==old_a, and b==old_b
}
}
কোডের জাভা সংস্করণটি অভ্যন্তরীণভাবে রেফারেন্সগুলির অনুলিপিগুলিকে সংশোধন করবে, তবে প্রকৃত বস্তুগুলি বাহ্যিকভাবে পরিবর্তন করবে না। জাভা রেফারেন্সগুলি হ'ল সি পয়েন্টার ছাড়াই গাণিতিক গাণিতিক যা মান দ্বারা ফাংশনে রূপান্তরিত হয়।