(অন্তর্) x এর পরিবর্তে স্থির_কাজ <<> (এক্স) ব্যবহার করবেন?


667

আমি শুনেছি static_castফাংশনটি সি-স্টাইল বা সাধারণ ফাংশন-স্টাইলের castালাইয়ের পক্ষে পছন্দ করা উচিত। এটা কি সত্য? কেন?


36
আপত্তি আপনার সম্মান, জিজ্ঞাসা এবং উত্তর
গ্রিম পেরো

25
আমি দ্বিমত পোষণ করছি, এই অন্যান্য প্রশ্নটি সি ++ এ বর্ণিত বর্ণগুলির মধ্যে পার্থক্য বর্ণনা করার বিষয়ে ছিল। এই প্রশ্নটি স্ট্যাটিক_কাস্টের আসল উপযোগিতা সম্পর্কে যা কিছুটা আলাদা।
ভিনসেন্ট রবার্ট

2
আমরা অবশ্যই দুটি প্রশ্নের একত্রীকরণ করতে পারি, তবে আমাদের এই থ্রেডটি থেকে সংরক্ষণ করার দরকারটি হ'ল সি-স্টাইলের ingালাইয়ের উপরে ফাংশনগুলি ব্যবহার করার সুবিধা যা বর্তমানে কেবল অন্য থ্রেডের এক লাইনের উত্তরে উল্লেখ করা হয়েছে, কোনও ভোট নেই with ।
টমি হার্বার্ট

6
এই প্রশ্নটি "অন্তর্নির্মিত" প্রকারের মতো, যেমন ইন্টের মত, যেখানে সেই প্রশ্নটি শ্রেণির ধরণের about এটি পৃথক ব্যাখ্যার যোগ্যতার জন্য যথেষ্ট পরিমাণে পার্থক্যের মতো বলে মনে হচ্ছে।

9
স্ট্যাটিক_কাস্ট আসলে একটি অপারেটর, কোনও ফাংশন নয়।
থমাসম্যাকলিউড

উত্তর:


633

প্রধান কারণ যে ক্লাসিক সি কাস্ট আমরা কি কল মধ্যে পার্থক্য করি না হয় static_cast<>(), reinterpret_cast<>(), const_cast<>(), এবংdynamic_cast<>() । এই চারটি জিনিস সম্পূর্ণ আলাদা।

static_cast<>()সাধারণত নিরাপদ থাকে। ভাষাতে একটি বৈধ রূপান্তর আছে, বা একটি উপযুক্ত নির্মাতা যা এটি সম্ভব করে। আপনি যখন উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসে ফেলে দেন কেবল তখনই কিছুটা ঝুঁকিপূর্ণ হয়; আপনাকে অবশ্যই নিশ্চিত করতে হবে যে বস্তুটি আসলে যে বংশধর আপনি দাবি করেছেন এটি ভাষার বাইরে, (বস্তুর পতাকার মতো)। একজনdynamic_cast<>() যতদিন ফলাফলের পরীক্ষা করা হয় (পয়েন্টার) অথবা একটি সম্ভাব্য ব্যতিক্রম অ্যাকাউন্ট (রেফারেন্স) বিবেচনায় নেয়া হয় নিরাপদ।

অন্যদিকে ক reinterpret_cast<>()(বা ক const_cast<>()) সর্বদা বিপজ্জনক। আপনি সংকলককে বলেছেন: "আমার উপর আস্থা রাখুন: আমি জানি এটি কোনও fooরূপের মতো দেখাচ্ছে না (এটি দেখে মনে হচ্ছে এটি পরিবর্তনীয় নয়), তবে এটি"।

প্রথম সমস্যাটি হ'ল কোডের বৃহত এবং বিচ্ছুরিত অংশগুলি না দেখে এবং সমস্ত নিয়ম না জেনে কোনও সি-স্টাইলের কাস্টে কোনটি ঘটবে তা বলা প্রায় অসম্ভব।

আসুন এইগুলি ধরে নেওয়া যাক:

class CDerivedClass : public CMyBase {...};
class CMyOtherStuff {...} ;

