স্ট্যাটিক_কাস্ট <> এবং সি স্টাইলের ingালাইয়ের মধ্যে পার্থক্য কী?


202

static_cast<>সি স্টাইলের ing ালাইয়ের চেয়ে বেশি পছন্দ করার কোনও কারণ আছে কি ? তারা কি সমতুল্য? তাদের কি কোনও ধরণের গতির পার্থক্য রয়েছে?


উত্তর:


217

সি ++ স্টাইলের কাস্টগুলি সংকলক দ্বারা পরীক্ষা করা হয়। সি স্টাইলের ক্যাসেটগুলি রানটাইমগুলিতে হয় না এবং ব্যর্থ হতে পারে।

এছাড়াও, সি ++ স্টাইলের কাস্টগুলি সহজেই সন্ধান করা যেতে পারে, তবে সি স্টাইলের ক্যাসেটগুলি অনুসন্ধান করা সত্যিই কঠিন।

আর একটি বড় সুবিধা হ'ল 4 টি বিভিন্ন সি ++ শৈলীর বর্ণগুলি প্রোগ্রামারটির অভিপ্রায়টি আরও স্পষ্টভাবে প্রকাশ করে।

সি ++ লেখার সময় আমি প্রায় সবসময় সি স্টাইলের উপরে সি ++ ব্যবহার করতাম।


67
রানটাইমের সময় ব্যর্থ হতে পারে এমন একমাত্র কাস্ট dynamic_casts
আর মার্টিনহো ফার্নান্দিস

12
সি ++ পুনরায় ব্যাখ্যা_কাস্ট <টি> (ইউ) রান স্টাইলে সি স্টাইলের কাস্ট কাস্ট করতে পারে ঠিক তেমনভাবে ব্যর্থ হতে পারে এবং ডায়নামিক_কাস্ট <টি> (ইউ) কীভাবে ব্যর্থ হয় তার থেকে এগুলি একেবারেই আলাদা।
ক্রিস্টোফার স্মিথ

20
˗1 সাধারণ সি কাস্ট (int)somethingব্যর্থ হতে পারে না - হয় আপনি ইনট বা সংকলক ত্রুটিতে কাস্ট হন।
টোমা জাটো - মনিকা

2
সি বর্ণের তুলনায় কেন সি ++ ক্যাসেটগুলি আরও সহজে অনুসন্ধান করা যায় তা আপনি কী ব্যাখ্যা করতে পারেন?
মিনাহ ত্রান

3
@ মিনিট্রান সি ++ স্টাইলের জন্য আপনি আপনার উত্স ফাইলগুলির মাধ্যমে "কাস্ট" কীওয়ার্ডটি অনুসন্ধান করতে পারেন। তবে আপনি কি সি-স্টাইলের কাস্টগুলি দিয়ে করতে পারেন?
হুয়াংজঙ্ঘাও

176

সংক্ষেপে :

  1. static_cast<>() আপনাকে একটি সংকলন সময় চেক করার ক্ষমতা দেয়, সি স্টাইলের কাস্ট দেয় না।
  2. static_cast<>() আরও পঠনযোগ্য এবং সি ++ উত্স কোডের অভ্যন্তরে যে কোনও জায়গায় সহজেই স্পট করা যেতে পারে, C_Style castালাই নেই।
  3. সি ++ কাস্ট ব্যবহার করে ইন্টেন্টেশনগুলি আরও ভালভাবে জানানো হয়।

আরও ব্যাখ্যা :

স্ট্যাটিক কাস্ট সামঞ্জস্যপূর্ণ ধরণের মধ্যে রূপান্তর সম্পাদন করে । এটি সি-স্টাইলের 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 ++ জালিয়াতিগুলির আরও ব্যাখ্যার জন্যও দেখতে পারেন: এখানে ক্লিক করুন


17
আমি মনে করি "4-বাইট পয়েন্টার" এর পরিবর্তে আপনার বোঝানো হয়েছে "4-বাইট ডেটাটাইপটিতে পয়েন্টার"
iheanyi

তবে এটি int q = স্ট্যাটিক_কাস্ট <int> (সি);
টনিপার্কার

3
@ টনিপার্কার এর কারণ এই লাইনটিতে কোনও ভুল নেই।
ব্র্যাডেন সেরা

15

সি ++ castালাই অপারেটরগুলির একটি তুলনা দেখুন ।

তবে বিভিন্ন বিভিন্ন ingালাই ক্রিয়াকলাপের জন্য একই সিনট্যাক্স ব্যবহার করা প্রোগ্রামারের উদ্দেশ্যটিকে অস্পষ্ট করতে পারে।

