Operator Overloading | ইউনারি অপারেটর | পর্ব ২

গত পর্বে (Operator Overloading – বেসিক ধারণা) দেখেছি কিভাবে বাইনারি অপারেটর ওভারলোড করা যায়। বাইনারি অপারেটর ওভারলোড এর ক্ষেত্রে আর্গুমেন্ট হয় একটা, কারণ অপারেটর এর বাম পাশের অপারেন্ডটি ইম্লিসিটলি this পয়েন্টার এর মাধ্যমে পাস হয়। এর ডান পাশের অপারেন্ড পাস হয় আর্গুমেন্ট হিসেবে।

এখন আসি ইউনারি অপারেটর কথায়। ইউনারি অপারেটর (যেমন ++ , – – ) এ অপারেন্ড থাকে একটা। তারমানে যখন একটি মাত্র অপারেন্ড ফাংশান কল করে তখন সেটিই ইম্লিসিটলি this পয়েন্টার এর মাধ্যমে পাস হয়। এই কারণে ইউনারি অপারেটর ওভারলোডিং এর সময় সাধারণত কোন আর্গুমেন্ট থাকে না।

কথা না বাড়িয়ে নিচের কোড দেখা যাক

 

এখানে operator++() ফাংশানে কোন আর্গুমেন্ট নেই। কেননা মেইন থেকে যখন ++b1 কল হয় তখন operator++() এ b1 ইম্লিসিটলি পাস হয় এবং খেয়াল করে দেখুন ফাংশান থেকে *this পয়েন্টারটিকেই আবার রিটার্ণ করা হয়েছে। এখানে b1 অবজেক্ট এর length, width, height এর মান ১ বাড়িয়ে দেওয়া হয়েছে।

প্রথমে b1 অবজক্ট এর length = 2, width = 3, height = 4। এবং আউটপুট আসবে 24 ।

++b1 স্টেটমেন্ট এর পরে b1 এর নতুন length, width, height হবে 3,4 ও 5। এবং আউটপুট দেখাবে 60 ।

খুবই সহজ কাজ। কিন্তু কেউ কেউ হয়ত ভাবছেন প্রি-ইনক্রিমেন্ট না করে পোস্ট ইনক্রিমেন্ট করলে কি হয়। ++b1 এর পরিবর্তে b1++ লিখে কোড কম্পাইল করার চেষ্টা করুন।

এরর দেখায় তাইতো? এরর টা এমন দেখানোর কথা

error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]

কিন্তু কি মুশকিল আমি তো operator++() ডিক্লিয়ার করেছি, তাহলে করি নাই বলছে কেন!

পোস্ট ইনক্রিমেন্ট বোঝানোর জন্য ফাংশান এর চেহারায় একটু পরিবর্তন আনতে হবে।

পরিবর্তনটা কি খুজে পেয়েছেন? খুবই সূক্ষ পরিবর্তন। একটা ডামি আর্গুমেন্ট নিতে হবে (এখানে যেমন int x নেওয়া হয়েছে)। এই আর্গুমেন্ট দিলে কম্পাইলার এরর হবে না, বুঝতে পারবে এটি পোস্ট ইনক্রিমেন্ট। (এখনও এরর হলে class Box এর মধ্যে ফাংশান সিগনেচার এর আর্গুমেন্ট যোগ করতে ভুলে গেছেন।) এখন কেউ কি বলতে পারেন এই উটকো, ডামি আর্গুমেন্ট x এর ভ্যালু কত?

প্রিন্ট করে দেখুন কত দেখায়। এখন প্রি-ডিক্রিমেন্ট ও পোস্ট-ডিক্রিমেন্ট এর কোডটা নিজে নিজে করে ফেলুন।

ধন্যবাদ।

Print Friendly

মন্তব্য করুন

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