CMyBase  *pSomething; // filled somewhere

এখন, এই দুটি একইভাবে সংকলিত হয়েছে:

CDerivedClass *pMyObject;
pMyObject = static_cast<CDerivedClass*>(pSomething); // Safe; as long as we checked

pMyObject = (CDerivedClass*)(pSomething); // Same as static_cast<>
                                     // Safe; as long as we checked
                                     // but harder to read

যাইহোক, আসুন এটি প্রায় অভিন্ন কোডটি দেখুন:

CMyOtherStuff *pOther;
pOther = static_cast<CMyOtherStuff*>(pSomething); // Compiler error: Can't convert

pOther = (CMyOtherStuff*)(pSomething);            // No compiler error.
                                                  // Same as reinterpret_cast<>
                                                  // and it's wrong!!!

যেমন আপনি দেখতে পাচ্ছেন, জড়িত সমস্ত শ্রেণীর সম্পর্কে অনেক কিছু না জেনে দুটি পরিস্থিতির মধ্যে পার্থক্য করার সহজ উপায় নেই।

দ্বিতীয় সমস্যাটি হ'ল সি-স্টাইলের বর্ণগুলি সনাক্ত করা খুব শক্ত hard জটিল অভিব্যক্তিগুলিতে সি-স্টাইলের কাস্টগুলি দেখতে খুব কঠিন হতে পারে। সম্পূর্ণ স্বয়ংক্রিয় সি ++ কম্পাইলার ফ্রন্ট-এন্ড ছাড়াই একটি স্বয়ংক্রিয় সরঞ্জাম লিখতে সি-স্টাইলের ক্যাসেটগুলি (উদাহরণস্বরূপ একটি অনুসন্ধান সরঞ্জাম) সনাক্ত করা দরকার যা কার্যত অসম্ভব। অন্যদিকে, "স্ট্যাটিক_কাস্ট <" বা "পুনরায় ব্যাখ্যা_কাস্ট <" অনুসন্ধান করা সহজ।

pOther = reinterpret_cast<CMyOtherStuff*>(pSomething);
      // No compiler error.
      // but the presence of a reinterpret_cast<> is 
      // like a Siren with Red Flashing Lights in your code.
      // The mere typing of it should cause you to feel VERY uncomfortable.

এর অর্থ এই যে, কেবল সি-স্টাইলের কাস্টগুলিই আরও বিপজ্জনক নয়, এগুলি সঠিক কিনা তা নিশ্চিত করার জন্য তাদের সমস্ত খুঁজে পাওয়া অনেক বেশি শক্ত।


30
static_castউত্তরাধিকারের শ্রেণিবদ্ধতা কাস্ট করার জন্য আপনার ব্যবহার করা উচিত নয় , বরং dynamic_cast। এটি নাল পয়েন্টার বা বৈধ পয়েন্টারটি ফেরত দেবে।
ডেভিড থর্নলি

41
@ ডেভিড থর্নলি: আমি সাধারণতঃ একমত আমি মনে করি আমি static_castসেই পরিস্থিতিতে ব্যবহারের দিকে সাবধান করেছিলাম । dynamic_castনিরাপদ হতে পারে তবে এটি সর্বদা সেরা বিকল্প নয়। কখনও কখনও আপনি জানেন যে একটি পয়েন্টার একটি প্রদত্ত সাব টাইপ নির্দেশ করে, সংকলকটির মাধ্যমে অস্বচ্ছ এবং static_castদ্রুততর হয়। কমপক্ষে কিছু পরিবেশে, dynamic_castalচ্ছিক সংকলক সমর্থন এবং রানটাইম ব্যয়ের প্রয়োজন (আরটিটিআই সক্ষম করে) এবং আপনি নিজে যা করতে পারেন তার জন্য কেবল কয়েকটি চেকের জন্য এটি সক্ষম করতে চাইবেন না। সি ++ এর আরটিটিআই হ'ল সমস্যার একমাত্র সম্ভাব্য সমাধান।
ইউরো মিশেল্লি

