আপনি এটি তিনটি ভাষার সাথে ট্যাগ করেছেন, এবং উত্তরগুলি তিনটির মধ্যে সত্যই আলাদা। সি ++ এর কম-বেশি আলোচনা সি কাস্তের আলোচনাও বোঝায় এবং এটি (আরও বা কম) চতুর্থ উত্তর দেয়।
যেহেতু এটিই আপনি স্পষ্টভাবে উল্লেখ করেন নি, তাই আমি সি দিয়ে শুরু করব সি কাস্তগুলিতে বেশ কয়েকটি সমস্যা রয়েছে। একটি হ'ল তারা বিভিন্ন ধরণের কিছু করতে পারে। কিছু ক্ষেত্রে, ালাই সংকলককে বলার ব্যতীত কিছুই করেনি (সংক্ষেপে): "চুপ কর, আমি জানি আমি কী করছি" - অর্থাৎ এটি নিশ্চিত করে যে আপনি এমন কোনও রূপান্তর করেন যা সমস্যার কারণ হতে পারে, সংকলক আপনাকে এই সম্ভাব্য সমস্যা সম্পর্কে সতর্ক করবে না। শুধু উদাহরণস্বরূপ char a=(char)123456;
,। এই প্রয়োগের সঠিক ফলাফল সংজ্ঞায়িত করা হয়েছে (এর আকার এবং স্বাক্ষরের উপর নির্ভর করেchar
), এবং বরং অদ্ভুত পরিস্থিতিতে বাদে, সম্ভবত দরকারী নয়। সি কাস্টগুলি কেবল সংকলনের সময় ঘটে এমন কিছু হয় (যেমন, আপনি কেবল কিছু সংকলককে কিছু উপাত্তের ব্যাখ্যা / চিকিত্সা কীভাবে করবেন) বা রান সময় সময়ে ঘটে এমন কিছু (যেমন, ডাবল থেকে প্রকৃত রূপান্তর দীর্ঘ)
সি ++ কিছু সংখ্যক "নতুন" কাস্ট অপারেটর যুক্ত করে কিছুটা হলেও এর সাথে মোকাবিলা করার চেষ্টা করে, যার প্রত্যেকটি কেবলমাত্র একটি সি কাস্টের সক্ষমতার একটি উপসেটে সীমাবদ্ধ। এটি দুর্ঘটনাক্রমে এমন রূপান্তর করতে আরও কঠিন করে তোলে যা আপনি সত্যিকার অর্থে করেন নি - আপনি যদি কেবল কোনও বস্তুর উপর দৃ const়তা ফেলে দিতে চান তবে আপনি ব্যবহার করতে পারেন const_cast
এবং নিশ্চিত হন যে এটিই কেবল প্রভাবিত করতে পারে কিনা তা হ'ল একটি বস্তু হয় const
, volatile
না। উল্টোদিকে, static_cast
প্রভাবিত করার একটি বস্তু কিনা মঞ্জুরিপ্রাপ্ত নয় const
বাvolatile
। সংক্ষেপে, আপনার বেশিরভাগ একই ধরণের ক্ষমতা রয়েছে তবে সেগুলিকে শ্রেণিবদ্ধ করা হয়েছে যাতে একটি কাস্ট সাধারণত এক ধরণের রূপান্তর করতে পারে, যেখানে একটি সি সি স্টাইলের কাস্ট এক ক্রিয়াকলাপে দুটি বা তিনটি রূপান্তর করতে পারে। প্রাথমিক ব্যতিক্রম হ'ল আপনি কমপক্ষে কয়েকটি ক্ষেত্রে একটি এর জায়গায় ব্যবহার করতে পারেন এবং এ হিসাবে লিখিত হওয়া সত্ত্বেও এটি সত্যিই একটি হিসাবে শেষ হবে । উদাহরণস্বরূপ, আপনি একটি শ্রেণিবদ্ধ স্তরকে নিচে বা নীচে নেওয়ার জন্য ব্যবহার করতে পারেন - তবে শ্রেণিবিন্যাস সর্বদা নিরাপদ থাকে, সুতরাং এটি স্থিতিশীলভাবে করা যায়, যখন একটি ক্রম "ডাউন" স্তরক্রমটি প্রয়োজনীয়ভাবে নিরাপদ নয় তাই এটি গতিশীলভাবে সম্পন্ন।dynamic_cast
static_cast
dynamic_cast
static_cast
dynamic_cast
জাভা এবং সি # একে অপরের সাথে অনেক বেশি মিল। বিশেষত, উভয়ের সাথেই কাস্টিং সর্বদা একটি রান-টাইম অপারেশন। সি ++ কাস্ট অপারেটরগুলির ক্ষেত্রে, এটি dynamic_cast
আসলে কী হয়েছিল তার নিরিখে সবচেয়ে নিকটতম - যেমন, আপনি যখন কোনও টার্গেট ধরণের কোনও বস্তু কাস্ট করার চেষ্টা করেন, তখন সংকলক রান-টাইম চেক সন্নিবেশ করায় তা রূপান্তর অনুমোদিত কিনা তা দেখার জন্য , এবং এটি না থাকলে একটি ব্যতিক্রম ছুঁড়ে দিন। সঠিক বিবরণ (যেমন, "খারাপ badালাই" ব্যতিক্রমের জন্য ব্যবহৃত নাম) পরিবর্তিত হয়, তবে মূল নীতিটি বেশিরভাগ ক্ষেত্রে একই রকম থাকে (যদিও, স্মৃতি যদি দেয় তবে জাভা int
সি-এর অনেক কাছাকাছি কিছু অ-অবজেক্ট ধরণের ক্ষেত্রে ক্যাসেট প্রয়োগ করে) কাস্ট - তবে এই ধরণেরগুলি খুব কমই ব্যবহৃত হয় যে 1) আমি নিশ্চিতভাবে মনে করি না, এবং 2) এটি সত্য হলেও, তা যাই হোক না কেন কিছু যায় আসে না)।
জিনিসগুলিকে আরও সাধারণভাবে দেখার জন্য, পরিস্থিতিটি বেশ সহজ (কমপক্ষে আইএমও): একটি কাস্ট (স্পষ্টতই যথেষ্ট) এর অর্থ আপনি কোনও কিছুকে অন্য এক ধরণের রূপান্তর করছেন। আপনি / কখন এটি করেন তা প্রশ্ন উত্থাপন করে "কেন?" আপনি যদি সত্যিই কিছু নির্দিষ্ট ধরণের হতে চান তবে আপনি কেন এটি শুরু করতে পছন্দ করেন নি? যে আছে বলে নয় কখনোই এই ধরনের একটি রূপান্তর করতে একটি কারণ কিন্তু যে কোন সময় এটি ঘটলে, আপনার কিনা কোড পুনরায় ডিজাইন যায়নি, তাই সঠিক টাইপ সর্বত্র ব্যবহৃত হয় প্রশ্নে সূচিত করা উচিত নয়। এমনকি আপাতদৃষ্টিতে নিরীহ রূপান্তরগুলি (যেমন, পূর্ণসংখ্যা এবং ভাসমান পয়েন্টের মধ্যে) সাধারণের চেয়ে অনেক বেশি ঘনিষ্ঠভাবে পরীক্ষা করা উচিত। তাদের দেখে মনে হচ্ছেসাদৃশ্য, পূর্ণসংখ্যাগুলি সত্যই "গণনা করা" ধরণের জিনিসগুলির জন্য এবং "মাপা" ধরণের জিনিসগুলির জন্য ভাসমান পয়েন্ট হিসাবে ব্যবহার করা উচিত। পার্থক্য উপেক্ষা করে এমন কিছু পাগল বক্তব্য নিয়ে আসে যা "গড় আমেরিকান পরিবারে 1.8 শিশু রয়েছে"। এটি কীভাবে ঘটেছিল তা আমরা সকলেই দেখতে পাচ্ছি, তবে সত্য যে কোনও পরিবারে 1.8 সন্তান নেই। তাদের কাছে 1 থাকতে পারে বা তাদের কাছে 2 থাকতে পারে বা এর চেয়ে বেশি তাদের থাকতে পারে - তবে কখনও 1.8 নয়।