ফাংশন ওভারলোডিং (Function Overloading) এবং অপারেটর ওভারলোডিং (Operator Overloading) C++ প্রোগ্রামিংয়ের দুটি শক্তিশালী বৈশিষ্ট্য। এগুলোর মাধ্যমে কোডকে আরও নমনীয়, ব্যবহার-বান্ধব এবং পুনরায় ব্যবহারযোগ্য করা যায়।
ফাংশন ওভারলোডিং (Function Overloading)
ফাংশন ওভারলোডিং হলো একই নামের একাধিক ফাংশন তৈরি করা, যা আলাদা প্যারামিটারের সংখ্যা বা টাইপের উপর ভিত্তি করে কাজ করে। এটি C++ এ পলিমরফিজমের (polymorphism) একটি উদাহরণ।
উদাহরণ: ফাংশন ওভারলোডিং
#include <iostream>
using namespace std;
// প্রথম ওভারলোড করা ফাংশন (int টাইপের দুটি প্যারামিটার)
int add(int a, int b) {
return a + b;
}
// দ্বিতীয় ওভারলোড করা ফাংশন (float টাইপের দুটি প্যারামিটার)
float add(float a, float b) {
return a + b;
}
// তৃতীয় ওভারলোড করা ফাংশন (int টাইপের তিনটি প্যারামিটার)
int add(int a, int b, int c) {
return a + b + c;
}
int main() {
cout << "Sum of two integers: " << add(5, 10) << endl;
cout << "Sum of two floats: " << add(5.5f, 10.3f) << endl;
cout << "Sum of three integers: " << add(5, 10, 15) << endl;
return 0;
}
বর্ণনা:
- এখানে
addনামে তিনটি আলাদা ফাংশন রয়েছে।- প্রথম ফাংশন দুটি
intপ্যারামিটার নেয়। - দ্বিতীয় ফাংশন দুটি
floatপ্যারামিটার নেয়। - তৃতীয় ফাংশন তিনটি
intপ্যারামিটার নেয়।
- প্রথম ফাংশন দুটি
- একই নামের ফাংশনগুলো আলাদা আলাদা প্যারামিটার তালিকা দিয়ে কাজ করছে।
আউটপুট:
Sum of two integers: 15
Sum of two floats: 15.8
Sum of three integers: 30
ফাংশন ওভারলোডিং কেন ব্যবহার করা হয়?
- কোড পড়া সহজ করা: একই কাজের জন্য আলাদা নামের পরিবর্তে এক নামের ফাংশন ব্যবহার করা যায়।
- পুনঃব্যবহারযোগ্যতা বৃদ্ধি: একই নামের ফাংশন বিভিন্ন প্যারামিটারের জন্য ব্যবহৃত হয়।
অপারেটর ওভারলোডিং (Operator Overloading)
অপারেটর ওভারলোডিং হলো C++ এ অপারেটরগুলোর জন্য কাস্টম ব্যাবহার সংজ্ঞায়িত করা, যাতে তারা ইউজার-ডিফাইন্ড ডেটা টাইপ বা ক্লাসের জন্য কাজ করতে পারে। এটি কেবলমাত্র নির্দিষ্ট ধরনের অপারেটরগুলোর জন্য প্রযোজ্য (যেমন +, -, *, ==, ইত্যাদি)।
উদাহরণ: + অপারেটর ওভারলোডিং
নিচের উদাহরণে একটি Complex ক্লাস তৈরি করা হয়েছে এবং + অপারেটরটি ওভারলোড করা হয়েছে, যা দুটি Complex অবজেক্ট যোগ করতে ব্যবহার করা হয়।
#include <iostream>
using namespace std;
class Complex {
private:
float real;
float imag;
public:
Complex(float r = 0, float i = 0) : real(r), imag(i) {}
// + অপারেটর ওভারলোড করা
Complex operator + (const Complex &c) {
Complex temp;
temp.real = real + c.real;
temp.imag = imag + c.imag;
return temp;
}
// কমপ্লেক্স সংখ্যা প্রদর্শন
void display() const {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5);
Complex c2(1.5, 3.0);
Complex c3 = c1 + c2; // + অপারেটর ওভারলোড ব্যবহার করে যোগফল নির্ণয়
cout << "Complex number 1: ";
c1.display();
cout << "Complex number 2: ";
c2.display();
cout << "Sum: ";
c3.display();
return 0;
}
বর্ণনা:
- এখানে
Complexক্লাসের+অপারেটর ওভারলোড করা হয়েছে, যা দুটিComplexঅবজেক্ট যোগ করে। operator +ফাংশনটিComplexঅবজেক্ট গ্রহণ করে এবং তাদের রিয়েল ও ইমাজিনারি অংশ যোগ করে নতুনComplexঅবজেক্ট ফেরত দেয়।
আউটপুট:
Complex number 1: 3.5 + 2.5i
Complex number 2: 1.5 + 3.0i
Sum: 5.0 + 5.5i
অপারেটর ওভারলোডিংয়ের নিয়ম
- একটি ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য ব্যবহারযোগ্য: অপারেটর ওভারলোডিং শুধুমাত্র ক্লাস বা ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য ব্যবহার করা যেতে পারে।
- নতুন অপারেটর তৈরি করা যায় না: বিদ্যমান অপারেটরদেরই কেবল ওভারলোড করা যায়, নতুন অপারেটর তৈরি করা যায় না।
- ডিফল্ট অর্থ পরিবর্তন করা যাবে না: উদাহরণস্বরূপ,
+অপারেটর যোগফল হিসেবেই থাকবে, এটি বিয়োগফল হিসেবে ব্যবহার করা যাবে না।
উদাহরণ: == অপারেটর ওভারলোডিং
#include <iostream>
using namespace std;
class Complex {
private:
float real;
float imag;
public:
Complex(float r = 0, float i = 0) : real(r), imag(i) {}
// == অপারেটর ওভারলোড করা
bool operator == (const Complex &c) const {
return (real == c.real && imag == c.imag);
}
void display() const {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5);
Complex c2(3.5, 2.5);
Complex c3(1.0, 1.0);
if (c1 == c2) {
cout << "c1 and c2 are equal." << endl;
} else {
cout << "c1 and c2 are not equal." << endl;
}
if (c1 == c3) {
cout << "c1 and c3 are equal." << endl;
} else {
cout << "c1 and c3 are not equal." << endl;
}
return 0;
}
বর্ণনা:
- এখানে
==অপারেটর ওভারলোড করা হয়েছে, যা দুটিComplexঅবজেক্টেরrealএবংimagঅংশের সমতা যাচাই করে।
আউটপুট:
c1 and c2 are equal.
c1 and c3 are not equal.
ফাংশন ওভারলোডিং এবং অপারেটর ওভারলোডিংয়ের সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি: একই নাম বা অপারেটরের বিভিন্ন ব্যবহারের মাধ্যমে কোডকে পুনঃব্যবহারযোগ্য করা যায়।
- কোড পড়া সহজ করা: ফাংশন ও অপারেটর ওভারলোডিংয়ের মাধ্যমে কোডকে সংক্ষিপ্ত ও সহজে পড়া যায়।
- নমনীয়তা বৃদ্ধি: ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য সাধারণ অপারেটরগুলোর কাস্টম ব্যাবহার সংজ্ঞায়িত করা যায়।
সারসংক্ষেপ
- ফাংশন ওভারলোডিং: একই নামের একাধিক ফাংশন, বিভিন্ন প্যারামিটারের জন্য আলাদা কাজ করে।
- অপারেটর ওভারলোডিং: সাধারণ অপারেটরগুলো ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য নতুন অর্থে ব্যবহৃত হয়।
ফাংশন ও অপারেটর ওভারলোডিং C++ প্রোগ্রামিংয়ে কোডকে আরও কার্যকর, সংক্ষিপ্ত এবং পুনরায় ব্যবহারযোগ্য করে তোলে।
ফাংশন ওভারলোডিং C++ প্রোগ্রামিংয়ে একটি ধারণা, যার মাধ্যমে একই নামে একাধিক ফাংশন ঘোষণা করা যায়, তবে তাদের প্যারামিটারের সংখ্যা বা ধরনে পার্থক্য থাকতে হয়। অর্থাৎ, ফাংশনগুলোর কাজ এক বা একই ধরনের হতে পারে, তবে প্যারামিটার আলাদা হলে ফাংশন ওভারলোডিংয়ের মাধ্যমে তাদের আলাদা আলাদা ব্যবহারের সুযোগ থাকে।
ফাংশন ওভারলোডিংয়ের প্রয়োজনীয়তা
- কোডের সরলতা ও পঠনযোগ্যতা বৃদ্ধি: একই নামের ফাংশন বিভিন্ন ধরনের ইনপুটের জন্য ব্যবহার করা যায়, ফলে কোড সহজ ও পঠনযোগ্য হয়।
- পুনঃব্যবহারযোগ্যতা: ফাংশন ওভারলোডিংয়ের মাধ্যমে ফাংশনের নাম একই রেখে ভিন্ন ধরনের ডেটা নিয়ে কাজ করা যায়, যা কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।
- সহজ মেইনটেনেন্স: একই কাজের জন্য একই ফাংশনের নাম ব্যবহার করলে কোড সহজে রক্ষণাবেক্ষণ করা যায়।
ফাংশন ওভারলোডিংয়ের উদাহরণ
ফাংশন ওভারলোডিং সাধারণত প্যারামিটারের সংখ্যা বা প্যারামিটারের ধরনে পার্থক্য রেখে করা হয়।
উদাহরণ ১: প্যারামিটারের সংখ্যা ভিন্ন হলে
#include <iostream>
using namespace std;
int add(int a, int b) { // দুটি প্যারামিটার সহ ফাংশন
return a + b;
}
int add(int a, int b, int c) { // তিনটি প্যারামিটার সহ ফাংশন
return a + b + c;
}
int main() {
cout << "Sum of 2 and 3: " << add(2, 3) << endl; // Output: 5
cout << "Sum of 2, 3, and 4: " << add(2, 3, 4) << endl; // Output: 9
return 0;
}
বর্ণনা:
- এখানে
addনামে দুটি ফাংশন ওভারলোড করা হয়েছে। প্রথম ফাংশনে দুটিintপ্যারামিটার এবং দ্বিতীয় ফাংশনে তিনটিintপ্যারামিটার রয়েছে। - প্রোগ্রামে
add(2, 3)কল করলে প্রথম ফাংশনটি কল হবে, আরadd(2, 3, 4)কল করলে দ্বিতীয় ফাংশনটি কল হবে।
উদাহরণ ২: প্যারামিটারের ধরন ভিন্ন হলে
#include <iostream>
using namespace std;
int multiply(int a, int b) { // ইন্টিজার প্যারামিটার সহ ফাংশন
return a * b;
}
double multiply(double a, double b) { // ডাবল প্যারামিটার সহ ফাংশন
return a * b;
}
int main() {
cout << "Multiplication of 3 and 4: " << multiply(3, 4) << endl; // Output: 12
cout << "Multiplication of 2.5 and 3.5: " << multiply(2.5, 3.5) << endl; // Output: 8.75
return 0;
}
বর্ণনা:
- এখানে
multiplyনামে দুটি ফাংশন আছে। প্রথম ফাংশনটিintটাইপ প্যারামিটার নেয় এবং দ্বিতীয়টিdoubleটাইপ প্যারামিটার নেয়। multiply(3, 4)কল করলে ইন্টিজার প্যারামিটার সহ ফাংশনটি এবংmultiply(2.5, 3.5)কল করলে ডাবল প্যারামিটার সহ ফাংশনটি কল হবে।
ফাংশন ওভারলোডিংয়ে কাস্টম ডেটা টাইপ ব্যবহার
ক্লাসের সাথে ফাংশন ওভারলোডিং ব্যবহার করে কাস্টম ডেটা টাইপের উপরও কাজ করা যায়।
#include <iostream>
#include <string>
using namespace std;
class Printer {
public:
void print(int value) { // ইন্টিজার প্রিন্ট করার জন্য
cout << "Integer: " << value << endl;
}
void print(string value) { // স্ট্রিং প্রিন্ট করার জন্য
cout << "String: " << value << endl;
}
void print(double value) { // ডাবল প্রিন্ট করার জন্য
cout << "Double: " << value << endl;
}
};
int main() {
Printer printer;
printer.print(42); // Output: Integer: 42
printer.print("Hello"); // Output: String: Hello
printer.print(3.14159); // Output: Double: 3.14159
return 0;
}
বর্ণনা:
Printerক্লাসেprintনামে তিনটি ফাংশন ওভারলোড করা হয়েছে, যা ইন্টিজার, স্ট্রিং এবং ডাবল ডেটা প্রিন্ট করতে সক্ষম।- ফাংশন ওভারলোডিংয়ের মাধ্যমে একই
printনাম ব্যবহার করে বিভিন্ন ধরনের ডেটা প্রিন্ট করা হয়েছে।
ফাংশন ওভারলোডিংয়ের নিয়ম এবং সীমাবদ্ধতা
প্যারামিটার সিগনেচারের ভিন্নতা: ফাংশনের প্যারামিটার সংখ্যা বা টাইপ ভিন্ন হতে হবে। শুধুমাত্র রিটার্ন টাইপ আলাদা হলে ফাংশন ওভারলোড করা যাবে না।
ডিফল্ট প্যারামিটার: যদি ফাংশনে ডিফল্ট প্যারামিটার থাকে তবে ফাংশন ওভারলোডিং সমস্যাযুক্ত হতে পারে।
রেফারেন্স ও কনস্ট্যান্ট ব্যবহারে সতর্কতা: প্যারামিটারের কনস্ট্যান্ট বা রেফারেন্স ব্যবহারের সময় ফাংশন ওভারলোডিং ভিন্নতার ভিত্তিতে ফাংশন নির্বাচন করতে পারে।
উদাহরণ: শুধুমাত্র রিটার্ন টাইপ আলাদা হলে ওভারলোডিং ব্যর্থ হবে
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
// নিচের ফাংশন ওভারলোডিং ব্যর্থ হবে, কারণ শুধুমাত্র রিটার্ন টাইপ আলাদা
double add(int a, int b) {
return a + b;
}
int main() {
cout << add(5, 10) << endl;
return 0;
}
বর্ণনা:
- এখানে দুটি
addফাংশনের মধ্যে শুধুমাত্র রিটার্ন টাইপ আলাদা, যা বৈধ নয়। ফাংশন ওভারলোডিংয়ের জন্য প্যারামিটারের সংখ্যা বা টাইপ ভিন্ন হতে হবে।
ফাংশন ওভারলোডিংয়ের সুবিধা
- একই নামের ফাংশন ব্যবহারের সুযোগ: একই কাজের জন্য একাধিক ফাংশন নাম মনে রাখতে হয় না, শুধুমাত্র প্যারামিটার পরিবর্তন করেই কাজ করা যায়।
- কোডের পঠনযোগ্যতা বৃদ্ধি: একই নামে ভিন্ন ভিন্ন ডেটা টাইপের জন্য ফাংশন ব্যবহারে কোডের পঠনযোগ্যতা বৃদ্ধি পায়।
- রক্ষণাবেক্ষণ সহজ: একই ধরনের কাজের জন্য একাধিক ফাংশন ব্যবহারে প্রোগ্রাম সহজে মেইনটেনেন্স করা যায়।
সারসংক্ষেপ
- ফাংশন ওভারলোডিং হলো একই নামে ভিন্ন ভিন্ন প্যারামিটার সহ একাধিক ফাংশন তৈরি করা।
- এটি প্রোগ্রামের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণ সহজ করে।
ফাংশন ওভারলোডিং প্রোগ্রামিংকে আরও সুশৃঙ্খল, পরিষ্কার, এবং কার্যকর করে তোলে, যা বিশেষত বড় এবং জটিল প্রোগ্রাম ব্যবস্থাপনা সহজ করতে সহায়ক।
অপারেটর ওভারলোডিং (Operator Overloading) C++ এ একটি বৈশিষ্ট্য, যা দিয়ে আমরা ইউজার-ডিফাইন্ড ডেটা টাইপের (যেমন, ক্লাস) জন্য সাধারণ অপারেটরগুলোর কাস্টম ব্যবহার সংজ্ঞায়িত করতে পারি। উদাহরণস্বরূপ, +, -, *, == ইত্যাদি অপারেটরগুলো সাধারণত প্রাথমিক ডেটা টাইপের উপর কাজ করে, কিন্তু আমরা এগুলোকে কাস্টম অবজেক্টের জন্যও ব্যবহারযোগ্য করতে পারি।
অপারেটর ওভারলোডিং কেন ব্যবহার করা হয়?
- ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য সাধারণ অপারেটর ব্যবহার: যেমন, দুটি কমপ্লেক্স সংখ্যা যোগ করা বা দুটি পয়েন্ট যোগ করা।
- কোড আরও সহজ এবং সরল করা: অপারেটর ওভারলোডিংয়ের মাধ্যমে সহজ ভাষায় কোড লেখা যায়।
- কোড পুনরায় ব্যবহারযোগ্যতা বৃদ্ধি: অপারেটর ওভারলোডিং কাস্টম ডেটা টাইপের উপর বিভিন্ন অপারেশন পরিচালনা করা সহজ করে তোলে।
অপারেটর ওভারলোডিং এর নিয়ম
- নতুন অপারেটর তৈরি করা যায় না: শুধুমাত্র বিদ্যমান অপারেটরগুলোই ওভারলোড করা যায়।
- অপারেটরের ডিফল্ট অর্থ পরিবর্তন করা যাবে না: উদাহরণস্বরূপ,
+অপারেটরকে বিয়োগফলের জন্য ব্যবহার করা যাবে না। - কমপক্ষে একটি অপারেন্ড ইউজার-ডিফাইন্ড টাইপ হতে হবে: অর্থাৎ, যদি
intএবংfloatএর মত প্রাথমিক ডেটা টাইপ ব্যবহার করা হয়, তবে সেগুলোর জন্য অপারেটর ওভারলোড করা যাবে না।
কাস্টম অপারেটর ডেফিনিশন
অপারেটর ওভারলোডিং করার জন্য সাধারণত operator কীওয়ার্ড ব্যবহার করা হয়। অপারেটরের ডেফিনিশন ক্লাসের সদস্য ফাংশন হিসেবে করা যেতে পারে বা বন্ধু (friend) ফাংশন হিসেবে ডিফাইন করা যেতে পারে।
উদাহরণ ১: + অপারেটর ওভারলোড করে দুটি Complex অবজেক্ট যোগ করা
#include <iostream>
using namespace std;
class Complex {
private:
float real;
float imag;
public:
Complex(float r = 0, float i = 0) : real(r), imag(i) {}
// + অপারেটর ওভারলোড করা
Complex operator + (const Complex &c) {
Complex temp;
temp.real = real + c.real;
temp.imag = imag + c.imag;
return temp;
}
// কমপ্লেক্স সংখ্যা প্রদর্শন
void display() const {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5);
Complex c2(1.5, 3.0);
Complex c3 = c1 + c2; // + অপারেটর ওভারলোড ব্যবহার করে যোগফল নির্ণয়
cout << "Complex number 1: ";
c1.display();
cout << "Complex number 2: ";
c2.display();
cout << "Sum: ";
c3.display();
return 0;
}
বর্ণনা:
- এখানে
Complexক্লাসে+অপারেটর ওভারলোড করা হয়েছে। operator +ফাংশনটিComplexঅবজেক্ট গ্রহণ করে এবং রিয়েল ও ইমাজিনারি অংশ যোগ করে নতুনComplexঅবজেক্ট ফেরত দেয়।
আউটপুট:
Complex number 1: 3.5 + 2.5i
Complex number 2: 1.5 + 3.0i
Sum: 5.0 + 5.5i
উদাহরণ ২: == অপারেটর ওভারলোড করে দুটি Complex অবজেক্ট তুলনা করা
#include <iostream>
using namespace std;
class Complex {
private:
float real;
float imag;
public:
Complex(float r = 0, float i = 0) : real(r), imag(i) {}
// == অপারেটর ওভারলোড করা
bool operator == (const Complex &c) const {
return (real == c.real && imag == c.imag);
}
void display() const {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5);
Complex c2(3.5, 2.5);
Complex c3(1.0, 1.0);
if (c1 == c2) {
cout << "c1 and c2 are equal." << endl;
} else {
cout << "c1 and c2 are not equal." << endl;
}
if (c1 == c3) {
cout << "c1 and c3 are equal." << endl;
} else {
cout << "c1 and c3 are not equal." << endl;
}
return 0;
}
বর্ণনা:
- এখানে
==অপারেটর ওভারলোড করা হয়েছে, যা দুটিComplexঅবজেক্টের রিয়েল এবং ইমাজিনারি অংশের সমতা যাচাই করে। c1 == c2এবংc1 == c3চেক করা হয়েছে।
আউটপুট:
c1 and c2 are equal.
c1 and c3 are not equal.
উদাহরণ ৩: ++ অপারেটর ওভারলোড (প্রিফিক্স এবং পোস্টফিক্স)
#include <iostream>
using namespace std;
class Counter {
private:
int count;
public:
Counter(int c = 0) : count(c) {}
// প্রিফিক্স ++ অপারেটর ওভারলোড
Counter& operator++() {
++count;
return *this;
}
// পোস্টফিক্স ++ অপারেটর ওভারলোড
Counter operator++(int) {
Counter temp = *this;
count++;
return temp;
}
void display() const {
cout << "Count: " << count << endl;
}
};
int main() {
Counter c1(5);
++c1; // প্রিফিক্স ++
c1.display();
c1++; // পোস্টফিক্স ++
c1.display();
return 0;
}
বর্ণনা:
- এখানে
++অপারেটর প্রিফিক্স এবং পোস্টফিক্স ফর্মে ওভারলোড করা হয়েছে।- প্রিফিক্স
++অপারেটরের জন্যoperator++()মেথড ব্যবহার করা হয়েছে। - পোস্টফিক্স
++অপারেটরের জন্যoperator++(int)মেথড ব্যবহার করা হয়েছে।
- প্রিফিক্স
আউটপুট:
Count: 6
Count: 7
কিছু সাধারণ অপারেটর এবং তাদের ওভারলোডিং
| অপারেটর | উদ্দেশ্য | ওভারলোডিং সম্ভব |
|---|---|---|
+ | যোগফল | হ্যাঁ |
- | বিয়োগফল | হ্যাঁ |
* | গুণফল | হ্যাঁ |
== | সমতা যাচাই | হ্যাঁ |
++ | ইনক্রিমেন্ট | হ্যাঁ |
-- | ডিক্রিমেন্ট | হ্যাঁ |
[] | অ্যারের ইন্ডেক্স অ্যাক্সেস | হ্যাঁ |
অপারেটর ওভারলোডিংয়ের সুবিধা
- ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য সাধারণ অপারেটর ব্যবহার: অপারেটর ওভারলোডিংয়ের মাধ্যমে ইউজার-ডিফাইন্ড ডেটা টাইপের উপর সহজেই অপারেশন করা যায়।
- কোড সংক্ষিপ্ত ও সহজ: ওভারলোডিংয়ের মাধ্যমে জটিল কোডকে সরল করা যায়।
- পলিমরফিজম: অপারেটর ওভারলোডিং পলিমরফিজমের একটি উদাহরণ, যা প্রোগ্রামকে নমনীয় করে তোলে।
সারসংক্ষেপ
- অপারেটর ওভারলোডিং C++ এ ইউজার-ডিফাইন্ড ডেটা টাইপের জন্য সাধারণ অপারেটরের ব্যবহারকে কাস্টমাইজ করার একটি পদ্ধতি।
- এটি
operatorকীওয়ার্ড ব্যবহার করে সংজ্ঞায়িত করা হয় এবং ক্লাসের মেম্বার বা ফ্রেন্ড ফাংশন হিসেবে ডিফাইন করা যায়। - অপারেটর ওভারলোডিংয়ের মাধ্যমে কোডকে আরও কার্যকরী, সহজ এবং পড়তে সুবিধাজনক করা যায়।
Read more