Ad Code

What is function overloading?

ওভারলোডিং ফাংশন প্রবর্তন


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

C++ এ, দুই বা ততোধিক function একই নাম শেয়ার করতে পারে যতক্ষণ না তাদের  argument ধরন আলাদা হয় বা তাদের আর্গুমেন্টের সংখ্যা আলাদা হয়-বা উভয়ই। যখন দুই বা ততোধিক ফাংশন একই নাম ভাগ করে, তখন তাদের overload বলা হয়। ওভারলোডেড ফাংশনগুলি একই নামে উল্লেখ করা সম্পর্কিত অপারেশনগুলিকে অনুমতি দিয়ে একটি প্রোগ্রামের জটিলতা কমাতে সাহায্য করতে পারে।

একটি ফাংশন ওভারলোড করা খুব সহজ: সহজভাবে সমস্ত প্রয়োজনীয় সংস্করণ ঘোষণা এবং সংজ্ঞায়িত করুন। কম্পাইলার স্বয়ংক্রিয়ভাবে ফাংশন কল করার জন্য ব্যবহৃত আর্গুমেন্টের সংখ্যা এবং/অথবা প্রকারের উপর ভিত্তি করে সঠিক সংস্করণ নির্বাচন করবে।

অপারেটরদের ওভারলোড করা C++ এও সম্ভব। যাইহোক, আপনি অপারেটর ওভারলোডিং সম্পূর্ণরূপে বুঝতে পারার আগে, আপনাকে C++ সম্পর্কে আরও জানতে হবে।


উদাহরণ

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

function  abs(), labs(), এবং fabs(), যা পরম প্রদান করে

