এখানে আমরা দেখব C++-এ কখন নিজস্ব অ্যাসাইনমেন্ট অপারেটর তৈরি করতে হয়। যদি একটি ক্লাসে কোনো পয়েন্টার (pointer) না থাকে, তবে অ্যাসাইনমেন্ট অপারেটর এবং কপি কনস্ট্রাক্টর (copy constructor) তৈরি করার দরকার নেই। C++ কম্পাইলার প্রতিটি ক্লাসের জন্য ডিফল্ট কপি কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর তৈরি করে। যদি ডিফল্ট অপারেটরগুলো পর্যাপ্ত না হয়, তবে নিজস্ব অ্যাসাইনমেন্ট অপারেটর তৈরি করতে হয়।
উদাহরণ
#include<iostream> using namespace std; class MyClass { //no user defined assignment operator or copy constructor is present int *ptr; public: MyClass (int x = 0) { ptr = new int(x); } void setValue (int x) { *ptr = x; } void print() { cout << *ptr << endl; } }; main() { MyClass ob1(50); MyClass ob2; ob2 = ob1; ob1.setValue(100); ob2.print(); }আউটপুট
100
main() ফাংশনে setValue() মেথড ব্যবহার করে ob1-এর জন্য x-এর মান সেট করা হয়েছে। এটি ob2-এও প্রতিফলিত হয়েছে; এই ধরনের অপ্রত্যাশিত পরিবর্তন সমস্যা সৃষ্টি করতে পারে। কোনো ইউজার-ডিফাইনড অ্যাসাইনমেন্ট অপারেটর না থাকায় কম্পাইলার একটি তৈরি করে। এখানে এটি RHS-এর ptr কে LHS-এ কপি করে। তাই দুটি পয়েন্টারই একই লোকেশনকে নির্দেশ করছে।
এই সমস্যা সমাধানের জন্য দুটি পদ্ধতি অনুসরণ করা যায়। অথবা ডামি প্রাইভেট অ্যাসাইনমেন্ট অপারেটর তৈরি করে অবজেক্ট কপি বাধা দেওয়া যায়, অথবা নিজস্ব অ্যাসাইনমেন্ট অপারেটর তৈরি করা যায়।
উদাহরণ
#include<iostream> using namespace std; class MyClass { //no user defined assignment operator or copy constructor is present int *ptr; public: MyClass (int x = 0) { ptr = new int(x); } void setValue (int x) { *ptr = x; } void print() { cout << *ptr << endl; } MyClass &operator=(const MyClass &ob2){ // Check for self assignment if(this != &ob2) *ptr = *(ob2.ptr); return *this; } }; main() { MyClass ob1(50); MyClass ob2; ob2 = ob1; ob1.setValue(100); ob2.print(); }আউটপুট
50
এখানে অ্যাসাইনমেন্ট অপারেটর ডিপ কপি (deep copy) তৈরি করে এবং আলাদা পয়েন্টার সংরক্ষণ করে। একটি বিষয় খেয়াল রাখতে হবে। সেলফ-রেফারেন্স (self-reference) চেক করতে হবে, অন্যথায় অ্যাসাইনমেন্ট অপারেটর বর্তমান অবজেক্টের মান পরিবর্তন করতে পারে।