C++ এ ফাংশনে প্যারামিটার পাসিং মূলত দুটি উপায়ে করা যায়: পাস-বাই-ভ্যালু (Pass-by-Value) এবং পাস-বাই-রেফারেন্স (Pass-by-Reference)। প্রতিটি পদ্ধতির নিজস্ব বৈশিষ্ট্য ও সুবিধা রয়েছে এবং এটি নির্ভর করে প্রোগ্রামের প্রয়োজনীয়তার উপর।
১. পাস-বাই-ভ্যালু (Pass-by-Value)
পাস-বাই-ভ্যালু হলো প্যারামিটার পাসিং এর একটি পদ্ধতি যেখানে মূল ভ্যারিয়েবলের মানের একটি কপি ফাংশনে পাঠানো হয়। এই পদ্ধতিতে ফাংশনে যে পরিবর্তনই করা হোক না কেন, তা মূল ভ্যারিয়েবলে প্রভাবিত হয় না।
উদাহরণ: পাস-বাই-ভ্যালু
#include <iostream>
using namespace std;
void modifyValue(int x) { // x এর মান কপি হিসেবে পাস হয়েছে
x = 20; // এখানে কেবলমাত্র কপিটি পরিবর্তিত হবে
}
int main() {
int a = 10;
modifyValue(a); // ফাংশনে a এর মান কপি হিসেবে পাস হবে
cout << "Value of a after function call: " << a << endl; // Output: 10
return 0;
}
বর্ণনা:
- এখানে
aএর মানmodifyValueফাংশনে পাঠানো হয়েছে, কিন্তু ফাংশনে কেবলaএর একটি কপি পাঠানো হয়েছে। তাই ফাংশনের ভিতরেxএর মান পরিবর্তিত হলেও মূলaএর মান অপরিবর্তিত থাকে।
সুবিধা:
- পাস-বাই-ভ্যালু মূল ভ্যারিয়েবল থেকে আলাদা একটি কপি তৈরি করে, তাই ফাংশনে কোনো পরিবর্তন করলে মূল ডেটা পরিবর্তিত হয় না।
অসুবিধা:
- বড় ডেটা টাইপের ক্ষেত্রে এটি বেশি মেমোরি ব্যবহার করে, কারণ প্রতিবার কপি তৈরি করতে হয়।
২. পাস-বাই-রেফারেন্স (Pass-by-Reference)
পাস-বাই-রেফারেন্স পদ্ধতিতে মূল ভ্যারিয়েবলের রেফারেন্স (অ্যাড্রেস) ফাংশনে পাঠানো হয়। ফলে ফাংশনে যে পরিবর্তন করা হয়, তা সরাসরি মূল ভ্যারিয়েবলে প্রতিফলিত হয়। এই পদ্ধতিতে & (অ্যাম্পারস্যান্ড) চিহ্ন ব্যবহার করে রেফারেন্স পাস করা হয়।
উদাহরণ: পাস-বাই-রেফারেন্স
#include <iostream>
using namespace std;
void modifyValue(int &x) { // x এর রেফারেন্স পাস হয়েছে
x = 20; // এখানে মূল ভ্যারিয়েবল পরিবর্তিত হবে
}
int main() {
int a = 10;
modifyValue(a); // ফাংশনে a এর রেফারেন্স পাস করা হচ্ছে
cout << "Value of a after function call: " << a << endl; // Output: 20
return 0;
}
বর্ণনা:
- এখানে
aএর রেফারেন্সmodifyValueফাংশনে পাঠানো হয়েছে। তাই ফাংশনেxএর মাধ্যমেaএর আসল মান পরিবর্তিত হয়। আউটপুটে দেখা যাবে যেaএর মান ১০ থেকে ২০ তে পরিবর্তিত হয়েছে।
সুবিধা:
- পাস-বাই-রেফারেন্স মেমোরি সাশ্রয়ী, কারণ এটি কপি তৈরি করে না।
- বড় ডেটা টাইপের ক্ষেত্রে এটি কার্যকর, কারণ সরাসরি রেফারেন্স ব্যবহার করা হয়।
অসুবিধা:
- মূল ডেটা পরিবর্তন হওয়ার ঝুঁকি থাকে, কারণ রেফারেন্স দ্বারা সরাসরি মেমোরি অ্যাক্সেস করা হয়।
পাস-বাই-ভ্যালু বনাম পাস-বাই-রেফারেন্স
| বৈশিষ্ট্য | পাস-বাই-ভ্যালু | পাস-বাই-রেফারেন্স |
|---|---|---|
| ডেটা কপি | হ্যাঁ, ডেটার কপি পাস হয় | না, সরাসরি রেফারেন্স পাস হয় |
| মূল ডেটার উপর প্রভাব | মূল ডেটা পরিবর্তিত হয় না | মূল ডেটা সরাসরি পরিবর্তিত হয় |
| মেমোরি ব্যবহার | বেশি মেমোরি ব্যবহার করে | মেমোরি সাশ্রয়ী |
| বড় ডেটা টাইপের ক্ষেত্রে | কম কার্যকর | বেশি কার্যকর |
| ব্যবহারিক ক্ষেত্র | যখন মূল ডেটা অপরিবর্তিত রাখা প্রয়োজন | যখন মূল ডেটা পরিবর্তন প্রয়োজন |
পাস-বাই-কন্সট্যান্ট রেফারেন্স
যখন আমরা রেফারেন্স পাস করতে চাই কিন্তু ফাংশনে ডেটা পরিবর্তন করতে চাই না, তখন const reference ব্যবহার করা হয়। এটি ডেটা নিরাপত্তা নিশ্চিত করে।
উদাহরণ: পাস-বাই-কন্সট্যান্ট রেফারেন্স
#include <iostream>
using namespace std;
void displayValue(const int &x) { // const রেফারেন্স ব্যবহার করা হয়েছে
cout << "Value: " << x << endl;
// x = 20; // এটি একটি ত্রুটি, কারণ x কন্সট্যান্ট রেফারেন্স
}
int main() {
int a = 10;
displayValue(a);
return 0;
}
বর্ণনা:
- এখানে
displayValueফাংশনেaএর কন্সট্যান্ট রেফারেন্স পাস করা হয়েছে। এতে করেxএর মাধ্যমেaএর মান দেখা যাবে কিন্তু কোনো পরিবর্তন করা যাবে না।
সারসংক্ষেপ
- পাস-বাই-ভ্যালু: ডেটার একটি কপি ফাংশনে পাস হয়, মূল ডেটা অপরিবর্তিত থাকে।
- পাস-বাই-রেফারেন্স: মূল ডেটার রেফারেন্স পাস হয়, মূল ডেটা পরিবর্তিত হতে পারে।
- পাস-বাই-কন্সট্যান্ট রেফারেন্স: রেফারেন্স পাস হয়, কিন্তু কন্সট্যান্ট হওয়ায় ডেটা পরিবর্তন করা যায় না।
ফাংশনে প্যারামিটার পাস করার পদ্ধতি নির্ভর করে প্রোগ্রামের প্রয়োজনীয়তা এবং মেমোরি ব্যবহারের দক্ষতার উপর।