18
সি কাস্ট সম্পর্কে আপনার দাবিটি মিথ্যা। সমস্ত সি ক্যাসেটগুলি মান রূপান্তর, মোটামুটি সি ++ এর সাথে তুলনীয় static_cast। এর সমতুল্য reinterpret_castহ'ল *(destination_type *)&অর্থের অর্থের ঠিকানা গ্রহণ করা, সেই ঠিকানাটিকে অন্য কোনও ধরণের পয়েন্টারে ingালাই করা, এবং তারপরে নির্ধারণ করা। চরিত্র ধরনের নির্দিষ্ট struct হয় ধরনের ক্ষেত্রে, যার জন্য সি এই কনস্ট্রাক্ট আচরণ সংজ্ঞায়িত ছাড়া, এটা সাধারণত সি অনির্ধারিত আচরণ ফলাফল
আর .. GitHub বন্ধ সাহায্য করা বরফ

11
আপনার সূক্ষ্ম উত্তর পোস্টের মূল অংশকে সম্বোধন করে। আমি শিরোনামটির উত্তর খুঁজছিলাম "কেন স্ট্যাটিক_কাস্ট <int> (x) এর পরিবর্তে (int) x"? এটি, টাইপের int(এবং intএকা) জন্য কেন ব্যবহার করুন usestatic_cast<int> বনামকে (int)একমাত্র উপকার হিসাবে বেনিফিট হিসাবে বর্গ ভেরিয়েবল এবং পয়েন্টারগুলির সাথে মনে হয়। আপনি এই সম্পর্কে বিস্তারিত জানাতে অনুরোধ।
chux - মনিকা

31
@ chux, এর জন্য int dynamic_castপ্রয়োগ হয় না, তবে অন্যান্য সমস্ত কারণ দাঁড়িয়েছে। উদাহরণস্বরূপ: ধরা যাক vএকটি ফাংশন প্যারামিটার হিসাবে ঘোষিত float, তারপর (int)vহয় static_cast<int>(v)। কিন্তু যদি আপনাকে প্যারামিটার পরিবর্তন float*, (int)vশান্তভাবে হয়ে reinterpret_cast<int>(v)যখন static_cast<int>(v)অবৈধ এবং সঠিকভাবে কম্পাইলার হাতে ক্যাচ হয়।
ইউরো মিশেলি

115

একটি বাস্তববাদী টিপ: আপনি যদি প্রকল্পটি সজ্জিত করার পরিকল্পনা করেন তবে আপনি আপনার উত্স কোডের স্ট্যাটিক_কাস্ট কীওয়ার্ডটির জন্য সহজেই অনুসন্ধান করতে পারেন।


3
আপনি বন্ধনীর সাহায্যে অনুসন্ধান করতে পারেন যেমন "(ইনট)" তবে ভাল উত্তর এবং সি ++ স্টাইলের ingালাই ব্যবহারের বৈধ কারণ।
মাইক 11

4
@ মাইক যা মিথ্যা ইতিবাচক সন্ধান করবে - একটি একক intপ্যারামিটার সহ একটি কার্য ঘোষণা decla
নাথান ওসমান

1
এটি মিথ্যা নেতিবাচক দিক দিতে পারে: আপনি যদি এমন কোনও কোডবেস সন্ধান করেন যেখানে আপনি কেবল লেখক নন, আপনি সি-স্টাইলের কাস্টগুলি অন্য কারও কারও জন্য প্রবর্তিত হতে পারে না।
রুসলান

7
কীভাবে এই প্রকল্পটি পরিপাটি করতে সহায়তা করবে?
বিলো

আপনি স্ট্যাটিক_কাস্টের জন্য অনুসন্ধান করবেন না, কারণ এটি সম্ভবত সবচেয়ে সঠিক। আপনি পুনরায় সংজ্ঞা_কাস্ট, কনস্ট_কাস্ট, এবং এমনকি ডায়নামিক_কাস্ট অনুসন্ধান করার সময় আপনি স্ট্যাটিক_কাস্টার ফিল্টার করতে চান, কারণ এটি সেই জায়গাগুলি পুনরায় নকশাকৃত হতে পারে indicate সি-কাস্ট একসাথে সমস্ত মিশ্রিত হয় এবং আপনাকে কাস্টিংয়ের কারণ দেয় না।
ড্রাগন

