সি ++: শূন্য-, ডিফল্ট- এবং মান-সূচনাতে নিম্নলিখিত বাক্যগুলির অর্থ কী?


189

নিম্নলিখিত বাক্যগুলির সি ++ এর অর্থ কী:

  • জিরো-আরম্ভের,

  • ডিফল্ট-সূচনা, এবং

  • মান-আরম্ভের

একটি সি ++ বিকাশকারীদের তাদের সম্পর্কে কী জানা উচিত?



20
আরো আছে! আরম্ভের সম্পূর্ণ তালিকা: মান, প্রত্যক্ষ, অনুলিপি, তালিকা (সি ++ 11 নতুন পরিচয়), সমষ্টি, রেফারেন্স, শূন্য, ধ্রুবক এবং ডিফল্ট; en.cppreferences.com/w/cpp/language/initialization তাদের সকলের উদাহরণ সহকারে তালিকাভুক্ত করে :)
কিংবদন্তি 2k

উত্তর:


65

একটি জিনিস অনুধাবন করা যায় যে 'মান-সূচনা' সি ++ 2003 স্ট্যান্ডার্ডের সাথে নতুন - এটি মূল 1998 স্ট্যান্ডার্ডটিতে বিদ্যমান নেই (আমি মনে করি এটি কেবলমাত্র পার্থক্য হতে পারে যা স্পষ্টির চেয়ে বেশি)। স্ট্যান্ডার্ড থেকে সরাসরি সংজ্ঞাগুলির জন্য কিরিল ভি লিয়াডভিনস্কির উত্তর দেখুন ।

এই operator newপ্রারম্ভিককরণের বিভিন্ন ধরণের আচরণ সম্পর্কে এবং এর জন্য তারা কখন লাথি মারবে (এবং যখন তারা সি ++ 98 থেকে সি ++ 03 তে পৃথক হবে) তার আচরণ সম্পর্কে পূর্ববর্তী উত্তরটি দেখুন :

উত্তরের মূল বিষয়টি হ'ল:

কখনও কখনও নতুন অপারেটরের ফিরে আসা মেমরিটি আরম্ভ করা হবে, এবং কখনও কখনও এটি নির্ভর করে না আপনি যে ধরণের নতুন আপ করছেন তা কোনও পিওডি, বা যদি এটি এমন কোনও শ্রেণি যেখানে পিওড সদস্য রয়েছে এবং একটি সংকলক উত্পাদিত ডিফল্ট কনস্ট্রাক্টর ব্যবহার করছে ।

  • সি ++৯৯ এ দুটি ধরণের সূচনা হয়: শূন্য এবং ডিফল্ট
  • সি ++ 2003 এ তৃতীয় প্রকারের সূচনা, মান আরম্ভকরণ যুক্ত করা হয়েছিল।

তাদের কমপক্ষে বলতে গেলে, এটি বরং জটিল এবং যখন বিভিন্ন পদ্ধতিতে কূট থাকে তখন সূক্ষ্ম হয়।

অবশ্যই একটি বিষয় অবশ্যই সচেতন হবেন যে এমএসভিসি সি ++৮৮ বিধিগুলি অনুসরণ করে, এমনকি ভিএস ২০০৮ (ভিসি 9 বা সিএল এক্স এক্স সংস্করণ 15.x) অনুসরণ করে।

নিম্নলিখিত স্নিপেটটি দেখায় যে এমএসভিসি এবং ডিজিটাল মঙ্গলগুলি সি ++ ৯৮ বিধি অনুসরণ করে, অন্যদিকে জিসিসি ৩.৪.৫ এবং কমেউ সি ++ 03 বিধি অনুসরণ করে:

#include <cstdio>
#include <cstring>
#include <new>

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

int main()
{
    char buf[sizeof(B)];
    std::memset( buf, 0x5a, sizeof( buf));

    // use placement new on the memset'ed buffer to make sure 
    //  if we see a zero result it's due to an explicit 
    //  value initialization
    B* pB = new(buf) B();   //C++98 rules - pB->m is uninitialized
                            //C++03 rules - pB->m is set to 0
    std::printf( "m  is %d\n", pB->m);
    return 0;
}

1
এটি এর জন্য গুরুত্বপূর্ণ নয় int, তবে m()তৃতীয় লাইনের মান মি। গুরুত্বপূর্ণ যদি আপনি পরিবর্তন int m;করতে B m;। :)
জোহানেস স্কাউব -

ডান - Aএবং Cএই উদাহরণে ব্যবহার করা হয় না (এগুলি অন্য লিঙ্কযুক্ত উত্তর থেকে বহন করা হয়)। যদিও কীভাবে Aএবং কীভাবে Cনির্মাণ করা হয় তার বর্ণনা দেওয়ার সময় সি ++ 98 এবং সি ++ 03 বিভিন্ন পরিভাষা ব্যবহার করে , ফলাফল উভয় মানের ক্ষেত্রে একই। শুধুমাত্র struct Bবিভিন্ন আচরণে ফলাফল।
মাইকেল বারার 14

