সমস্যা বিবরণ
C/C++-এ একটি স্ট্রাকচার (ক্লাস C++-এ) ভেরিয়েবলকে একই টাইপের অন্য ভেরিয়েবলে অ্যাসাইন করা যায়। স্ট্রাকচার ভেরিয়েবল অ্যাসাইন করার সময় সব মেম্বার কপি হয়। প্রশ্ন হলো স্ট্রাকচারে অ্যারে থাকলে কী হয়?
মূল পয়েন্ট: অ্যারে মেম্বার শ্যালো কপি হয় না; কম্পাইলার অটোমেটিক্যালি অ্যারে মেম্বারের জন্য **ডিপ কপি (Deep Copy)** করে। নিচের প্রোগ্রামে struct test-এ char str1[20] অ্যারে মেম্বার আছে। st1 কে st2-তে অ্যাসাইন করলে st2-র একটি নতুন অ্যারে কপি পাওয়া যায়। তাই st1-এর str[] মডিফাই করলে st2 পরিবর্তিত হয় না।
C++ কোড উদাহরণ
# include <iostream>
# include <string.h>
using namespace std;
struct test {
char str1[20];
};
int main() {
struct test st1, st2;
strcpy(st1.str1, "Tutorial Point");
st2 = st1;
st1.str1[0] = 'X';
st1.str1[1] = 'Y';
/* ডিপ কপি হওয়ায় দুটি অ্যারে আলাদা */
cout << "st1's str = " << st1.str1 << endl;
cout << "st2's str = " << st2.str1 << endl;
return 0;
}
আউটপুট
st1's str = XYtorial Point st2's str = Tutorial Point
সুতরাং, C++ ক্লাসে অ্যারে মেম্বারের জন্য কপি কনস্ট্রাক্টর বা অ্যাসাইনমেন্ট অপারেটর লিখতে হয় না, কারণ ডিফল্ট বিহেভিয়রই ডিপ কপি।