78

সংক্ষেপে :

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

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

স্ট্যাটিক কাস্ট সামঞ্জস্যপূর্ণ ধরণের মধ্যে রূপান্তর সম্পাদন করে । এটি সি-স্টাইলের castালাইয়ের মতো, তবে এটি আরও বাধাজনক। উদাহরণস্বরূপ, সি-স্টাইলের castালাই একটি পূর্ণসংখ্যার পয়েন্টারটিকে একটি চরকে নির্দেশ করতে দেয়।

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

যেহেতু এটির ফলাফল 4-বাইট পয়েন্টার বরাদ্দ মেমরির 1 বাইট প্রতি নির্দেশ করে, তাই এই পয়েন্টারে লেখাটি রান-টাইম ত্রুটির কারণ হতে পারে বা কিছু সংলগ্ন স্মৃতিতে ওভাররাইট করে।

*p = 5; // run-time error: stack corruption

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

int *q = static_cast<int*>(&c); // compile-time error

আরও পড়ুন:
স্ট্যাটিক_কাস্ট <> এবং সি স্টাইল কাস্টিং
এবং নিয়মিত কাস্ট বনাম স্ট্যাটিক_কাস্ট বনাম গতিশীল_কাস্টের মধ্যে পার্থক্য কী?


21
আমি এটির static_cast<>()চেয়ে বেশি পাঠযোগ্য disag মানে, কখনও কখনও এটি হয় তবে বেশিরভাগ সময় - বিশেষত মৌলিক পূর্ণসংখ্যার ধরণের ক্ষেত্রে - এটি কেবল ভয়াবহ এবং অহেতুক ভার্জোজ। উদাহরণস্বরূপ: এটি এমন একটি ফাংশন যা 32-বিট শব্দের বাইটগুলিকে অদলবদল করে। static_cast<uint##>()কাস্ট ব্যবহার করে পড়া প্রায় অসম্ভব , তবে (uint##)ক্যাসেট ব্যবহার করে বোঝা বেশ সহজ । কোডের ছবি: imgur.com/NoHbGve
টড লেহম্যান

3
@ টডলিহম্যান: আপনাকে ধন্যবাদ, তবে আমি বলিনি always । (তবে বেশিরভাগ সময় হ্যাঁ) এমন কিছু ঘটনা রয়েছে যা সি স্টাইলের castালাই আরও বেশি পঠনযোগ্য। সি স্টাইলের ingালাই এখনও একটি কারণ যা এখনও লাইভ এবং সি ++ ইমোতে লাথি মারছে ts :) যাইহোক, এটি একটি খুব দুর্দান্ত উদাহরণ ছিল
রিকা

