Operator Overloading | বেসিক ধারণা | পর্ব ১

Operator Overloading সি++ এর অন্যতম একটি শক্তিশালী ফিচার। সি++ এ ফাংশন ওভারলোডিং এর মত অপারেটরও ওভারলোড করা যায়। আপনি যদি সি++ এর বেসিক জিনিসপত্র ইতিমধ্যেই জানেন তাহলে আমি আশা করছি এরিথমেটিক, বিটওয়াইজ, লজিকাল, এসাইনমেন্ট ইত্যাদি অপারেটরের সাথে আপনি পরিচিত। এগুলো সি++ এর বিল্ট-ইন অপারেটর। এই পর্বে আমরা দেখব কিভাবে একটি নির্দিষ্ট ক্লাস এর জন্য সি++ এর ডিফল্ট অপারেটরকে ওভারলোড করে, প্রোগ্রামার এর ইচ্ছামত ফাংশানালিটি যোগ করা যায়।

Operator Overloading শেখার আগে খুব সহজ একটা প্রোগ্রাম দেখা যাক।

খুবই সহজ প্রোগ্রাম। একটা কন্সট্রাক্টর দিয়ে Box ক্লাস এর length, width, height ইনিশালাইজ করা হয়েছে। আর একটা ফাংশান getVolume() দিয়ে বাক্সের আয়তন বের করার প্রোগ্রাম করা হয়েছে।

এরপর মেইন এর মধ্যে Box ক্লাস এর দুইটা অব্জেক্ট তৈরি করা হয়েছে এবং তাদের ভলিউম প্রিন্ট করা হয়েছে। আউটপুট আসবে ২৪ ও ১২।

এখন যদি আপনাকে বলি আর একটা বক্স অব্জেক্ট তৈরি করতে এবং নতুন বক্সটি হবে আগের দুইটি বক্সের দৈর্ঘ, প্রস্থ ও উচ্চতার যোগফল। তাহলে আপনি হয়ত করে নিচের মত একটি ফাংশান লিখে ফেলবেন।

 

এখানে b3 নাম এ নতুন একটা বক্স অবজক্ট নেওয়া হয়েছে। এবং b3 = b1.add(b2); এই স্টেটমেন্ট দিয়ে add() ফাংশান কল করা হয়েছে, যেটা b1 এবং b2 এর দৈর্ঘ, প্রস্থ ও উচ্চতা যোগ করে temp নামক আর একটা লোকাল বক্স অবজেক্ট এ এসাইন করা হয়েছে। এরপর temp অবজেক্টিকে রিটার্ণ করা হয়েছে এবং b3 অবজেক্ট এ এসাইন করা হয়েছে। সবশেষে b3 এর আয়তন প্রিন্ট করা হয়েছে।

আপনি চাইলে b3 অবজেক্ট না নিয়ে cout << b1.add(b2).getVolume() << endl; লিখেও কাজটি করতে পারতেন। দুই ক্ষেত্রেই আউটপুট হবে ১৪০।

সো ফার সো গুড। 🙂

কিন্তু একটা বিষয় লক্ষ্য করে দেখেন আমরা সাধারণ যোগ করার সময় যেমন int a = 3 + 5; লিখতে পারি, বক্স এর ক্ষেত্রে যদি b3 = b1.add(b2) এভাবে না লিখে এভাবে লেখা যেত

b3 = b1  + b2;

খুব ভাল হত তাই না?

হ্যা আমি এখন Operator Overloading নিয়েই কথা বলছি। আপনি চাইলে add()  ফাংশান এর পরিবর্তে + (প্লাস) সাইন ব্যবহার করতে পারেন।

তার জন্য আপনার add() ফাংশানটিকে সামান্য পরিবর্তন করতে হবে। এখন add এর পরিবর্তে লিখতে হবে operator+ । operator এর পরে যে চিহ্নটি ব্যবহার করব সেটিই অভারলোড  হবে। নতুন ফাংশানটি একবার দেখে নিই

কি মজা তাই না, শুধু add এর বদলে operator+ দিলেই খেল খতম।

এখন আমরা মেইন ফাংশনে b3 = b1.add(b2) এর পরিবর্তে b3 = b1  + b2; লিখতে পারব। আমি পুরো কোডটা দেওওার আগে আপনি একবার চেষ্টা করে দেখুন সব ঠিক আছে কিনা।

এখন আপনি ভাবতে পারেন আমি তো operator+(Box b2) এখানে একটি মাত্র আর্গুমেন্ট নিয়েছি। তাহলে b1 + b2 হচ্ছে কিভাবে। মজার ব্যপারটা এখানেই, আমরা যখন b1 + b2 লিখি তখন + সাইন এর বাম পাশের অপারেন্ড (এই ক্ষেত্রে b1) অবজক্টি  operator+ কে কল করে এবং ইম্লিসিটলি this পয়েন্টার এর মাধ্যমে পাস হয়। এবং ডান পাশের অপারেন্ড (b2) আর্গুমেন্ট আকারে পাস হয়। এই কারনে বাইনারি অপারেটর এর ক্ষেত্রে আর্গুমেন্ট হয় একটা। তাহলে ইউনারি অপারেটরে কয়টি আর্গুমেন্ট হবে? চিন্তা ভাবনা করে দেখুন।

b3 = b1  + b2 // b1 passed implicitly through this pointer

operator+() থেকে অবজেক্ট রিটার্ণ করা হয়েছে কারন এখানে আমরা আর একটি অবজেক্ট এর মধ্যে এসাইন করছি। তাছাড়া আর একটি বড় সুবিধা হলে এখন চাইলে আমরা নিচের মত করে লিখতে পারি।

cout << (b1+b2).getVolume() << endl; // same output 140

তাহলে পুরো কোডটি দেখা যাক

 

বাক্স নিয়ে এতক্ষন প্যাচাল শুনতে শুনতে যদি আপনার মাথায় বাক্স ঘুরপাক খায় তাহলে অর্ণব এর এই গানটা শুনতে শুনতে আর একবার কোডটি নিজে নিজে লিখে ফেলুন। ধন্যবাদ।

বাক্সে বাক্সে বন্দী বাক্স
বাক্সে বাক্সে বন্দী বাসা
বাক্স দিয়ে বাক্স গড়া
বাক্সতে সব স্বপ্ন আশা ।।

অপারেটর ওভারলোডিং এর উপর সকল পোস্ট পেতে ক্লিক করুন।

Print Friendly, PDF & Email

“Operator Overloading | বেসিক ধারণা | পর্ব ১” এ একটি মন্তব্য

মন্তব্য করুন

আপনার ই-মেইল এ্যাড্রেস প্রকাশিত হবে না। * চিহ্নিত বিষয়গুলো আবশ্যক।