তদুপরি, একটি বৃহত কোডবেসে নির্দিষ্ট ধরণের কাস্ট খুঁজে পাওয়া কঠিন হতে পারে।

সি-স্টাইলের castালাইয়ের সাধারণতা এমন পরিস্থিতিতে ওভারকিল হতে পারে যেখানে প্রয়োজনীয় সমস্তগুলি একটি সাধারণ রূপান্তর। বিভিন্ন ডিগ্রী পাওয়ারের বিভিন্ন কাস্টিং অপারেটরের মধ্যে নির্বাচনের ক্ষমতা প্রোগ্রামারদের অজান্তে একটি ভুল ধরণের ingালাই থেকে আটকাতে পারে।


14
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!
}

5
আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যাবারিসোন

1
আমি মনে করি যে উত্তরটি দেখায় যে শ্রেণিবদ্ধের গ্রাফের বৈধ পথে রয়েছে তা নিশ্চিত করার জন্য "স্ট্যাটিক_কাস্টগুলি" টাইপ রূপান্তরগুলি পরীক্ষা করে। এই নির্দিষ্ট উদাহরণে, এ * থেকে বি * বা বি * এ * * এ কাস্টিং অনুমোদিত কারণ এ এবং বি শ্রেণিবিন্যাসের গ্রাফে একটি পথ তৈরি করে। সি * পথে নেই তাই স্ট্যাটিক_কাস্ট সংকলন-সময় ত্রুটি তৈরি করবে। সিডিনোট: এটি লক্ষ্য করার মতো বিষয় যে এ * থেকে বি * এ castালাইয়ের ফলে সত্যিকারের অন্তর্নিহিত বস্তুর উপর নির্ভর করে রান সময়ে ডায়নামিক_কাস্টের সাথে NUL আসতে পারে।
টমি চেন

7

সি / সি ++ এ বিভিন্ন কাস্টকে ব্যাখ্যা করা এবং সি-স্টাইলের কাস্টটি আসলে কী করে তা বোঝানোর জন্য একটি দুর্দান্ত পোস্ট: https://anteru.net/blog/2007/12/18/200/index.html

(টাইপ) ভেরিয়েবল সিনট্যাক্স ব্যবহার করে সি-স্টাইল কাস্টিং। সবচেয়ে খারাপ আবিষ্কার হয়েছে। এটি এই ক্রমে নিম্নলিখিত ক্যাসেটগুলি করার চেষ্টা করে: (সি ++ স্ট্যান্ডার্ড, 5.4 এক্সপ্রেস.কাস্ট অনুচ্ছেদ 5ও দেখুন)

  1. const_cast
  2. static_cast
  3. স্থির_কাস্ট অনুসরণ করে কনস্ট_কাস্ট
  4. reinterpret_cast
  5. পুনরায় ব্যাখ্যা_কাস্ট কনস্ট_কাস্ট দ্বারা অনুসরণ করা

5

static_castসংকলন সময়ে পরীক্ষা করে দেখা যায় যে রূপান্তরটি সুস্পষ্টভাবে বেমানান প্রকারের মধ্যে নয়। বিপরীতে dynamic_cast, ধরণের সময় সামঞ্জস্যের জন্য কোনও চেক করা হয় না। এছাড়াও, static_castরূপান্তর অগত্যা নিরাপদ নয়।

static_cast পয়েন্টার থেকে বেস ক্লাসে ডাইরেক্ট ক্লাসে পয়েন্টার থেকে রূপান্তর করতে ব্যবহার করা হয়, বা দেশীয় প্রকারের মধ্যে যেমন এনুম থেকে ইনট বা ফ্লোট অব ইনট।

ব্যবহারকারী static_castঅবশ্যই রূপান্তরটি নিরাপদ কিনা তা নিশ্চিত করতে হবে।

সি-স্টাইলের কাস্ট কোনও সংকলন বা রান সময়ে কোনও চেক সম্পাদন করে না।


3

যেহেতু বিভিন্ন শব্দার্থকগুলির সাথে প্রত্যেকে বিভিন্ন ধরণের কাস্টিং রয়েছে তাই স্ট্যাটিক_কাস্ট <> আপনাকে "আমি এক ধরণের থেকে অন্য ধরণের আইনী রূপান্তর করছি" বলতে ইন্টি থেকে ডাবল করার অনুমতি দেয়। একটি সাধারণ সি-স্টাইলের কাস্টের অর্থ প্রচুর জিনিস হতে পারে। আপনি কি উপরে / ডাউন ingালাই করছেন? আপনি একটি পয়েন্টার পুনরায় ব্যাখ্যা করছেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.