8
এই চিত্রটিতে @ টডলেহম্যান কোড শৃঙ্খলাবদ্ধ দুটি কাস্ট ব্যবহার করেছে ((uint32_t)(uint8_t) সর্বনিম্ন ছাড়াও বাইটগুলি পুনরায় সেট করার জন্য । এর জন্য বিটওয়াইজ এবং ( 0xFF &) রয়েছে। কাস্টের ব্যবহারের উদ্দেশ্যটি হস্তক্ষেপ করছে।
Öö তিবি

28

প্রশ্নটি কেবল মজাদার স্ট্যাটিক_কাস্ট বা সি স্টাইলের কাস্টিং ব্যবহারের চেয়ে বড় কারণ সি স্টাইলের ক্যাসেট ব্যবহার করার সময় বিভিন্ন জিনিস ঘটে থাকে। সি ++ castালাই অপারেটরগুলির উদ্দেশ্য এই ক্রিয়াকলাপগুলি আরও স্পষ্ট করে তোলা।

পৃষ্ঠের উপর স্থির_কাস্ট এবং সি স্টাইলের কাস্টগুলি একই জিনিসটিতে উপস্থিত হয়, উদাহরণস্বরূপ, যখন একটি মানকে অন্যটিতে মূল্য দেওয়া হয়:

int i;
double d = (double)i;                  //C-style cast
double d2 = static_cast<double>( i );  //C++ cast

এই দুটিই পূর্ণসংখ্যার মানকে দ্বিগুণ করে। তবে পয়েন্টারগুলির সাথে কাজ করার সময় জিনিসগুলি আরও জটিল হয় get কিছু উদাহরণ:

class A {};
class B : public A {};

A* a = new B;
B* b = (B*)a;                                  //(1) what is this supposed to do?

char* c = (char*)new int( 5 );                 //(2) that weird?
char* c1 = static_cast<char*>( new int( 5 ) ); //(3) compile time error

এই উদাহরণে (1) সম্ভবত ঠিক আছে কারণ এ দ্বারা নির্দেশিত বস্তুটি আসলেই বি এর একটি উদাহরণ, তবে আপনি যদি কোডের সেই বিন্দুতে না জানেন তবে আসলে কী বোঝায়? (২) হতে পারে পুরোপুরি আইনী (আপনি কেবলমাত্র পূর্ণসংখ্যার এক বাইটটি দেখতে চান), তবে এটি ভুলও হতে পারে যে ক্ষেত্রে কোনও ত্রুটি সুন্দর হবে (৩)। সি ++ ingালাই অপারেটরগুলি যখন সম্ভব হবে তখন সংকলন-সময় বা রান-টাইম ত্রুটিগুলি সরবরাহ করে কোডগুলিতে এই সমস্যাগুলি প্রকাশ করার উদ্দেশ্যে।

সুতরাং, কঠোর "মান কাস্টিং" এর জন্য আপনি স্ট্যাটিক_কাস্ট ব্যবহার করতে পারেন। আপনি যদি পয়েন্টারগুলির রান-টাইম পলিমারফিক কাস্টিং চান তবে ডায়নামিক_কাস্ট ব্যবহার করুন। আপনি যদি প্রকারের সম্পর্কে সত্যই ভুলে যেতে চান তবে আপনি পুনরায় ব্যাখ্যা_কাস্ট ব্যবহার করতে পারেন। এবং কনস্ট কনস্টাস্ট উইন্ডোটি বাইরে ফেলে দিতে কনস্টকাস্ট রয়েছে।

তারা কেবল কোডটি আরও স্পষ্ট করে তোলে যাতে দেখে মনে হয় আপনি কী করছেন।


26

static_castএর অর্থ হ'ল আপনি দুর্ঘটনাক্রমে const_castবা পারবেন না reinterpret_cast, যা একটি ভাল জিনিস।


4
সি স্টাইলের কাস্টের অতিরিক্ত (বরং অপ্রাপ্তবয়স্ক) সুবিধাগুলি হ'ল এটি আরও বেশি দাঁড়িয়েছে (সম্ভাব্য খারাপ কিছু করা কুশ্রী হওয়া উচিত) এবং এটি আরও গ্রেপ-সক্ষম।
মাইকেল বুড়

4
গ্রেপ-ক্ষমতা সর্বদা আমার বইয়ের একটি প্লাস।
ব্রানান

7
  1. গ্রেপ বা অনুরূপ সরঞ্জাম ব্যবহার করে আপনার কোডে কাস্টগুলি সহজেই খুঁজে পেতে দেয়।
  2. আপনি কী ধরণের কাস্ট করছেন তা স্পষ্ট করে তোলে এবং এটি প্রয়োগে সংকলকটির সহায়তায় জড়িত। আপনি যদি কেবল কনস্ট-নেস ফেলে দিতে চান তবে আপনি কনস্ট_কাস্ট ব্যবহার করতে পারেন যা আপনাকে অন্য ধরণের রূপান্তর করতে দেয় না।
  3. বর্ণগুলি সহজাত কুৎসিত - আপনি একজন প্রোগ্রামার হিসাবে সংকলকটি আপনার কোডটিকে সাধারণভাবে কীভাবে আচরণ করবে তা ওভাররুলিং করছে। আপনি সংকলককে বলছেন, "আমি আপনার চেয়ে ভাল জানি" " এটি হ'ল এটি বোধগম্য যে কোনও কাস্ট অভিনয় করা একটি মাঝারি বেদনাদায়ক জিনিস হওয়া উচিত এবং তারা আপনার কোডটিতে লিখিত থাকা উচিত, কারণ তারা সম্ভবত সমস্যার উত্স।

দেখুন কার্যকরী সি ++ ভূমিকা


আমি ক্লাসগুলির জন্য এটির সাথে পুরোপুরি একমত হয়েছি তবে পিওডি টাইপের জন্য সি ++ স্টাইলের castালাই ব্যবহার করা কোনও অর্থবোধ করে না?
জাচারি ক্রাউস

আমি তাই মনে করি. সমস্ত 3 টি কারণই পিওডিগুলিতে প্রযোজ্য এবং ক্লাস এবং পিওডিগুলির জন্য পৃথক পৃথক পরিবর্তে কেবল একটি নিয়ম রাখা সহায়ক।
জনএমসিজি

আকর্ষণীয়, আমি পিওডির ধরণের জন্য ভবিষ্যতে কোডগুলিতে কীভাবে আমার ক্যাসেটগুলি করি তা সংশোধন করতে হতে পারে।
জাচারি ক্রাউস

7

আপনি কত প্রকার সুরক্ষা চাপাতে চান তা এটি।

আপনি যখন লিখবেন (bar) foo(যা সমান)reinterpret_cast<bar> foo আপনি কোনও ধরণের রূপান্তরকারী অপারেটর সরবরাহ না থাকেন ) আপনি সংকলককে টাইপ সুরক্ষা উপেক্ষা করার জন্য বলছেন, এবং যেমন বলা হয়েছে ঠিক তেমন করুন।

