C++-এ const_cast এর কাজ দেখানো হলো এই টাস্ক।
const_cast হল টাইপ কাস্টিং অপারেটরগুলোর একটি। এটি যেকোনো অবজেক্টের কনস্ট্যান্ট ভ্যালু পরিবর্তন করতে ব্যবহৃত হয় অথবা বলা যায় এটি যেকোনো অবজেক্টের কনস্ট্যান্ট প্রকৃতি দূর করতে ব্যবহৃত হয়।
const_cast এমন প্রোগ্রামগুলিতে ব্যবহার করা যেতে পারে যেগুলোতে যেকোনো অবজেক্ট থাকে যার কনস্ট্যান্ট ভ্যালু আছে যা কখনো কখনো পরিবর্তন করা প্রয়োজন পড়ে।
সিনট্যাক্স
সিনট্যাক্স নিচের মতো −
const_cast<type name>(expression)
উদাহরণ
Input: x = 50 const int* y = &x cout<<"old value is"<<*y<<"\n"; int* z=const_cast<int *>(y); *z=100; cout<<"new value is"<<*y; Output: old value is 50 new value is 100
উপরের উদাহরণটি const_cast-এর বেসিক ব্যবহার দেখাচ্ছে। এখানে আমরা একটি কনস্ট্যান্ট ভেরিয়েবল ”x” ডিক্লেয়ার করলাম টাইপ int যার ভ্যালু ৫০ এবং একটি কনস্ট্যান্ট পয়েন্টার “y” টাইপ int যা “x” ভেরিয়েবলকে পয়েন্ট করে।
const_cast ব্যবহার করার জন্য একটি থার্ড পয়েন্টার তৈরি করতে হবে, এবং এখানে আমরা ”z” নামে পয়েন্টার তৈরি করলাম একই ডেটা টাইপের, অর্থাৎ int।
তাই যখন আমরা আমাদের কনস্ট্যান্ট পয়েন্টার “y”, যা কনস্ট্যান্ট ভেরিয়েবল “x”-কে পয়েন্ট করে, const_cast-এ পাস করি, এবং পয়েন্টার z-এ একটি ভ্যালু অ্যাসাইন করি, আমরা আমাদের কনস্ট্যান্ট পয়েন্টার “y”-র ভ্যালু পরিবর্তন করতে পারি।
এভাবে আমরা const_cast ব্যবহার করে কনস্ট্যান্ট ভ্যালুটিকে ৫০ থেকে ১০০-এ পরিবর্তন করতে পেরেছি।
যদি আমরা const_cast ছাড়া “x”-র ভ্যালু পরিবর্তন করার চেষ্টা করি যা পয়েন্টার “y” পয়েন্ট করছে, তবে নিচের এরর দেখা যাবে-“assignment of read-only location”
নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতি −
- প্রথমে একটি কনস্ট্যান্ট ভেরিয়েবল তৈরি করুন টাইপ int এবং এতে একটি উপযুক্ত সাইজ দিন, ধরুন “a” এবং এর ভ্যালু ২০।
- তারপর একটি কনস্ট্যান্ট পয়েন্টার তৈরি করুন, ধরুন “b” একই ডেটা টাইপের এবং এটিকে আমাদের কনস্ট্যান্ট ভেরিয়েবল “a”-র অ্যাড্রেস অ্যালোকেট করুন।
- তারপর একটি থার্ড পয়েন্টার তৈরি করুন, ধরুন “c” ডেটা টাইপ int const_cast ব্যবহার করার জন্য।
- এখন আমাদের কনস্ট্যান্ট পয়েন্টার “b”-কে const_cast-এ পাস করুন এবং এটিকে আমাদের পয়েন্টার “c”-এর সমান রাখুন।
- শেষে আমাদের পয়েন্টার “c”-র ভ্যালুতে পরিবর্তন আনুন। এটি অটোমেটিক্যালি আমাদের কনস্ট্যান্ট পয়েন্টার “b”-যে পয়েন্ট করছে সেখানে ভ্যালু পরিবর্তন করবে।
এলগরিদম
Start Step 1 -> In function main() Declare a constant int a=20 Declare a constant pointer int* b=&a Declare a pointer int*c = const_cast<int *>(b) Assign *c=40 Stop
উদাহরণ
#include <iostream> using namespace std; int main() { const int a = 20; const int* b = &a; cout<<"old value is"<<*b<<"\n"; int* c=const_cast<int *>(b); *c=40; cout<<"new value is"<<*b; return 0; }
আউটপুট
যদি উপরের কোডটি রান করি তবে নিচের আউটপুট জেনারেট হবে −
old value is 20 new value is 40
এখানে, কনস্ট্যান্ট পয়েন্টার “b” কনস্ট্যান্ট ভেরিয়েবল “a”-কে পয়েন্ট করছে যার ভ্যালু=২০ যা অপরিবর্তনশীল। কিন্তু একটি থার্ড নন-কনস্ট্যান্ট পয়েন্টার “c” একই ডেটা টাইপের তৈরি করে এবং const_cast ব্যবহার করে আমরা সেই কনস্ট্যান্ট ভ্যালু পরিবর্তন করতে পারলাম।
পয়েন্টার “c”-র ভ্যালু পরিবর্তনের ফলে কনস্ট্যান্ট পয়েন্টার “b”-যে পয়েন্ট করছে সেটির কনস্ট্যান্ট ভ্যালু ২০ পরিবর্তন হয়েছে। তাই const_cast ব্যবহার করার আগে আউটপুট ভ্যালু ছিল ২০ এবং ব্যবহার করার পর আউটপুট ভ্যালু ৪০।
const_cast-এর অন্যান্য ব্যবহার
যেকোনো প্রোগ্রামে, const_cast ব্যবহার করা যেতে পারে কনস্ট্যান্ট ডেটা অন্য একটি ফাংশনে পাস করার জন্য যা কনস্ট্যান্ট ডেটা এক্সেপ্ট করে না।
উদাহরণ
#include <iostream> using namespace std; int change(int* p2) { return (*p2 * 10); } int main() { const int num = 100; const int *p = # int *p1 = const_cast <int *>(p); cout << change(p1); return 0; }
আউটপুট
যদি উপরের কোডটি রান করি তবে নিচের আউটপুট জেনারেট হবে −
1000
উপরের প্রোগ্রামটি দেখাচ্ছে কিভাবে আমরা const_cast ব্যবহার করে ১০০ কনস্ট্যান্ট ভ্যালু change() ফাংশনে পাস করতে পারলাম যা কোনো কনস্ট্যান্ট ডেটা রিসিভ করে না।
change() ফাংশনটি ভ্যালুটি রিসিভ করে এটিকে ১০ দিয়ে গুন করে এবং মেইন() ফাংশনে রিটার্ন করে যা ফাইনাল আউটপুট জেনারেট করে, সেটি ১০০০।
যদি আমরা একই প্রোগ্রামটি const_cast ছাড়া চালিয়ে কনস্ট্যান্ট ভ্যালুটি সরাসরি change() ফাংশনে পাস করার চেষ্টা করি, তবে এটি এরর দেখাবে।