যথাক্রমে একটি পূর্ণসংখ্যার মান (integer), একটি দীর্ঘ পূর্ণসংখ্যা (long integer, এবং একটি ভাসমান-বিন্দু মান (floating point),

যাইহোক, যেহেতু তিনটি ভিন্ন ডেটা টাইপের কারণে তিনটি ভিন্ন নাম প্রয়োজন, পরিস্থিতিটি যতটা প্রয়োজন তার চেয়ে জটিল। তিনটি ক্ষেত্রেই, পরম মান ফেরত দেওয়া হচ্ছে; শুধুমাত্র তথ্যের ধরন ভিন্ন। C++ এ, আপনি তিন ধরনের ডেটার জন্য একটি নাম ওভারলোড করে এই পরিস্থিতি সংশোধন করতে পারেন, যেমন এই উদাহরণটি ব্যাখ্যা করে:


# include<iostream>

using namespace std;

// ওভারলোড abs() তিনটি উপায়

int abs(int n);

long abs (long_n);

double abs(double n);

int main()

{

cout << " -10 এর পরম মান:"<< abs (-10) << "\n\n";

cout << " -10L এর পরম মান: "<< abs(-10L) << "\n \n";

cout << "-10.01 এর পরম মান: "<< abs(-10.01) << "\n\"';

return 0;

}

// abs() ints এর জন্য


int abs(int n)

{

cout << "পূর্ণসংখ্যা abs() \n";


return  n<0?  -n : n;

}



// abs() longs এর জন্য

long abs (long n) 

{

cout< "লং অ্যাবসে ()\n";

return n< 0 ?  -n: n;

}



// abs() ডাবলের জন্য

double asb (bouble n)

{

cout << "ডবল abs()\n";

return  n < 0 ?  -n : n;

}


আপনি দেখতে পাচ্ছেন, এই প্রোগ্রামটি প্রতিটি ডেটা টাইপের জন্য abs()-একটি নামে তিনটি ফাংশন সংজ্ঞায়িত করে। main(), abs() এর ভিতরে তিনটি ভিন্ন ধরনের আর্গুমেন্ট ব্যবহার করে বলা হয়। কম্পাইলার স্বয়ংক্রিয়ভাবে একটি যুক্তি হিসাবে ব্যবহৃত ডেটার প্রকারের উপর ভিত্তি করে abs() এর সঠিক সংস্করণটিকে কল করে। প্রোগ্রাম নিম্নলিখিত আউটপুট উত্পাদন করে:

  • integer abs() -10 এর পরম মান: 10
  • long  abs() তে -10L এর পরম মান: 10
  • double abs-এ () -10.01 এর পরম মান: 10.01


যদিও এই উদাহরণটি বেশ সহজ, এটি এখনও ফাংশন ওভারলোডিংয়ের মানকে চিত্রিত করে। যেহেতু একটি একক নাম একটি সাধারণ শ্রেণীর ক্রিয়া বর্ণনা করতে ব্যবহার করা যেতে পারে, তাই তিনটি সামান্য ভিন্ন নামের কারণে সৃষ্ট কৃত্রিম জটিলতা- এই ক্ষেত্রে, abs, fabs(), এবং labs()-কে দূর করা হয়। আপনাকে এখন শুধুমাত্র একটি নাম মনে রাখতে হবে- যেটি সাধারণ ক্রিয়াকে বর্ণনা করে। কল করার জন্য ফাংশনের উপযুক্ত নির্দিষ্ট সংস্করণ (অর্থাৎ পদ্ধতি) বেছে নেওয়ার জন্য এটি কম্পাইলারের উপর ছেড়ে দেওয়া হয়। এটি জটিলতা হ্রাস করার নেট প্রভাব রয়েছে। এভাবে পলিমরফিজম ব্যবহারের মাধ্যমে তিনটি নাম কমিয়ে একটি করা হয়েছে।


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

এখানে ফাংশন ওভারলোডিংয়ের আরেকটি উদাহরণ। এই ক্ষেত্রে, তারিখটি স্ট্রিং বা তিনটি পূর্ণসংখ্যা হিসাবে গ্রহণ করার জন্য ফাংশন date() ওভারলোড হয়। উভয় ক্ষেত্রেই, ফাংশন এটিতে পাস করা তারিখ প্রদর্শন করে।


# include<iostream>

using namespace std;

void date (char *date); // তারিখ একটি স্ট্রিং

void date(int month, int day, int year); // সংখ্যা হিসাবে তারিখ

int main()

{

date("9/22/22");

date (9, 22, 22);

return 0;

}


// স্ট্রিং হিসাবে তারিখ।

void date (char *date);

{

cout << "তারিখ: << date << "\n";

}



// পূর্ণসংখ্যা হিসাবে তারিখ।

void date(int month, int day, int year);

cout << "তারিখ: << month << "/";

cout << "দিন << "/" << year << "\n";


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

এখন পর্যন্ত, আপনি ওভারলোডেড ফাংশন দেখেছেন যেগুলি তাদের আর্গুমেন্টের ডেটা প্রকারের মধ্যে ভিন্ন। যাইহোক, ওভারপার্টেড ফাংশনগুলি আর্গুমেন্টের সংখ্যার মধ্যেও ভিন্ন হতে পারে, যেমন এই উদাহরণটি ব্যাখ্যা করে 


# include<iostream>

using namespace std;

void f1(int a):

void f1(int a, int b);

int main()

{

f1(10);

f1(10, 20);

return 0;

}



void fl(int a)

{

cout << "ইন f1(int a) \n";

}


void f1 (int a, int b)

{

cout << "ইন  f1(int a, int b) \n";

}


এটা বোঝা গুরুত্বপূর্ণ যে শুধুমাত্র রিটার্ন টাইপ ফাংশন ওভারলোডিংয়ের অনুমতি দেওয়ার জন্য যথেষ্ট পার্থক্য নয়। যদি দুটি ফাংশন শুধুমাত্র তারা যে ডেটা ফেরত দেয় তার মধ্যে ভিন্ন হয়, তাহলে কম্পাইলার সবসময় কল করার জন্য সঠিকটি নির্বাচন করতে সক্ষম হবে না। উদাহরণস্বরূপ, এই খণ্ডটি ভুল কারণ এটি অন্তর্নিহিতভাবে অস্পষ্ট:

// এটি ভুল এবং কম্পাইল করা হবে না।

int f1(int a);

double f1(int a);

.

.

.

.

.

f1(10); // কম্পাইলার কোন ফাংশন কল করে?

মন্তব্যটি ইঙ্গিত করে, f1() এর কোন সংস্করণে কল করতে হবে তা কম্পাইলারের জানার কোন উপায় নেই।



মোবাইল দিয়ে কিভাবে নতুন নিয়মে জন্ম নিবন্ধনের জন্য আবেদন করবেন তা জানতে ভিডিওটি দেখুন👇




Sign up for free on UptimeRobot


Post a Comment

0 Comments

Close Menu