আপনি যখন লিখবেন তখন static_cast<bar> fooকমপায়ারটিকে কমপক্ষে রূপান্তর কোডটি প্রবেশ করানোর জন্য টাইপ রূপান্তরটি বোঝায় এবং অবিচ্ছেদ্য ধরণের জন্য, তা পরীক্ষা করতে জিজ্ঞাসা করছেন।


সম্পাদনা 2014-02-26

আমি এই উত্তরটি 5 বছরেরও বেশি আগে লিখেছি, এবং আমি এটি ভুল পেয়েছি। (মন্তব্য দেখুন।) কিন্তু এটি এখনও upvotes পায়!


8
(বার) ফু পুনরায় ব্যাখ্যা_কাস্ট <বার> (ফু) সমতুল্য নয়। "(টিওয়াইপিই) এক্সপ্রেস" এর নিয়মগুলি হ'ল এটি ব্যবহারের জন্য উপযুক্ত সি ++ স্টাইলের কাস্ট বেছে নেবে, যার মধ্যে পুনরায় ব্যাখ্যা_কাস্ট অন্তর্ভুক্ত থাকতে পারে।
রিচার্ড কর্ডেন

ভাল যুক্তি. ইউরো মিশেলি এই প্রশ্নের সুনির্দিষ্ট উত্তর দিয়েছেন।
পিতরৌ

1
এছাড়াও, এটি প্রথম static_cast<bar>(foo)বন্ধনী সহ। একই জন্য reinterpret_cast<bar>(foo)
এলএফ

6

সি স্টাইল কাস্টগুলি কোডের একটি ব্লকে মিস করা সহজ miss সি ++ স্টাইলের কাস্টগুলি কেবল আরও ভাল অনুশীলন নয়; তারা নমনীয়তা অনেক বড় ডিগ্রী অফার।

পুনরায় ব্যাখ্যা_কাস্ট পয়েন্টার ধরণের রূপান্তরগুলিতে অবিচ্ছেদ্য অনুমতি দেয়, তবে অপব্যবহার করা গেলে এটি অনিরাপদ হতে পারে।

স্ট্যাটিক_কাস্ট সংখ্যাসূচক প্রকারের জন্য যেমন রূপান্তরিত হয় যেমন এনামস থেকে অন্তর্নির্মিত থেকে ইনটস বা ইনটস ফ্লোটে বা যে কোনও ডেটা টাইপের বিষয়ে আপনি যেমন আত্মবিশ্বাসী, তেমন রূপান্তর সরবরাহ করে। এটি কোনও রান টাইম চেক করে না।

