অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (Object-Oriented Programming বা OOP) হলো প্রোগ্রামিংয়ের একটি পদ্ধতি, যেখানে প্রোগ্রামের বিভিন্ন উপাদানকে অবজেক্ট আকারে গঠন করে সমস্যার সমাধান করা হয়। OOP-এর মাধ্যমে প্রোগ্রামের কোড সহজে ব্যবস্থাপনা, পুনঃব্যবহার, এবং বড় সফটওয়্যার ডেভেলপমেন্টে সহায়ক হয়। OOP-এর প্রধান চারটি বৈশিষ্ট্য হলো: এনক্যাপসুলেশন (Encapsulation), ইনহেরিটেন্স (Inheritance), পলিমরফিজম (Polymorphism), এবং অ্যাবস্ট্রাকশন (Abstraction)।
OOP এর প্রধান ধারণা
১. ক্লাস (Class)
ক্লাস হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট, যা অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়। ক্লাসের মধ্যে ডেটা এবং মেথড (ফাংশন) থাকে, যা ঐ ক্লাসের সব অবজেক্টে প্রযোজ্য।
উদাহরণ:
class Car {
public:
string brand;
int year;
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
২. অবজেক্ট (Object)
অবজেক্ট হলো ক্লাসের একটি নির্দিষ্ট উদাহরণ, যা ক্লাসের বৈশিষ্ট্য এবং মেথড ব্যবহার করে। একাধিক অবজেক্ট একই ক্লাস থেকে তৈরি করা যায়, এবং প্রতিটি অবজেক্টের জন্য ডেটা আলাদা হতে পারে।
উদাহরণ:
Car car1;
car1.brand = "Toyota";
car1.year = 2020;
car1.display();
OOP এর চারটি প্রধান বৈশিষ্ট্য
১. এনক্যাপসুলেশন (Encapsulation)
এনক্যাপসুলেশন হলো ডেটা এবং মেথডকে একত্রিত করে একটি ইউনিট তৈরি করা, যা ডেটা সুরক্ষিত রাখে এবং বাইরের অ্যাক্সেস থেকে নিয়ন্ত্রণ করে। সি++ এ সাধারণত ক্লাসের মধ্যে প্রাইভেট (private) এবং পাবলিক (public) অ্যাক্সেস মডিফায়ার ব্যবহার করে ডেটা এনক্যাপসুলেট করা হয়।
উদাহরণ:
class Student {
private:
int id;
public:
void setId(int id) {
this->id = id;
}
int getId() {
return id;
}
};
২. ইনহেরিটেন্স (Inheritance)
ইনহেরিটেন্স হলো একটি ক্লাসের বৈশিষ্ট্য এবং মেথড অন্য একটি ক্লাসে উত্তরাধিকার সূত্রে পাওয়া। এতে কোডের পুনঃব্যবহার সহজ হয় এবং কোডিং কমপ্লেক্সিটি কমে।
উদাহরণ:
class Vehicle {
public:
string brand;
void honk() {
cout << "Beep beep!" << endl;
}
};
class Car : public Vehicle {
public:
int year;
};
এখানে Car ক্লাসটি Vehicle ক্লাস থেকে ইনহেরিট করেছে, তাই Car অবজেক্টেও Vehicle এর বৈশিষ্ট্যগুলি পাওয়া যাবে।
৩. পলিমরফিজম (Polymorphism)
পলিমরফিজম হলো একই ফাংশনের বিভিন্ন আকারে ব্যবহার, অর্থাৎ একই মেথড বিভিন্নভাবে ব্যবহৃত হতে পারে। পলিমরফিজমের দুটি ধরন আছে: কম্পাইল টাইম পলিমরফিজম (যেমন ফাংশন ওভারলোডিং) এবং রানটাইম পলিমরফিজম (যেমন ফাংশন ওভাররাইডিং)।
ফাংশন ওভারলোডিং উদাহরণ:
class Print {
public:
void display(int i) {
cout << "Integer: " << i << endl;
}
void display(double d) {
cout << "Double: " << d << endl;
}
};
ফাংশন ওভাররাইডিং উদাহরণ:
class Animal {
public:
virtual void sound() {
cout << "Animal sound" << endl;
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Bark" << endl;
}
};
৪. অ্যাবস্ট্রাকশন (Abstraction)
অ্যাবস্ট্রাকশন হলো প্রোগ্রামের অপ্রয়োজনীয় ডিটেইল লুকিয়ে ফেলা এবং শুধু গুরুত্বপূর্ণ তথ্য প্রকাশ করা। এটি প্রোগ্রামকে সহজ এবং পরিষ্কার করে তোলে। সি++ এ অ্যাবস্ট্রাকশন অর্জনের জন্য সাধারণত abstract class বা interface ব্যবহার করা হয়।
উদাহরণ:
class Shape {
public:
virtual void draw() = 0; // pure virtual function
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
OOP এর সুবিধা
- পুনঃব্যবহারযোগ্য কোড: ইনহেরিটেন্স ব্যবহার করে কোড পুনঃব্যবহারযোগ্য করা যায়।
- সহজ মেইনটেনেন্স: এনক্যাপসুলেশন এবং অ্যাবস্ট্রাকশনের কারণে কোড আরও সংগঠিত এবং সহজে মেইনটেনেবল হয়।
- ডেটা সুরক্ষা: প্রাইভেট ডেটা মেম্বার ব্যবহার করে ডেটাকে সুরক্ষিত রাখা যায়।
- সহজ আপগ্রেড এবং মডিফিকেশন: মডুলার প্রোগ্রামিংয়ের কারণে পরিবর্তন ও আপগ্রেড সহজ হয়।
সারসংক্ষেপ
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) প্রোগ্রামিংয়ের একটি শক্তিশালী পদ্ধতি, যা প্রোগ্রামকে ক্লাস ও অবজেক্টে বিভক্ত করে আরও কার্যকর, সংগঠিত এবং পুনঃব্যবহারযোগ্য করে তোলে। এর চারটি প্রধান বৈশিষ্ট্য: এনক্যাপসুলেশন, ইনহেরিটেন্স, পলিমরফিজম, এবং অ্যাবস্ট্রাকশন প্রোগ্রামিংয়ের সরলতা ও কার্যকারিতা বৃদ্ধি করে, যা বড় সফটওয়্যার ডেভেলপমেন্টে খুবই সহায়ক।
ক্লাস (Class) এবং অবজেক্ট (Object) হলো C++ প্রোগ্রামিংয়ের অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণার দুটি প্রধান উপাদান।
ক্লাস কী?
ক্লাস হলো একটি টেমপ্লেট বা ব্লুপ্রিন্ট যা ডেটা এবং মেথড একত্রে সংরক্ষণ করে। এটি একটি ইউজার-ডিফাইন্ড ডেটা টাইপ, যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়। ক্লাসের মধ্যে থাকা ডেটা ডেটা মেম্বার নামে পরিচিত এবং ফাংশনগুলো মেম্বার ফাংশন নামে পরিচিত। ক্লাসের মাধ্যমে একটি নতুন ডেটা টাইপ তৈরি করা হয়, যা বাস্তব জীবনের অবজেক্টকে প্রোগ্রামিংয়ে মডেল করতে সাহায্য করে।
অবজেক্ট কী?
অবজেক্ট হলো ক্লাসের একটি নির্দিষ্ট উদাহরণ (ইনস্ট্যান্স), যা ক্লাসে সংজ্ঞায়িত ডেটা এবং মেথড ব্যবহার করতে পারে। ক্লাসে সংজ্ঞায়িত গুণাবলি এবং আচরণের ভিত্তিতে অবজেক্ট তৈরি করা হয়। প্রতিটি অবজেক্টে ক্লাসের বৈশিষ্ট্যগুলো থাকে, কিন্তু তারা আলাদাভাবে সংরক্ষণ ও ব্যবহৃত হয়।
ক্লাস এবং অবজেক্টের উদাহরণ
ধরা যাক, আমরা একটি Car ক্লাস তৈরি করতে চাই, যা বিভিন্ন গাড়ির বৈশিষ্ট্য এবং ফাংশন সংরক্ষণ করবে।
ক্লাস ঘোষণা করা
#include <iostream>
using namespace std;
class Car {
public:
string brand; // ডেটা মেম্বার
int year; // ডেটা মেম্বার
// মেম্বার ফাংশন
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
বর্ণনা:
- এখানে
Carনামে একটি ক্লাস তৈরি করা হয়েছে, যাbrandএবংyearনামে দুটি ডেটা মেম্বার ধারণ করে। displayInfo()নামে একটি মেম্বার ফাংশন রয়েছে, যা গাড়ির তথ্য প্রদর্শন করে।
অবজেক্ট তৈরি এবং ব্যবহার
int main() {
Car car1; // Car ক্লাসের একটি অবজেক্ট তৈরি
car1.brand = "Toyota"; // car1 অবজেক্টের ডেটা মেম্বার সেট
car1.year = 2020;
Car car2; // Car ক্লাসের আরেকটি অবজেক্ট তৈরি
car2.brand = "Honda";
car2.year = 2019;
// অবজেক্টের মেম্বার ফাংশন কল
car1.displayInfo();
car2.displayInfo();
return 0;
}
আউটপুট:
Brand: Toyota, Year: 2020
Brand: Honda, Year: 2019
বর্ণনা:
car1এবংcar2নামে দুটি অবজেক্ট তৈরি করা হয়েছে, যেগুলোCarক্লাসের ডেটা মেম্বারbrandএবংyearএর মান ধারণ করছে।- প্রতিটি অবজেক্টের
displayInfo()মেম্বার ফাংশন কল করা হয়েছে, যা তাদের গাড়ির ব্র্যান্ড এবং বছর প্রদর্শন করে।
অ্যাক্সেস স্পেসিফায়ার
ক্লাসে তিন ধরনের অ্যাক্সেস স্পেসিফায়ার ব্যবহার করা হয়: public, private, এবং protected। এগুলো নির্ধারণ করে ক্লাসের সদস্যদের অ্যাক্সেস লেভেল।
- public: ক্লাসের বাইরে থেকে অ্যাক্সেসযোগ্য।
- private: কেবলমাত্র ক্লাসের ভিতরে অ্যাক্সেসযোগ্য।
- protected: ক্লাস এবং তার ডেরাইভড ক্লাসের ভিতরে অ্যাক্সেসযোগ্য।
উদাহরণ: private অ্যাক্সেস স্পেসিফায়ার
class Car {
private:
string brand; // private ডেটা মেম্বার
int year;
public:
void setInfo(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
বর্ণনা:
- এখানে
brandএবংyearপ্রাইভেট ডেটা মেম্বার, যা ক্লাসের বাইরে সরাসরি অ্যাক্সেসযোগ্য নয়। setInfo()ফাংশন ব্যবহার করেbrandএবংyearসেট করা হয়েছে, এবংdisplayInfo()ফাংশন ব্যবহার করে তথ্য প্রদর্শন করা হয়েছে।
কন্সট্রাক্টর এবং ডেস্ট্রাক্টর
কন্সট্রাক্টর
কন্সট্রাক্টর হলো একটি বিশেষ ফাংশন, যা অবজেক্ট তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত ক্লাসের ডেটা মেম্বার ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। কন্সট্রাক্টরের নাম অবশ্যই ক্লাসের নামের মতো হতে হবে এবং এর কোনো রিটার্ন টাইপ থাকে না।
class Car {
public:
string brand;
int year;
Car(string b, int y) { // কন্সট্রাক্টর
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
ডেস্ট্রাক্টর
ডেস্ট্রাক্টর একটি বিশেষ ফাংশন, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এর নামও ক্লাসের নামের মতো হয়, তবে এর আগে ~ (টিল্ডা) চিহ্ন থাকে।
class Car {
public:
Car() {
cout << "Constructor called!" << endl;
}
~Car() {
cout << "Destructor called!" << endl;
}
};
ক্লাস এবং অবজেক্টের সুবিধা
১. কোড পুনঃব্যবহারযোগ্যতা: ক্লাস একবার তৈরি করলে একাধিক অবজেক্ট তৈরি করে সেটি পুনরায় ব্যবহার করা যায়। ২. ডেটা হাইডিং: প্রাইভেট মেম্বার ব্যবহার করে ডেটা গোপন রাখা যায়, যা ডেটা সুরক্ষিত রাখে। ৩. কোডের পঠনযোগ্যতা বৃদ্ধি: ক্লাসের সাহায্যে কোডকে সহজে পড়া যায় এবং সংগঠিত রাখা যায়। ৪. মডুলার প্রোগ্রামিং: বড় প্রোগ্রামকে ছোট ছোট অংশে ভাগ করা যায়, যা ডিবাগিং এবং মেইনটেনেন্সে সহায়ক।
সারসংক্ষেপ
- ক্লাস হলো একটি টেমপ্লেট বা ব্লুপ্রিন্ট, যা ডেটা মেম্বার এবং মেম্বার ফাংশন ধারণ করে।
- অবজেক্ট হলো ক্লাসের একটি নির্দিষ্ট উদাহরণ, যা ক্লাসের ডেটা এবং মেথড ব্যবহার করতে পারে।
- ক্লাস এবং অবজেক্ট প্রোগ্রামিংয়ে ডেটা ও ফাংশনগুলিকে মডুলার এবং সংগঠিতভাবে সংরক্ষণ ও ব্যবহার করতে সহায়ক।
ক্লাস এবং অবজেক্ট OOP ধারণায় প্রোগ্রামকে আরও কার্যকর এবং পুনঃব্যবহারযোগ্য করে তোলে, যা সফটওয়্যার ডেভেলপমেন্টে অত্যন্ত গুরুত্বপূর্ণ।
অ্যাক্সেস মডিফায়ার হলো প্রোগ্রামিংয়ে ব্যবহৃত এমন কিছু কীওয়ার্ড যা ক্লাসের ভেরিয়েবল এবং মেথডের অ্যাক্সেসibilটিকে নিয়ন্ত্রণ করে। সি++ এ তিন ধরনের অ্যাক্সেস মডিফায়ার রয়েছে: private, public, এবং protected। এগুলি ক্লাসের সদস্যদের অ্যাক্সেস সীমা নির্ধারণ করে এবং প্রোগ্রামে ডেটা সুরক্ষায় গুরুত্বপূর্ণ ভূমিকা পালন করে।
১. private অ্যাক্সেস মডিফায়ার
private অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত কোনো মেম্বার ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না। শুধুমাত্র ক্লাসের ভেতর থেকে এবং ক্লাসের মেথডের মাধ্যমেই এই ধরনের মেম্বারগুলো অ্যাক্সেস করা সম্ভব। এটি ডেটাকে সুরক্ষিত রাখতে সাহায্য করে।
উদাহরণ:
#include <iostream>
using namespace std;
class Car {
private:
int year; // private মেম্বার
public:
void setYear(int y) { // setter মেথড
year = y;
}
int getYear() { // getter মেথড
return year;
}
};
int main() {
Car myCar;
myCar.setYear(2020); // setYear এর মাধ্যমে year সেট করা হচ্ছে
cout << "Year: " << myCar.getYear() << endl; // getYear এর মাধ্যমে year পাওয়া যাচ্ছে
return 0;
}
ব্যাখ্যা:
- এখানে
yearভেরিয়েবলটিprivate, তাই সরাসরিmyCar.yearদ্বারা সেটি অ্যাক্সেস করা যাবে না। setYearএবংgetYearমেথডগুলো ব্যবহার করেyearএর মান সেট ও পড়া হচ্ছে।
২. public অ্যাক্সেস মডিফায়ার
public অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত মেম্বারগুলো ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেসযোগ্য। এগুলি ক্লাসের যে কোনো অবজেক্ট থেকে অ্যাক্সেস করা যায়।
উদাহরণ:
#include <iostream>
using namespace std;
class Car {
public:
int year; // public মেম্বার
};
int main() {
Car myCar;
myCar.year = 2020; // year সরাসরি অ্যাক্সেস ও সেট করা
cout << "Year: " << myCar.year << endl;
return 0;
}
ব্যাখ্যা:
- এখানে
yearভেরিয়েবলটিpublic, তাই সরাসরিmyCar.yearদ্বারা সেটি অ্যাক্সেস ও সেট করা সম্ভব। publicমেম্বার হিসেবেyearসরাসরি ক্লাসের বাইরেও ব্যবহার করা যায়।
৩. protected অ্যাক্সেস মডিফায়ার
protected অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত মেম্বারগুলো শুধুমাত্র ক্লাসের ভেতরে এবং সেই ক্লাস থেকে ইনহেরিট করা ক্লাসে অ্যাক্সেসযোগ্য। কিন্তু, ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না। এটি ইনহেরিটেন্সের ক্ষেত্রে ডেটা সুরক্ষিত রাখতে সহায়ক।
উদাহরণ:
#include <iostream>
using namespace std;
class Vehicle {
protected:
string brand; // protected মেম্বার
public:
void setBrand(string b) {
brand = b;
}
};
class Car : public Vehicle {
public:
void display() {
cout << "Brand: " << brand << endl; // protected মেম্বার subclass এ অ্যাক্সেসযোগ্য
}
};
int main() {
Car myCar;
myCar.setBrand("Toyota");
myCar.display(); // Displaying the brand
return 0;
}
ব্যাখ্যা:
- এখানে
brandমেম্বারটিprotected, যাVehicleক্লাসেরCarইনহেরিটেড ক্লাস থেকে অ্যাক্সেসযোগ্য। setBrandমেথডটি ব্যবহার করেbrandএর মান সেট করা হয়েছে, যাdisplayমেথডে অ্যাক্সেসযোগ্য।
সংক্ষিপ্ত তুলনা
| অ্যাক্সেস মডিফায়ার | ক্লাসের ভিতরে | ইনহেরিটেড ক্লাসে | ক্লাসের বাইরে |
|---|---|---|---|
private | ✔️ | ❌ | ❌ |
protected | ✔️ | ✔️ | ❌ |
public | ✔️ | ✔️ | ✔️ |
অ্যাক্সেস মডিফায়ার ব্যবহার করার উপকারিতা
- ডেটা সুরক্ষা: অ্যাক্সেস মডিফায়ার ব্যবহার করে ডেটা মেম্বার এবং মেথডের অ্যাক্সেসibilটিকে নিয়ন্ত্রণ করা যায়, যা ডেটা সুরক্ষিত রাখে।
- ক্লাসের সংজ্ঞা ও ব্যবহার পৃথক করা: ক্লাসের অভ্যন্তরীণ কার্যক্রম এবং বাইরের ব্যবহারের মধ্যে পার্থক্য তৈরি করতে সাহায্য করে।
- কোডের মডুলারিটি বৃদ্ধি: অ্যাক্সেস মডিফায়ার ব্যবহার করে কোডকে আরও মডুলার এবং সহজে ব্যবস্থাপনা করার উপযোগী করে তোলা যায়।
সারসংক্ষেপ
অ্যাক্সেস মডিফায়ার সি++ এ ডেটা এবং মেথডের অ্যাক্সেসibilটি নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। private মেম্বার শুধুমাত্র ক্লাসের ভিতরে অ্যাক্সেসযোগ্য, protected মেম্বার ক্লাসের ভিতরে এবং ইনহেরিটেড ক্লাসে অ্যাক্সেসযোগ্য, এবং public মেম্বার ক্লাসের বাইরেও অ্যাক্সেসযোগ্য। অ্যাক্সেস মডিফায়ার প্রোগ্রামের ডেটা সুরক্ষা এবং সঠিক ব্যবস্থাপনার জন্য অত্যন্ত গুরুত্বপূর্ণ।
কনস্ট্রাক্টর (Constructor) এবং ডেস্ট্রাক্টর (Destructor) হলো C++ ক্লাসের বিশেষ ফাংশন। এদের মূল কাজ হলো অবজেক্ট তৈরি ও ধ্বংসের সময় নির্দিষ্ট কার্য সম্পাদন করা।
কনস্ট্রাক্টর (Constructor)
কনস্ট্রাক্টর হলো একটি বিশেষ ধরনের ফাংশন, যা ক্লাসের অবজেক্ট তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত ক্লাসের ডেটা মেম্বার ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
কনস্ট্রাক্টরের বৈশিষ্ট্য
- নাম: কনস্ট্রাক্টরের নাম অবশ্যই ক্লাসের নামের মতো হতে হবে।
- রিটার্ন টাইপ নেই: কনস্ট্রাক্টরের কোনো রিটার্ন টাইপ থাকে না, এমনকি
voidও নয়। - অটোমেটিক কল: অবজেক্ট তৈরি করার সময় কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কল হয়।
- ওভারলোডিং সমর্থন: C++ এ কনস্ট্রাক্টর ওভারলোডিং সম্ভব, অর্থাৎ একই ক্লাসে একাধিক কনস্ট্রাক্টর থাকতে পারে, যদি তাদের প্যারামিটার আলাদা হয়।
কনস্ট্রাক্টরের প্রকারভেদ
- ডিফল্ট কনস্ট্রাক্টর: কোনো প্যারামিটার ছাড়া কনস্ট্রাক্টর তৈরি করা হয়।
- প্যারামিটারাইজড কনস্ট্রাক্টর: এক বা একাধিক প্যারামিটার সহ কনস্ট্রাক্টর তৈরি করা হয়।
- কপি কনস্ট্রাক্টর: একটি অবজেক্ট থেকে আরেকটি অবজেক্ট তৈরি করতে ব্যবহৃত হয়।
উদাহরণ: ডিফল্ট এবং প্যারামিটারাইজড কনস্ট্রাক্টর
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
// ডিফল্ট কনস্ট্রাক্টর
Car() {
brand = "Unknown";
year = 0;
}
// প্যারামিটারাইজড কনস্ট্রাক্টর
Car(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1; // ডিফল্ট কনস্ট্রাক্টর কল হবে
Car car2("Toyota", 2020); // প্যারামিটারাইজড কনস্ট্রাক্টর কল হবে
car1.displayInfo(); // Output: Brand: Unknown, Year: 0
car2.displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
- এখানে
Carক্লাসে দুটি কনস্ট্রাক্টর আছে।Car()হলো ডিফল্ট কনস্ট্রাক্টর, যাcar1অবজেক্ট তৈরি করার সময় কল হয়েছে এবংCar(string b, int y)হলো প্যারামিটারাইজড কনস্ট্রাক্টর, যাcar2অবজেক্ট তৈরি করার সময় কল হয়েছে।
ডেস্ট্রাক্টর (Destructor)
ডেস্ট্রাক্টর হলো একটি বিশেষ ফাংশন, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি অবজেক্টের মেমোরি মুক্ত করতে বা ক্লিনআপ কার্য সম্পাদন করতে ব্যবহৃত হয়। C++ এ প্রতিটি ক্লাসের কেবলমাত্র একটি ডেস্ট্রাক্টর থাকতে পারে।
ডেস্ট্রাক্টরের বৈশিষ্ট্য
- নাম: ডেস্ট্রাক্টরের নাম ক্লাসের নামের মতো হয়, তবে এর আগে
~(টিল্ডা) চিহ্ন থাকে। - রিটার্ন টাইপ নেই: ডেস্ট্রাক্টরের কোনো রিটার্ন টাইপ থাকে না।
- প্যারামিটার নেই: C++ এ ডেস্ট্রাক্টর কখনো প্যারামিটার গ্রহণ করতে পারে না।
- স্বয়ংক্রিয় কল: অবজেক্টের জীবনকাল শেষ হওয়ার সময় ডেস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কল হয়।
ডেস্ট্রাক্টরের উদাহরণ
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
// প্যারামিটারাইজড কনস্ট্রাক্টর
Car(string b, int y) {
brand = b;
year = y;
cout << "Constructor called for " << brand << endl;
}
// ডেস্ট্রাক্টর
~Car() {
cout << "Destructor called for " << brand << endl;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1("Toyota", 2020);
Car car2("Honda", 2019);
car1.displayInfo();
car2.displayInfo();
return 0;
}
আউটপুট:
Constructor called for Toyota
Constructor called for Honda
Brand: Toyota, Year: 2020
Brand: Honda, Year: 2019
Destructor called for Honda
Destructor called for Toyota
বর্ণনা:
- এখানে
Carক্লাসে একটি ডেস্ট্রাক্টর~Car()তৈরি করা হয়েছে, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। - যখন প্রোগ্রাম শেষ হয়, তখন
car2এবংcar1অবজেক্টের জন্য ডেস্ট্রাক্টর কল হয় এবং"Destructor called for Honda"এবং"Destructor called for Toyota"মেসেজ প্রিন্ট হয়।
কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরের পার্থক্য
| বৈশিষ্ট্য | কনস্ট্রাক্টর | ডেস্ট্রাক্টর |
|---|---|---|
| কাজ | অবজেক্ট তৈরি করার সময় ইনিশিয়ালাইজেশন করা | অবজেক্ট ধ্বংস করার সময় ক্লিনআপ করা |
| নাম | ক্লাসের নামের মতো | ক্লাসের নামের আগে ~ চিহ্ন থাকে |
| রিটার্ন টাইপ | রিটার্ন টাইপ নেই | রিটার্ন টাইপ নেই |
| প্যারামিটার | প্যারামিটার থাকতে পারে | প্যারামিটার থাকতে পারে না |
| ওভারলোডিং সমর্থন | ওভারলোডিং সমর্থন করে | ওভারলোডিং সমর্থন করে না |
কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর কেন ব্যবহার করা হয়?
- অবজেক্ট ইনিশিয়ালাইজেশন: কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি হওয়ার সাথে সাথেই ডেটা মেম্বার ইনিশিয়ালাইজ করা যায়।
- মেমোরি ম্যানেজমেন্ট: কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ব্যবহার করে ডাইনামিক মেমোরি বরাদ্দ এবং মুক্ত করা যায়।
- রিসোর্স ম্যানেজমেন্ট: প্রোগ্রামে ব্যবহৃত বিভিন্ন রিসোর্স যেমন ফাইল, ডেটাবেস কানেকশন ইত্যাদি সঠিক সময়ে তৈরি এবং মুক্ত করার জন্য কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ব্যবহৃত হয়।
- কোড রিডেবিলিটি: অবজেক্ট তৈরি এবং ধ্বংসের সময় নির্দিষ্ট কাজ পরিচালনা করতে আলাদা ফাংশন লেখার পরিবর্তে কনস্ট্রাক্টর ও ডেস্ট্রাক্টর ব্যবহার করে কোডকে আরও সংক্ষিপ্ত ও পরিষ্কার করা যায়।
সারসংক্ষেপ
- কনস্ট্রাক্টর অবজেক্ট তৈরি হওয়ার সময় ইনিশিয়ালাইজেশন করে এবং একাধিক কনস্ট্রাক্টর ওভারলোড করা সম্ভব।
- ডেস্ট্রাক্টর অবজেক্ট ধ্বংসের সময় ক্লিনআপ বা মেমোরি মুক্ত করে এবং একটিই ডেস্ট্রাক্টর থাকে।
- কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর প্রোগ্রামের মেমোরি এবং রিসোর্স ব্যবস্থাপনার ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে, যা প্রোগ্রামকে কার্যকর ও সুশৃঙ্খল করে তোলে।
ইনহেরিটেন্স (Inheritance) এবং পলিমরফিজম (Polymorphism) হলো C++ প্রোগ্রামিংয়ের অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি প্রধান ধারণা। এগুলো প্রোগ্রামে কোড পুনঃব্যবহারযোগ্যতা, সংহতি, এবং ডায়নামিক বৈশিষ্ট্য প্রদান করে, যা সফটওয়্যার ডেভেলপমেন্টকে সহজ করে তোলে।
ইনহেরিটেন্স (Inheritance)
ইনহেরিটেন্স হলো একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস (ডেরাইভড বা সাবক্লাস) আরেকটি ক্লাসের (বেস ক্লাস বা সুপারক্লাস) গুণাবলি এবং আচরণ (ডেটা মেম্বার এবং মেম্বার ফাংশন) অর্জন করে। ইনহেরিটেন্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং ক্লাসগুলির মধ্যে একটি সম্পর্ক তৈরি হয়।
উদাহরণ
ধরা যাক, আমরা একটি Vehicle বেস ক্লাস তৈরি করবো এবং তার থেকে Car এবং Bike নামের দুটি ডেরাইভড ক্লাস তৈরি করবো।
#include <iostream>
using namespace std;
// বেস ক্লাস
class Vehicle {
public:
string brand = "Generic Brand";
void honk() {
cout << "Beep! Beep!" << endl;
}
};
// ডেরাইভড ক্লাস
class Car : public Vehicle {
public:
int doors = 4;
};
// ডেরাইভড ক্লাস
class Bike : public Vehicle {
public:
bool hasCarrier = true;
};
int main() {
Car myCar;
Bike myBike;
cout << "Car Brand: " << myCar.brand << endl; // বেস ক্লাসের মেম্বার
myCar.honk(); // বেস ক্লাসের মেম্বার ফাংশন
cout << "Car Doors: " << myCar.doors << endl;
cout << "Bike Brand: " << myBike.brand << endl; // বেস ক্লাসের মেম্বার
myBike.honk(); // বেস ক্লাসের মেম্বার ফাংশন
cout << "Has Carrier: " << (myBike.hasCarrier ? "Yes" : "No") << endl;
return 0;
}
বর্ণনা:
- এখানে
Vehicleহলো বেস ক্লাস, যাCarএবংBikeক্লাসের জন্য ইনহেরিটেড হয়েছে। CarএবংBikeতাদের নিজস্ব মেম্বার এবং বৈশিষ্ট্য ধারণ করে, তবে তারাVehicleক্লাসেরbrandমেম্বার এবংhonk()মেথডও ব্যবহার করতে পারে।
ইনহেরিটেন্সের প্রকারভেদ
- সিঙ্গেল ইনহেরিটেন্স: একটি ক্লাস একটি মাত্র বেস ক্লাস থেকে ইনহেরিট করে।
- মাল্টিপল ইনহেরিটেন্স: একটি ক্লাস একাধিক বেস ক্লাস থেকে ইনহেরিট করে।
- মাল্টি-লেভেল ইনহেরিটেন্স: একটি ক্লাস আরেকটি ক্লাস থেকে ইনহেরিট করে, এবং সেই ক্লাসটি আরেকটি ক্লাস থেকে ইনহেরিটেড।
- হাইব্রিড ইনহেরিটেন্স: সিঙ্গেল, মাল্টিপল, এবং মাল্টি-লেভেল ইনহেরিটেন্সের সংমিশ্রণ।
পলিমরফিজম (Polymorphism)
পলিমরফিজম শব্দের অর্থ "একাধিক আকার ধারণ করা"। প্রোগ্রামিংয়ে এটি একটি বৈশিষ্ট্য, যার মাধ্যমে একই মেথড বা অপারেটর বিভিন্ন পরিস্থিতিতে ভিন্ন ভিন্ন আকারে কাজ করতে পারে। C++ এ পলিমরফিজম দুই প্রকার:
কাম্পাইল টাইম পলিমরফিজম:
- ফাংশন ওভারলোডিং: একই নামের বিভিন্ন ফাংশন, যাদের প্যারামিটারের সংখ্যা বা টাইপ আলাদা।
- অপারেটর ওভারলোডিং: অপারেটরকে বিভিন্ন ডেটা টাইপে ব্যবহার করা।
রানটাইম পলিমরফিজম:
- ফাংশন ওভাররাইডিং: ডেরাইভড ক্লাসে বেস ক্লাসের একটি ফাংশনের নতুন সংজ্ঞা দেওয়া।
- রানটাইম পলিমরফিজমের জন্য ভার্চুয়াল ফাংশন ব্যবহার করা হয়।
উদাহরণ: ফাংশন ওভারলোডিং (কাম্পাইল টাইম পলিমরফিজম)
#include <iostream>
using namespace std;
class Print {
public:
void display(int i) {
cout << "Integer: " << i << endl;
}
void display(double d) {
cout << "Double: " << d << endl;
}
void display(string str) {
cout << "String: " << str << endl;
}
};
int main() {
Print printer;
printer.display(5);
printer.display(3.14);
printer.display("Hello");
return 0;
}
বর্ণনা:
- এখানে
displayফাংশনটি একই নামে তিনবার সংজ্ঞায়িত করা হয়েছে, যা বিভিন্ন ডেটা টাইপের প্যারামিটার গ্রহণ করে।
উদাহরণ: ফাংশন ওভাররাইডিং এবং রানটাইম পলিমরফিজম
#include <iostream>
using namespace std;
class Animal {
public:
virtual void sound() {
cout << "Animal Sound" << endl;
}
};
class Dog : public Animal {
public:
void sound() override { // বেস ক্লাসের ফাংশন ওভাররাইড করা হয়েছে
cout << "Bark" << endl;
}
};
class Cat : public Animal {
public:
void sound() override {
cout << "Meow" << endl;
}
};
int main() {
Animal *a1 = new Dog();
Animal *a2 = new Cat();
a1->sound(); // Bark
a2->sound(); // Meow
delete a1;
delete a2;
return 0;
}
বর্ণনা:
- এখানে
Animalক্লাসেsoundনামে একটি ভার্চুয়াল ফাংশন রয়েছে।DogএবংCatক্লাসে এই ফাংশনটি ওভাররাইড করা হয়েছে। a1এবংa2পয়েন্টারগুলোAnimalটাইপ হলেও তারা তাদের নিজ নিজ ক্লাসেরsound()ফাংশন কল করছে, যা পলিমরফিজমের উদাহরণ।
ইনহেরিটেন্স এবং পলিমরফিজমের সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: ইনহেরিটেন্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়, কারণ বেস ক্লাসের বৈশিষ্ট্য ডেরাইভড ক্লাসে ব্যবহার করা যায়।
- কোড সংহতি ও সংগতি: ইনহেরিটেন্স এবং পলিমরফিজম প্রোগ্রামে সম্পর্কযুক্ত ক্লাসগুলির মধ্যে সংহতি ও সংগতি সৃষ্টি করে।
- ডায়নামিক বেহেভিয়ার: পলিমরফিজমের মাধ্যমে কোডে ডায়নামিক বেহেভিয়ার যোগ করা যায়, যা বিভিন্ন অবজেক্ট একভাবে ব্যবহার করার সুযোগ দেয়।
- সহজ রক্ষণাবেক্ষণ: কোডের সংহতি ও পুনঃব্যবহারযোগ্যতা বৃদ্ধি পেলে প্রোগ্রাম রক্ষণাবেক্ষণ ও আপডেট করা সহজ হয়।
সারসংক্ষেপ
- ইনহেরিটেন্স: বেস ক্লাস থেকে ডেরাইভড ক্লাসে বৈশিষ্ট্য এবং আচরণ অর্জন করার প্রক্রিয়া।
- পলিমরফিজম: একই নামের ফাংশন বা অপারেটর বিভিন্ন ডেটা টাইপ বা পরিস্থিতিতে ভিন্নভাবে কাজ করার ক্ষমতা।
- ফাংশন ওভারলোডিং এবং ফাংশন ওভাররাইডিং হলো পলিমরফিজমের উদাহরণ।
ইনহেরিটেন্স এবং পলিমরফিজম OOP এর শক্তিশালী বৈশিষ্ট্য, যা বড় প্রোগ্রাম ও সফটওয়্যার ডেভেলপমেন্টে কার্যকরী এবং পুনঃব্যবহারযোগ্য কোড রচনা করতে সহায়ক।
পয়েন্টার টু অবজেক্ট (Pointer to Object) এবং this পয়েন্টার (this Pointer) C++ প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ পয়েন্টার ধারণা, যা অবজেক্টের সাথে সরাসরি কাজ করার সুবিধা দেয়। নিচে এই দুটি বিষয়ে বিস্তারিত আলোচনা করা হলো।
পয়েন্টার টু অবজেক্ট (Pointer to Object)
পয়েন্টার টু অবজেক্ট হলো এমন একটি পয়েন্টার, যা কোনো নির্দিষ্ট ক্লাসের অবজেক্টের ঠিকানা ধারণ করে। সাধারণ পয়েন্টার যেমন কোনো ভ্যারিয়েবলের ঠিকানা ধারণ করতে পারে, তেমনিভাবে পয়েন্টার টু অবজেক্ট কোনো অবজেক্টের ঠিকানা ধরে রাখতে পারে এবং সেই অবজেক্টের ডেটা মেম্বার ও মেম্বার ফাংশন অ্যাক্সেস করতে পারে।
উদাহরণ: পয়েন্টার টু অবজেক্ট
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1; // Car ক্লাসের একটি অবজেক্ট তৈরি
car1.brand = "Toyota";
car1.year = 2020;
Car *ptr = &car1; // car1 অবজেক্টের ঠিকানা ধরে রাখা হলো
// পয়েন্টার ব্যবহার করে অবজেক্টের মেম্বার অ্যাক্সেস
ptr->displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
- এখানে
car1নামে একটি অবজেক্ট তৈরি করা হয়েছে এবংCar *ptrএর মাধ্যমেcar1এর ঠিকানা পয়েন্টারে ধরে রাখা হয়েছে। ptr->displayInfo()দিয়ে পয়েন্টার ব্যবহার করে অবজেক্টের মেম্বার ফাংশনdisplayInfo()অ্যাক্সেস করা হয়েছে।- পয়েন্টার টু অবজেক্ট ব্যবহার করে অবজেক্টের ডেটা মেম্বার বা মেম্বার ফাংশনে অ্যাক্সেস করতে
->(arrow) অপারেটর ব্যবহার করা হয়।
পয়েন্টার টু অবজেক্টের সুবিধা
১. অবজেক্টের মেমোরি অ্যাড্রেস অ্যাক্সেস: এটি সরাসরি অবজেক্টের ঠিকানা নিয়ে কাজ করতে পারে, যা মেমোরি ব্যবস্থাপনায় সহায়ক। ২. ডাইনামিক অবজেক্ট তৈরি: পয়েন্টার ব্যবহার করে ডাইনামিক্যালি অবজেক্ট তৈরি এবং পরিচালনা করা যায়। ৩. কয়েকটি অবজেক্ট একসাথে পরিচালনা: একই ক্লাসের একাধিক অবজেক্ট তৈরি করলে, তাদের পয়েন্টার ব্যবহার করে সহজেই পরিচালনা করা যায়।
this পয়েন্টার (this Pointer)
this পয়েন্টার হলো C++ এর একটি বিশেষ পয়েন্টার, যা প্রতিটি অবজেক্টের জন্য ক্লাসের ভিতরে স্বয়ংক্রিয়ভাবে তৈরি হয়। এটি বর্তমানে যে অবজেক্টে কাজ চলছে, তার ঠিকানা নির্দেশ করে। মেম্বার ফাংশনের ভিতরে this পয়েন্টার ব্যবহার করা হয়।
this পয়েন্টারের ব্যবহার
১. মেম্বার ভ্যারিয়েবল এবং প্যারামিটার ভ্যারিয়েবল পৃথক করা: যদি মেম্বার ভ্যারিয়েবল এবং ফাংশনের প্যারামিটার একই নামে হয়, তখন this পয়েন্টার ব্যবহার করে মেম্বার ভ্যারিয়েবলকে শনাক্ত করা যায়। ২. চেইনিং: ফাংশনের মধ্যে this পয়েন্টার ব্যবহার করে ফাংশন চেইনিং করা যায়।
উদাহরণ: this পয়েন্টার ব্যবহার করে মেম্বার অ্যাক্সেস
#include <iostream>
using namespace std;
class Car {
private:
string brand;
int year;
public:
// কনস্ট্রাক্টর
Car(string brand, int year) {
this->brand = brand; // this পয়েন্টার ব্যবহার করে মেম্বার অ্যাক্সেস
this->year = year;
}
// মেম্বার ফাংশন
void displayInfo() {
cout << "Brand: " << this->brand << ", Year: " << this->year << endl;
}
};
int main() {
Car car1("Toyota", 2020);
car1.displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
- এখানে
Carক্লাসের কনস্ট্রাক্টরের মধ্যেbrandএবংyearনামে দুটি মেম্বার ভ্যারিয়েবল এবং দুটি প্যারামিটার একই নামে রয়েছে। this->brandএবংthis->yearব্যবহার করে মেম্বার ভ্যারিয়েবলকে প্যারামিটার থেকে আলাদা করা হয়েছে।thisপয়েন্টার প্রতিটি অবজেক্টের জন্য আলাদা হয় এবং বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে।
পয়েন্টার টু অবজেক্ট এবং this পয়েন্টারের পার্থক্য
| বৈশিষ্ট্য | পয়েন্টার টু অবজেক্ট | this পয়েন্টার |
|---|---|---|
| উদ্দেশ্য | নির্দিষ্ট অবজেক্টের ঠিকানা ধরে রাখে | বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে |
| ব্যবহারের স্থান | ক্লাসের বাইরে থেকে অবজেক্ট অ্যাক্সেসে ব্যবহৃত হয় | শুধুমাত্র ক্লাসের ভিতরে ব্যবহৃত হয় |
| কাস্টম পয়েন্টার | হ্যাঁ, অবজেক্টের ঠিকানা ধরে রাখতে আলাদা পয়েন্টার তৈরি করা যায় | না, C++ নিজেই this পয়েন্টার তৈরি করে |
| অ্যাক্সেস স্টাইল | -> অপারেটরের মাধ্যমে মেম্বার অ্যাক্সেস | this-> ব্যবহার করে মেম্বার অ্যাক্সেস |
ডাইনামিক অবজেক্ট তৈরি এবং পয়েন্টার টু অবজেক্ট
C++ এ new অপারেটর ব্যবহার করে ডাইনামিক্যালি অবজেক্ট তৈরি করা যায় এবং পয়েন্টারের মাধ্যমে তা অ্যাক্সেস করা যায়।
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
Car(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
// ডাইনামিক্যালি অবজেক্ট তৈরি
Car *ptr = new Car("Honda", 2021);
// পয়েন্টার দিয়ে মেম্বার ফাংশন কল
ptr->displayInfo(); // Output: Brand: Honda, Year: 2021
delete ptr; // ডাইনামিক মেমোরি মুক্ত করা
return 0;
}
বর্ণনা:
new Car("Honda", 2021);ব্যবহার করে ডাইনামিক্যালিCarঅবজেক্ট তৈরি করা হয়েছে এবং এটিptrপয়েন্টারে সংরক্ষণ করা হয়েছে।delete ptr;স্টেটমেন্ট ব্যবহার করে মেমোরি মুক্ত করা হয়েছে।
সারসংক্ষেপ
- পয়েন্টার টু অবজেক্ট: একটি পয়েন্টার, যা নির্দিষ্ট অবজেক্টের ঠিকানা ধরে রাখে এবং
->অপারেটর ব্যবহার করে সেই অবজেক্টের মেম্বার অ্যাক্সেস করা যায়। thisপয়েন্টার: C++ এর একটি বিশেষ পয়েন্টার, যা বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে এবং সাধারণত মেম্বার ভ্যারিয়েবল এবং প্যারামিটার আলাদা করতে বা চেইনিংয়ের জন্য ব্যবহৃত হয়।
পয়েন্টার টু অবজেক্ট এবং this পয়েন্টার ব্যবহারে মেমোরি ব্যবস্থাপনা ও অবজেক্ট ম্যানিপুলেশন সহজ হয়, যা প্রোগ্রামিংয়ে আরও কার্যকর ও শক্তিশালী নিয়ন্ত্রণ প্রদান করে।
ফ্রেন্ড ফাংশন (Friend Function) এবং ফ্রেন্ড ক্লাস (Friend Class) C++ এ ব্যবহৃত বিশেষ ফিচার, যা ক্লাসের প্রাইভেট (private) এবং প্রোটেকটেড (protected) মেম্বারগুলোতে বাইরের ফাংশন বা অন্য ক্লাসের অ্যাক্সেসের অনুমতি দেয়। সাধারণত, ক্লাসের প্রাইভেট মেম্বারে সরাসরি বাইরের অ্যাক্সেস অনুমোদিত নয়, কিন্তু ফ্রেন্ড ফাংশন বা ফ্রেন্ড ক্লাসের মাধ্যমে সেই সীমাবদ্ধতা দূর করা যায়।
ফ্রেন্ড ফাংশন (Friend Function)
ফ্রেন্ড ফাংশন হলো একটি ফাংশন, যা কোনো ক্লাসের private এবং protected মেম্বারে সরাসরি অ্যাক্সেস করতে পারে। এই ফাংশনকে ফ্রেন্ড করার জন্য ক্লাসে friend কীওয়ার্ড ব্যবহার করে ঘোষণা করা হয়।
উদাহরণ: ফ্রেন্ড ফাংশন
#include <iostream>
using namespace std;
class Box {
private:
int width;
public:
Box(int w) : width(w) {} // কন্সট্রাক্টর
// ফ্রেন্ড ফাংশন ঘোষণা
friend void displayWidth(Box &b);
};
// ফ্রেন্ড ফাংশন ডেফিনেশন
void displayWidth(Box &b) {
cout << "Width: " << b.width << endl; // প্রাইভেট মেম্বারে অ্যাক্সেস
}
int main() {
Box myBox(10); // Box অবজেক্ট তৈরি
displayWidth(myBox); // ফ্রেন্ড ফাংশন কল
return 0;
}
বর্ণনা:
- এখানে
Boxক্লাসেরwidthনামের একটি প্রাইভেট মেম্বার আছে। displayWidth()নামে একটি ফাংশনBoxক্লাসের ফ্রেন্ড ফাংশন হিসেবে ঘোষণা করা হয়েছে।displayWidth()ফাংশনwidthমেম্বারে সরাসরি অ্যাক্সেস করতে সক্ষম, কারণ এটিBoxক্লাসের ফ্রেন্ড ফাংশন।
ফ্রেন্ড ফাংশনের বৈশিষ্ট্য
- অ্যাক্সেস স্পেসিফায়ার: ফ্রেন্ড ফাংশন ক্লাসের কোনো মেম্বার হতে হবে না এবং এটি
public,private, এবংprotectedমেম্বারে সরাসরি অ্যাক্সেস করতে পারে। - অবজেক্টের মাধ্যমে অ্যাক্সেস: ফ্রেন্ড ফাংশন ক্লাসের অবজেক্টের মাধ্যমে প্রাইভেট মেম্বার অ্যাক্সেস করে।
- নিমন্ত্রিত ফাংশন: একটি ফ্রেন্ড ফাংশন ক্লাসের বাইরে সংজ্ঞায়িত করা হয় এবং তাকে মেম্বার ফাংশনের মতো
::অপারেটর ব্যবহার করে কল করতে হয় না।
ফ্রেন্ড ক্লাস (Friend Class)
ফ্রেন্ড ক্লাস হলো একটি ক্লাস, যা আরেকটি ক্লাসের সমস্ত private এবং protected মেম্বারে সরাসরি অ্যাক্সেস করতে পারে। friend কীওয়ার্ড ব্যবহার করে একটি ক্লাসকে অন্য ক্লাসের ফ্রেন্ড করা যায়। ফ্রেন্ড ক্লাস মূলত তখনই ব্যবহৃত হয়, যখন দুটি ক্লাস ঘনিষ্ঠভাবে সম্পর্কিত হয় এবং একে অপরের তথ্য অ্যাক্সেসের প্রয়োজন হয়।
উদাহরণ: ফ্রেন্ড ক্লাস
#include <iostream>
using namespace std;
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// Car ক্লাসকে friend হিসেবে ঘোষণা করা
friend class Car;
};
class Car {
public:
void showHorsepower(Engine &e) {
cout << "Horsepower: " << e.horsepower << endl; // প্রাইভেট মেম্বারে অ্যাক্সেস
}
};
int main() {
Engine engine(300); // Engine অবজেক্ট তৈরি
Car car;
car.showHorsepower(engine); // Car ক্লাসের মাধ্যমে horsepower দেখানো
return 0;
}
বর্ণনা:
- এখানে
Engineক্লাসেhorsepowerনামে একটি প্রাইভেট মেম্বার আছে। Carক্লাসকেEngineক্লাসের ফ্রেন্ড ক্লাস হিসেবে ঘোষণা করা হয়েছে, যার ফলেCarক্লাসEngineএর প্রাইভেট মেম্বারhorsepower-এ অ্যাক্সেস করতে পারে।Carক্লাসেরshowHorsepower()মেম্বার ফাংশনengineঅবজেক্টেরhorsepowerমেম্বার অ্যাক্সেস করতে সক্ষম, কারণ এটি ফ্রেন্ড ক্লাস।
ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাসের ব্যবহারিক প্রয়োগ
- ক্লাসগুলির মধ্যে ঘনিষ্ঠ সম্পর্ক: যখন দুটি ক্লাসের মধ্যে ঘনিষ্ঠ সম্পর্ক থাকে এবং তাদের মধ্যে একটি ক্লাসের তথ্য আরেকটি ক্লাস ব্যবহার করতে হয়, তখন ফ্রেন্ড ক্লাস ব্যবহার করা হয়।
- ডেটা হাইডিং বজায় রেখে অ্যাক্সেস: ফ্রেন্ড ফাংশন বা ফ্রেন্ড ক্লাস ব্যবহার করে প্রাইভেট এবং প্রোটেকটেড ডেটা হাইডিং বজায় রেখে নির্দিষ্ট ফাংশন বা ক্লাসকে অ্যাক্সেস অনুমতি দেওয়া যায়।
- অপারেটর ওভারলোডিং: বিশেষ ক্ষেত্রে অপারেটর ওভারলোডিংয়ের সময় ফ্রেন্ড ফাংশন ব্যবহার করা হয়, যাতে বাইরের অপারেটর ফাংশন ক্লাসের প্রাইভেট মেম্বারে অ্যাক্সেস করতে পারে।
ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাস ব্যবহারের কিছু সতর্কতা
- ডেটা এনক্যাপসুলেশন ক্ষতি: ফ্রেন্ড ফাংশন বা ফ্রেন্ড ক্লাস ব্যবহার করলে ক্লাসের ডেটা এনক্যাপসুলেশন নীতি কিছুটা ক্ষতিগ্রস্ত হতে পারে, কারণ বাইরের ফাংশন বা ক্লাস প্রাইভেট ডেটা অ্যাক্সেস করতে পারে।
- অতিরিক্ত ফ্রেন্ডশিপ: ক্লাসে অতিরিক্ত ফ্রেন্ড ফাংশন বা ক্লাস যোগ করা ডেটা সুরক্ষার সমস্যা সৃষ্টি করতে পারে। তাই শুধুমাত্র প্রয়োজনীয় ফাংশন বা ক্লাসকেই ফ্রেন্ড করতে হবে।
- মডুলারিটি বজায় রাখা: ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাস ব্যবহার করার সময় ক্লাসের মডুলারিটি বজায় রাখতে হবে এবং অনাবশ্যক ফ্রেন্ডশিপ এড়াতে হবে।
সারসংক্ষেপ
- ফ্রেন্ড ফাংশন হলো এমন একটি ফাংশন, যা ক্লাসের প্রাইভেট এবং প্রোটেকটেড মেম্বারে সরাসরি অ্যাক্সেস করতে পারে।
- ফ্রেন্ড ক্লাস হলো একটি ক্লাস, যা অন্য একটি ক্লাসের সমস্ত প্রাইভেট এবং প্রোটেকটেড মেম্বারে সরাসরি অ্যাক্সেস করতে পারে।
- ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাস বিশেষ ক্ষেত্রে ব্যবহৃত হয়, যখন দুটি ক্লাসের মধ্যে ঘনিষ্ঠ সম্পর্ক থাকে এবং নির্দিষ্ট মেম্বারে অ্যাক্সেসের প্রয়োজন হয়।
ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাস C++ এ ডেটা অ্যাক্সেসibilটি নিয়ন্ত্রণের জন্য এবং নির্দিষ্ট পরিস্থিতিতে ডেটা হাইডিং বজায় রেখে প্রাইভেট মেম্বারে অ্যাক্সেসের সুবিধার্থে ব্যবহৃত হয়।
Read more