এখানে আমরা দেখব সি++-এ কপি কনস্ট্রাক্টর কীভাবে বাস্তবায়ন করা হয়। তার আগে জানতে হবে কপি কনস্ট্রাক্টর কী।
কপি কনস্ট্রাক্টর হলো একটি কনস্ট্রাক্টর যা একটি অবজেক্ট তৈরি করে একই ক্লাসের অন্য একটি পূর্বে তৈরি অবজেক্ট দিয়ে ইনিশিয়ালাইজ করে। কপি কনস্ট্রাক্টর ব্যবহৃত হয়:
- একই টাইপের অন্য একটি অবজেক্ট থেকে একটি অবজেক্ট ইনিশিয়ালাইজ করতে।
- একটি অবজেক্ট কপি করে ফাংশনের আর্গুমেন্ট হিসেবে পাস করতে।
- একটি অবজেক্ট কপি করে ফাংশন থেকে রিটার্ন করতে।
যদি কোনো ক্লাসে কপি কনস্ট্রাক্টর ডিফাইন না করা হয়, তবে কম্পাইলার স্বয়ংক্রিয়ভাবে একটি ডিফাইন করে। যদি ক্লাসে পয়েন্টার ভেরিয়েবল থাকে এবং ডাইনামিক মেমরি অ্যালোকেশন থাকে, তবে কপি কনস্ট্রাক্টর থাকা বাধ্যতামূলক। কপি কনস্ট্রাক্টর-এর সবচেয়ে সাধারণ ফর্ম:
classname (const classname &obj) {
// কনস্ট্রাক্টরের বডি
}
এখানে obj হলো একটি রেফারেন্স যা অন্য একটি অবজেক্ট ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
উদাহরণ ১
#include <iostream>
using namespace std;
class Line {
public:
int getLength(void);
Line(int len); // সাধারণ কনস্ট্রাক্টর
Line(const Line &obj); // কপি কনস্ট্রাক্টর
~Line(); // ডেস্ট্রাক্টর
private:
int *ptr;
};
// মেম্বার ফাংশন ডেফিনিশন
Line::Line(int len) {
cout << "Normal constructor allocating ptr" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj) {
cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr; // মান কপি
}
Line::~Line(void) {
cout << "Freeing memory!" << endl;
delete ptr;
}
int Line::getLength(void) {
return *ptr;
}
void display(Line obj) {
cout << "Length of line : " << obj.getLength() << endl;
}
int main() {
Line line(10);
display(line);
return 0;
}
আউটপুট
Normal constructor allocating ptr Copy constructor allocating ptr. Length of line : 10 Freeing memory! Freeing memory!
একই উদাহরণ কিন্তু ছোট্ট পরিবর্তন করে একই টাইপের বিদ্যমান অবজেক্ট থেকে আরেকটি অবজেক্ট তৈরি করা:
উদাহরণ ২
#include <iostream>
using namespace std;
class Line {
public:
int getLength(void);
Line(int len);
Line(const Line &obj);
~Line();
private:
int *ptr;
};
Line::Line(int len) {
cout << "Normal constructor allocating ptr" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj) {
cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr;
}
Line::~Line(void) {
cout << "Freeing memory!" << endl;
delete ptr;
}
int Line::getLength(void) {
return *ptr;
}
void display(Line obj) {
cout << "Length of line : " << obj.getLength() << endl;
}
int main() {
Line line1(10);
Line line2 = line1; // এটিরও কপি কনস্ট্রাক্টর কল হবে
display(line1);
display(line2);
return 0;
}
আউটপুট
Normal constructor allocating ptr Copy constructor allocating ptr. Copy constructor allocating ptr. Length of line : 10 Freeing memory! Copy constructor allocating ptr. Length of line : 10 Freeing memory! Freeing memory! Freeing memory!