অন্যদিকে ডায়নামিক_কাস্ট কোনও অস্পষ্ট কাজ বা রূপান্তরকে চিহ্নিত করে এই চেকগুলি সম্পাদন করবে। এটি কেবল পয়েন্টার এবং রেফারেন্সে কাজ করে এবং একটি ওভারহেড অন্তর্ভুক্ত করে।

আরও কয়েকজন রয়েছেন তবে এগুলি হ'ল মূল আপনি যা করতে পারেন।


4

স্ট্যাটিক_কাস্ট, ক্লাসে পয়েন্টার হেরফের বাদে ক্লাসে স্পষ্টভাবে সংজ্ঞায়িত রূপান্তর সম্পাদন করতে, পাশাপাশি মৌলিক ধরণের মধ্যে স্ট্যান্ডার্ড রূপান্তর সম্পাদন করতেও ব্যবহার করা যেতে পারে:

double d = 3.14159265;
int    i = static_cast<int>(d);

4
কেন এত বেশি সংক্ষিপ্ত এবং পাঠযোগ্য static_cast<int>(d)যখন কেউ লিখবেন (int)d? (আমার অর্থ মৌলিক ধরণের ক্ষেত্রে, পয়েন্টারগুলির মতো নয়))
টড লেহম্যান

@ জিডি 1 - কেন কেউ পাঠ্যতার বাইরে ধারাবাহিকতা রাখবে? (প্রকৃত অর্ধেক গুরুতর)
টড লেহম্যান

2
@ টডলিহম্যান: আমি, বিবেচনা করে দেখছি যে কিছু নির্দিষ্ট ধরণের জন্য ব্যতিক্রম করা কেবল কারণ তারা আপনার জন্য বিশেষভাবে বিশেষ করে তোলে তা আমার কাছে কোনও বোধগম্য নয় এবং আমি আপনার পাঠযোগ্যতার খুব ধারণার সাথেও একমত নই। সংক্ষিপ্তর অর্থ আরও বেশি পঠনযোগ্য নয়, যেমনটি আপনি অন্য মন্তব্যে পোস্ট করা চিত্র থেকে দেখছি।
gd1

2
স্ট্যাটিক_কাস্ট একটি বিশেষ ধরণের রূপান্তর করার জন্য একটি সুস্পষ্ট এবং সচেতন সিদ্ধান্ত। সুতরাং এটি অভিপ্রায় স্পষ্ট করে তোলে। কোড পর্যালোচনা, বাগ বা আপগ্রেড অনুশীলনে রূপান্তরগুলির জন্য উত্স ফাইলগুলি অনুসন্ধান করার জন্য এটি মার্কার হিসাবে খুব কার্যকর।
পার্সেস্টি

1
@ টডলিহম্যান কাউন্টারপয়েন্ট: এত বেশি পড়ার (int)dসময় কেউ কেন লিখবে int{d}? কনস্ট্রাক্টর, বা ফাংশন-এর মতো যদি আপনার থাকে তবে ()বাক্য বাক্সগুলিতে জটিল এক্সপ্রেশনগুলিতে প্যারেন্টেসিসের একটি নাইটমারিশ গোলকধাঁধার মধ্যে রূপান্তর করতে সিনট্যাক্স প্রায় তত দ্রুত নয়। এই ক্ষেত্রে, এটি int i{d}পরিবর্তে চাই int i = (int)d। আরও ভাল আইএমও এটি বলেছিল, যখন আমার কেবলমাত্র একটি অভিব্যক্তিতে একটি অস্থায়ী প্রয়োজন হয়, আমি static_castকখনও নির্মাণকারী কাস্ট ব্যবহার করি না এবং ব্যবহার করি না, আমি ভাবি না। আমি কেবল (C)castsতাত্ক্ষণিকভাবে ডিবাগ coutগুলি লিখতে গিয়ে ব্যবহার করি ...
আন্ডারস্কোর_২১
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.