1
আমি কি বোঝানো যে আপনি যদি সি পরিবর্তন হয় struct C { C() : m() {}; ~C(); B m; };, তাহলে আপনি থাকবে m.m0. হতে কিন্তু এটি ডিফল্ট-ইনিশিয়ালাইজ করবে mআপনার মত বলতে সি ++ 03 করে, তারপর m.m98 সি ++ মত না সক্রিয়া করা হবে।
জোহানেস স্কাউব -

1
: MSVC অতিরিক্ত আকর্ষণীয় মন্তব্য এই বৈশিষ্ট্যটির হ্যান্ডলিং stackoverflow.com/questions/3931312/...
nobar

আপনি যখন স্থানীয় ধরণের হিসাবে ভ্যারিয়েবল হিসাবে ঘোষিত হন তখন কোন সূচনা হয়?
আন্দ্রে পিউল

88

সি ++ 03 স্ট্যান্ডার্ড 8.5 / 5:

টাইপ টির একটি অবজেক্টের শূন্য-সূচনা করার জন্য:
- টি যদি একটি স্কেলার প্রকার (3.9) হয় তবে অবজেক্ট টিতে রূপান্তরিত 0 (শূন্য) এর মানতে সেট করা হয়;
- যদি টি একটি নন-ইউনিয়ন শ্রেণীর ধরণের হয় তবে প্রতিটি ননস্ট্যাটিক ডেটা সদস্য এবং প্রতিটি বেস-ক্লাস সাবোবজেক্ট শূন্য-ইনিশিয়েটেড হয়;
- টি যদি ইউনিয়নের ধরণ হয় তবে অবজেক্টের প্রথম নাম করা ডেটা সদস্য শূন্য-ইনিশিয়েলড হয়;
- যদি টি একটি অ্যারের ধরণ হয় তবে প্রতিটি উপাদান শূন্য-সূচনাযুক্ত হয়;
- টি যদি রেফারেন্স টাইপ হয় তবে কোনও সূচনা হয় না।

টাইপ টির একটি অবজেক্টের ডিফল্ট-আরম্ভ করার জন্য:
- টি যদি টি-পি-ওডি ক্লাসের ধরণ (ধারা 9) হয় তবে টির জন্য ডিফল্ট কনস্ট্রাক্টর বলা হয় (এবং টি যদি অ্যাক্সেসযোগ্য ডিফল্ট কনস্ট্রাক্টর না থাকে তবে ইনিশিয়েশনটি খারাপ-গঠিত হয়);
- যদি টি একটি অ্যারের ধরণ থাকে তবে প্রতিটি উপাদান ডিফল্ট-আরম্ভ হয়;
- অন্যথায়, অবজেক্টটি শূন্য-সূচনাযুক্ত ized

করার মূল্য আরম্ভ টাইপ টি উপায়ে একটি বস্তু:
- যদি টি ব্যবহারকারী-ঘোষিত কন্সট্রাক্টর (12.1) সঙ্গে একটি বর্গ প্রকার (ধারা 9) হয়, তাহলে টি ডিফল্ট কন্সট্রাকটর বলা হয় (এবং আরম্ভের মন্দ গঠিত হয় যদি টি কোনও অ্যাক্সেসযোগ্য ডিফল্ট কনস্ট্রাক্টর নেই);
- যদি টি কোনও ব্যবহারকারী-ঘোষিত কনস্ট্রাক্টর ছাড়াই নন-ইউনিয়ন শ্রেণীর ধরণ হয়, তবে প্রতিটি অ-স্থিতিশীল ডেটা সদস্য এবং টি এর বেস-ক্লাস উপাদানটি মান-আরম্ভ হয়;
- যদি টি একটি অ্যারের ধরণ হয় তবে প্রতিটি উপাদান মান-আরম্ভ হয়;
- অন্যথায়, অবজেক্টটি শূন্য-সূচনাযুক্ত ized

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


18
এটি সি ++ 11 এর জন্য পুরানো হতে পারে। cppreferences.com বলেছে যে ডিফল্ট সূচনাটি সদস্যদের শূন্য- আরম্ভ করে না (কেবলমাত্র মান সূচনা হয়)।
আলেক্সি শোলিক

3
@ অ্যান্ড্রয়েড একটি গুরুত্বপূর্ণ পয়েন্ট উত্থাপন করেছে, যার উত্তর আমি অন্য কোথাও দেখছি না, তাই আমি একটি নতুন প্রশ্ন করেছি। stackoverflow.com/questions/22233148/…
অ্যাড্রিয়ান ম্যাকার্থি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.