উত্তর:
সি ++ স্টাইলের কাস্টগুলি সংকলক দ্বারা পরীক্ষা করা হয়। সি স্টাইলের ক্যাসেটগুলি রানটাইমগুলিতে হয় না এবং ব্যর্থ হতে পারে।
এছাড়াও, সি ++ স্টাইলের কাস্টগুলি সহজেই সন্ধান করা যেতে পারে, তবে সি স্টাইলের ক্যাসেটগুলি অনুসন্ধান করা সত্যিই কঠিন।
আর একটি বড় সুবিধা হ'ল 4 টি বিভিন্ন সি ++ শৈলীর বর্ণগুলি প্রোগ্রামারটির অভিপ্রায়টি আরও স্পষ্টভাবে প্রকাশ করে।
সি ++ লেখার সময় আমি প্রায় সবসময় সি স্টাইলের উপরে সি ++ ব্যবহার করতাম।
dynamic_cast
s
(int)something
ব্যর্থ হতে পারে না - হয় আপনি ইনট বা সংকলক ত্রুটিতে কাস্ট হন।
সংক্ষেপে :
static_cast<>()
আপনাকে একটি সংকলন সময় চেক করার ক্ষমতা দেয়, সি স্টাইলের কাস্ট দেয় না।static_cast<>()
আরও পঠনযোগ্য এবং সি ++ উত্স কোডের অভ্যন্তরে যে কোনও জায়গায় সহজেই স্পট করা যেতে পারে, C_Style castালাই নেই।আরও ব্যাখ্যা :
স্ট্যাটিক কাস্ট সামঞ্জস্যপূর্ণ ধরণের মধ্যে রূপান্তর সম্পাদন করে । এটি সি-স্টাইলের castালাইয়ের মতো, তবে এটি আরও বাধাজনক। উদাহরণস্বরূপ, সি-স্টাইলের castালাই একটি পূর্ণসংখ্যার পয়েন্টারটিকে কোনও চরকে নির্দেশ করতে দেয়।
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
যেহেতু এই ফলাফলটি 4-বাইট পয়েন্টার (4-বাইট ডেটাটাইপের কাছে একটি পয়েন্টার) বরাদ্দ মেমরির 1 বাইটকে নির্দেশ করে, এই পয়েন্টারে লেখাটি রান-টাইম ত্রুটির কারণ হতে পারে বা কিছু সংলগ্ন স্মৃতিতে ওভাররাইট করে।
*p = 5; // run-time error: stack corruption
সি-স্টাইলের কাস্টের বিপরীতে, স্ট্যাটিক icালাই সংকলকটিকে পয়েন্টার এবং পয়েন্টি ডেটা ধরণের উপযুক্ত কিনা তা পরীক্ষা করার অনুমতি দেয়, যা প্রোগ্রামারকে সংকলনের সময় এই ভুল পয়েন্টার অ্যাসাইনমেন্টটি ধরতে দেয়।
int *q = static_cast<int*>(&c); // compile-time error
আপনি এই পৃষ্ঠাটি C ++ জালিয়াতিগুলির আরও ব্যাখ্যার জন্যও দেখতে পারেন: এখানে ক্লিক করুন
সি ++ castালাই অপারেটরগুলির একটি তুলনা দেখুন ।
তবে বিভিন্ন বিভিন্ন ingালাই ক্রিয়াকলাপের জন্য একই সিনট্যাক্স ব্যবহার করা প্রোগ্রামারের উদ্দেশ্যটিকে অস্পষ্ট করতে পারে।
তদুপরি, একটি বৃহত কোডবেসে নির্দিষ্ট ধরণের কাস্ট খুঁজে পাওয়া কঠিন হতে পারে।
সি-স্টাইলের castালাইয়ের সাধারণতা এমন পরিস্থিতিতে ওভারকিল হতে পারে যেখানে প্রয়োজনীয় সমস্তগুলি একটি সাধারণ রূপান্তর। বিভিন্ন ডিগ্রী পাওয়ারের বিভিন্ন কাস্টিং অপারেটরের মধ্যে নির্বাচনের ক্ষমতা প্রোগ্রামারদের অজান্তে একটি ভুল ধরণের ingালাই থেকে আটকাতে পারে।
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
সি / সি ++ এ বিভিন্ন কাস্টকে ব্যাখ্যা করা এবং সি-স্টাইলের কাস্টটি আসলে কী করে তা বোঝানোর জন্য একটি দুর্দান্ত পোস্ট: https://anteru.net/blog/2007/12/18/200/index.html
(টাইপ) ভেরিয়েবল সিনট্যাক্স ব্যবহার করে সি-স্টাইল কাস্টিং। সবচেয়ে খারাপ আবিষ্কার হয়েছে। এটি এই ক্রমে নিম্নলিখিত ক্যাসেটগুলি করার চেষ্টা করে: (সি ++ স্ট্যান্ডার্ড, 5.4 এক্সপ্রেস.কাস্ট অনুচ্ছেদ 5ও দেখুন)
- const_cast
- static_cast
- স্থির_কাস্ট অনুসরণ করে কনস্ট_কাস্ট
- reinterpret_cast
- পুনরায় ব্যাখ্যা_কাস্ট কনস্ট_কাস্ট দ্বারা অনুসরণ করা
static_cast
সংকলন সময়ে পরীক্ষা করে দেখা যায় যে রূপান্তরটি সুস্পষ্টভাবে বেমানান প্রকারের মধ্যে নয়। বিপরীতে dynamic_cast
, ধরণের সময় সামঞ্জস্যের জন্য কোনও চেক করা হয় না। এছাড়াও, static_cast
রূপান্তর অগত্যা নিরাপদ নয়।
static_cast
পয়েন্টার থেকে বেস ক্লাসে ডাইরেক্ট ক্লাসে পয়েন্টার থেকে রূপান্তর করতে ব্যবহার করা হয়, বা দেশীয় প্রকারের মধ্যে যেমন এনুম থেকে ইনট বা ফ্লোট অব ইনট।
ব্যবহারকারী static_cast
অবশ্যই রূপান্তরটি নিরাপদ কিনা তা নিশ্চিত করতে হবে।
সি-স্টাইলের কাস্ট কোনও সংকলন বা রান সময়ে কোনও চেক সম্পাদন করে না।
যেহেতু বিভিন্ন শব্দার্থকগুলির সাথে প্রত্যেকে বিভিন্ন ধরণের কাস্টিং রয়েছে তাই স্ট্যাটিক_কাস্ট <> আপনাকে "আমি এক ধরণের থেকে অন্য ধরণের আইনী রূপান্তর করছি" বলতে ইন্টি থেকে ডাবল করার অনুমতি দেয়। একটি সাধারণ সি-স্টাইলের কাস্টের অর্থ প্রচুর জিনিস হতে পারে। আপনি কি উপরে / ডাউন ingালাই করছেন? আপনি একটি পয়েন্টার পুনরায় ব্যাখ্যা করছেন?