এখানে আমরা দেখব কখন আমাদের C++ এ নিজস্ব অ্যাসাইনমেন্ট অপারেটর তৈরি করতে হবে। যদি কোনো ক্লাসে কোনো পয়েন্টার না থাকে, তাহলে আমাদের অ্যাসাইনমেন্ট অপারেটর এবং কপি কনস্ট্রাক্টর তৈরি করতে হবে না। 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() ফাংশনে, আমরা ob1 এর জন্য setValue() পদ্ধতি ব্যবহার করে x এর মান সেট করেছি। মান অবজেক্ট ob2 এও প্রতিফলিত হয়; এই ধরনের অপ্রত্যাশিত পরিবর্তন কিছু সমস্যা তৈরি করতে পারে। কোন ব্যবহারকারী সংজ্ঞায়িত অ্যাসাইনমেন্ট অপারেটর নেই, তাই কম্পাইলার একটি তৈরি করে। এখানে এটি LHS থেকে RHS-এর ptr কপি করে। সুতরাং উভয় পয়েন্টার একই অবস্থানে নির্দেশ করছে।
এই সমস্যা সমাধানের জন্য, আমরা দুটি পদ্ধতি অনুসরণ করতে পারি। হয় আমরা অবজেক্ট কপি সীমাবদ্ধ করার জন্য ডামি প্রাইভেট অ্যাসাইনমেন্ট অপারেটর তৈরি করতে পারি, অন্যথায় আমাদের নিজস্ব অ্যাসাইনমেন্ট অপারেটর তৈরি করতে পারি।
উদাহরণ
#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
এখানে অ্যাসাইনমেন্ট অপারেটরটি গভীর অনুলিপি তৈরি করতে এবং পৃথক পয়েন্টার সংরক্ষণ করতে ব্যবহৃত হয়। একটা জিনিস আমাদের মাথায় রাখতে হবে। আমাদের স্ব-রেফারেন্স পরীক্ষা করতে হবে অন্যথায় অ্যাসাইনমেন্ট অপারেটর বর্তমান বস্তুর মান পরিবর্তন করতে পারে।