ফাংশন ওভারলোডিং(Function overloading)
আগের পর্ব ছিলো পলিমরফিজম পরিচিতি এবং কিছুটা থিওরিটিক্যাল। এই পর্ব সহ আরেকটি পর্ব লিখব পলিমরফিজম নিয়ে। এই দুটি পর্বেই চেষ্টা করব উদাহরণ দিয়ে পলিমরফিজম ব্যাখ্যা করতে। এই পর্ব থাকবে ফাংশন ওভারলোডিং নিয়ে।
Function overloading
মনেকরি আমাদের ২টি ফাংশন দরকার, একটি ফাংশন হবে ২টি সংখ্যা যোগ করার জন্য এবং অন্যটি ৩টি সংখ্যা যোগ করার জন্য। দুইটি সংখ্যা যোগ করার ফাংশনের নাম দিতে পারি add1() এবং তিনটি সংখ্যা যোগ করার ফাংশনের নাম দিতে পারি add2()। দেখেন, ফাংশন দুটির কাজ কিন্তু একই তারপরেও আর্গুমেন্টের সংখ্যা আলাদা হওয়ায় নাম দেওয়া নিয়ে আমাদের আলাদা চিন্তা করতে হচ্ছে। কেমন হয় যদি দুইটি ফাংশনের নামই হয় add()? তাহলে নামকরণের ঝামেলা থেকে আমরা মুক্তি পাচ্ছি। ঠিক এই কাজ টি করার জন্যই ফাংশন ওভারলোডিং! ফাংশনের নাম একই হবে কিন্তু আর্গুমেন্টের সংখ্যার উপর নির্ভর করে নির্দিষ্ট ফাংশন টি কল হবে।
class data { public: // first function/method int add(int a, int b) { return a + b; } // second function/method int add(int a, int b, int c) { return a + b + c; } };
int main() { data obj;
// call and print first function's value cout << obj.add(5, 3) << endl; // call and print second function's value cout << obj.add(10, 2, 8) << endl;
return 0; } |
উপরের ক্লাসটি তে দেখতে পারছেন একই নামের দুইটি ফাংশন হলেও আর্গুমেন্টের ভিন্নতার জন্য সমস্যা করছে না এবং যখন যে ফাংশনটি দরকার হচ্ছে তখন সেটিই কল হচ্ছে আর্গুমেন্টের ভিন্নতার জন্য। এখানে শুধু আর্গুমেন্টের সংখ্যার উপরই ফাংশন কল নির্ধারণ হবে না। যেমন, আর্গুমেন্ট সংখ্যা একই কিন্তু তাদের টাইপ ভিন্ন তাহলেও ভিন্ন নির্দিষ্ট ফাংশন কল হবে।
class data { public: // first function/method int add(int a, int b) { return a + b; } // second function/method double add(int a, double b) { return a + b; } };
int main() { data obj;
// call and print first function's value cout << obj.add(5, 3) << endl; // call and print second function's value cout << obj.add(10, 2.5) << endl;
return 0; } |
এখানে দুটি ফাংশনই ভিন্ন এবং শুধু পূর্ণ সংখ্যা পাস করলে উপরের ফাংশন কল হবে এবং আর্গুমেন্ট ১ম টি পূর্ণ সংখ্যা এবং ২য় টি ভগ্নাংশ হলে পরের ফাংশন কল হবে। এখন যোগ করার জন্য অনেক বেশি ফাংশন হলেও আমাদের নামকরণ নিয়ে আলাদা চিন্তা করতে হবে না।
Default arguments value
ডিফল্ট আর্গুমেন্ট ভ্যালু ইন্টারেস্টিং এবং খুবই দরকারী জিনিস তাই আলোচনা করছি নাহলে খুব বেশি রিলেটেবল না। উপরে ফাংশন ওভারলোডিংয়ে ত দেখেছি আর্গুমেন্ট সংখ্যা ভিন্ন হলেও একই নাম ব্যবহার করে ফাংশন গুলো ইমপ্লিমেন্ট করে নির্দিষ্ট ফাংশন কল করা যায়। কিন্তু যদি বলি এসব কাজ শুধুমাত্র একটি ফাংশন থেকেই করা সম্ভব!!! এটি সম্ভব কারণ, আমরা যে আর্গুমেন্ট গুলো পাস করেছি তার ভিন্নতার জন্য ভিন্ন ভিন্ন ফাংশন কল হচ্ছে। কিন্তু আমরা যদি আর্গুমেন্ট গুলোর এমন একটি ডিফল্ট ভ্যালু রেখে দেই যা সঠিক উত্তর পেতে ঝামেলা করবে না এবং যে আর্গুমেন্টের ডিফল্ট ভ্যালু রেখে দিব তার ভ্যালু ফাংশন কল করার সময় না পাঠালেও আমাদের কাঙ্ক্ষিত উত্তরই পাব।
class data { public: // c has default value. you can call this function without third value int add(int a, int b, int c = 0) { return a + b + c; } };
int main() { data obj;
cout << obj.add(5, 3) << endl;
cout << obj.add(10, 2, 8) << endl;
return 0; } |
এখানে শেষ আর্গুমেন্টের ডিফল্ট ভ্যালু থাকায় প্রথম ফাংশন কলে সমস্যা হচ্ছে না আর দ্বিতীয় বার কল করার সময় ৮ পাঠিয়ে দিচ্ছি তাই ৮ c এর ডিফল্ট ভ্যালু কে ওভাররাইট করছে। এভাবে এক ফাংশনেই একাধিক ফাংশন কল করতে পারছি ডিফল্ট ভ্যালু সেট করে রেখে। আর্গুমেন্টের টাইপ একই হলে ডিফল্ট আর্গুমেন্ট ভ্যালু ব্যবহার করা বেশি উপকারী।
আমরা জানি, শুন্যের সাথে কোন কিছু যোগ করলে উত্তরের পরিবর্তন হয় না। তাহলে ফাংশন টি যদি গুণ করার ফাংশন হত তাহলে ডিফল্ট ভ্যালু হিসেবে আমাদের কি দিতে হত?
পরের পর্বে আলোচনা করব পলিমরফিজমের খুবই গুরুত্বপূর্ণ টপিক ফাংশন ওভাররাইড নিয়ে।
No comments