আমি মান- এবং ডিফল্ট- এবং শূন্য-সূচনা সম্পর্কে খুব বিভ্রান্ত। এবং বিশেষত যখন তারা বিভিন্ন মানের সি ++ 03 এবং সি ++ 11 (এবং সি ++ 14 ) জন্য সন্ধান করে।
আমি উদ্ধৃত করছি এবং সত্যিই ভাল উত্তরটি প্রসারিত করার চেষ্টা করছি মান- / ডিফল্ট- / জিরো- উদ্যোগ সি ++ 98 এবং সি ++ 03 এটিকে আরও সাধারণ করে তোলার জন্য এটি যদি প্রচুর ব্যবহারকারীদের সাহায্য করতে পারে তবে কেউ যদি পূরণ করতে সহায়তা করতে পারে ফাঁকগুলি যখন প্রয়োজন তখন একটি ভাল ওভারভিউ আছে?
সংক্ষেপে উদাহরণ দ্বারা সম্পূর্ণ অন্তর্দৃষ্টি:
কখনও কখনও নতুন অপারেটরের ফিরে আসা মেমরিটি আরম্ভ করা হবে, এবং কখনও কখনও এটি নির্ভর করে না আপনি যে ধরণের নতুন আপ করছেন তা কোনও পিওডি (সাধারণ পুরানো ডেটা) , বা যদি এটি এমন কোনও শ্রেণি যেখানে পিওড সদস্য রয়েছে এবং এটি ব্যবহার করছে সংকলক উত্পাদিত ডিফল্ট নির্মাণকারী।
- ইন সি ++ 1998 : আরম্ভের 2 ধরনের আছে zero- এবং ডিফল্ট-আরম্ভের
- ইন সি ++ 2003 আরম্ভের, 3 য় টাইপ মান-আরম্ভের যোগ করা হয়েছিল।
- ইন সি ++ 2011 / সি ++ 2014 শুধুমাত্র তালিকা-আরম্ভের যোগ করা হয়েছিল এবং জন্য নিয়ম value- / default- / জিরো-আরম্ভের একটু পরিবর্তন করেছেন।
ধরে নিন:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
একটি সি ++ 98 সংকলকটিতে, নিম্নলিখিতটি হওয়া উচিত :
new A
- অনির্দিষ্ট মান (A
পিওড হয়)new A()
- শূন্য-সূচনাnew B
- ডিফল্ট কনস্ট্রাক্ট ( অবিচ্ছিন্নB::m
,B
নন-পিওডি হয়)new B()
- ডিফল্ট কনস্ট্রাক্ট (B::m
অবিচ্ছিন্ন)new C
- ডিফল্ট কনস্ট্রাক্ট (C::m
শূন্য-সূচনা হয়,C
নন-পিওডি হয়)new C()
- ডিফল্ট নির্মাণ (C::m
শূন্য-সূচনা)new D
- ডিফল্ট কনস্ট্রাক্ট ( অবিচ্ছিন্নD::m
,D
নন-পিওডি হয়)new D()
- ডিফল্ট নির্মাণ? (D::m
অবিচ্ছিন্ন)
একটি C ++ 03 কনফর্মেন্ট কম্পাইলারে জিনিসগুলি এমনভাবে কাজ করা উচিত:
new A
- অনির্দিষ্ট মান (A
পিওড হয়)new A()
- মান-ইনিশিয়ালাইজেশনA
, যা এটি একটি শূন্য-সূচনা কারণ এটি একটি পিওডি।new B
- ডিফল্ট-ইনিশিয়ালাইজগুলি ( অবিচ্ছিন্ন পাতা ছেড়ে দেয়B::m
,B
নন-পিওডি হয়)new B()
- মান-প্রাথমিককরণB
যা ডিফল্ট কর্টর ব্যবহারকারী-সংজ্ঞায়নের বিপরীতে সংকলক তৈরি হওয়ার কারণে সমস্ত ক্ষেত্র শূন্য-সূচনা করে।new C
- ডিফল্ট-আরম্ভ হয়C
, যা ডিফল্ট কর্টর বলে। (C::m
শূন্য-ইনিশিয়েলড,C
নন-পিওডি)new C()
- মান-প্রাথমিককরণC
, যাকে ডিফল্ট কর্টর বলে। (C::m
শূন্য-সূচনা হয়)new D
- ডিফল্ট কনস্ট্রাক্ট ( অবিচ্ছিন্নD::m
,D
নন-পিওডি হয়)new D()
- মান-সূচনা ডি? , যা ডিফল্ট কর্টরটিকে কল করে (অবিচ্ছিন্নD::m
)
ইটালিক মান এবং? অনিশ্চয়তা, দয়া করে এটি সংশোধন করতে সহায়তা করুন :-)
একটি C ++ 11 সংমিশ্রিত সংকলকটিতে জিনিসগুলি এমনভাবে কাজ করা উচিত:
??? (দয়া করে সাহায্য করুন যদি আমি এটি এখানে শুরু করি তবে যাইহোক এটি ভুল হয়ে যাবে)
একটি C ++ 14 সংমিশ্রিত সংকলকটিতে জিনিসগুলি এমনভাবে কাজ করা উচিত: ??? (দয়া করে সাহায্য করুন যদি আমি এটি এখানে শুরু করি তবে যাইহোক এটি ভুল হয়ে যাবে) (উত্তরের ভিত্তিতে খসড়া)
new A
- ডিফল্ট-আরম্ভA
, সংকলক জেন কর্টর, (অস্বীকারহীনভাবে ছোঁয়াA::m
) (A
হ'ল পিওডি)new A()
- মান-ইনিশিয়ালাইজেশনA
, যা [dcl.init] / 8 এর ২ পয়েন্টের পরে শূন্য-সূচনা হয়new B
- ডিফল্ট-আরম্ভB
, সংকলক জেন ctor, (leavsB::m
uninitialized) (B
অ POD হয়)new B()
- মান-প্রাথমিককরণB
যা ডিফল্ট কর্টর ব্যবহারকারী-সংজ্ঞায়নের বিপরীতে সংকলক তৈরি হওয়ার কারণে সমস্ত ক্ষেত্র শূন্য-সূচনা করে।new C
- ডিফল্ট-আরম্ভ হয়C
, যা ডিফল্ট কর্টর বলে। (C::m
শূন্য-ইনিশিয়েলড,C
নন-পিওডি)new C()
- মান-প্রাথমিককরণC
, যাকে ডিফল্ট কর্টর বলে। (C::m
শূন্য-সূচনা হয়)new D
- ডিফল্ট-সূচনাD
(D::m
uninitialized হয়,D
অ POD হয়)new D()
- মান-প্রাথমিককরণD
, যা ডিফল্ট কর্টরকে কল করে (অবিচ্ছিন্নD::m
)new E
- ডিফল্ট-আরম্ভ হয়E
, যা কম্প কল। জেন ctor। (E::m
অবিচ্ছিন্ন, ই নন-পিওডি)new E()
- মান-আরম্ভকরণE
, যা শূন্য-সূচনা করেE
2 পয়েন্ট [dcl.init] / 8 ) থেকেnew F
- ডিফল্ট-আরম্ভ হয়F
, যা কম্প কল। জেন ctor। ( অবিচ্ছিন্নF::m
,F
পিওড-বিহীন)new F()
- মান- ইনিশিয়েলাইজF
, যা ডিফল্ট-সূচনা হয়F
১ থেকে পয়েন্ট [dcl.init] / 8-তে (F
যদি ব্যবহারকারী-ঘোষিত হয় এবং তার প্রথম ঘোষণায় স্পষ্টতই খেলাপি বা মুছে ফেলা না হয় তবে সিটি ফাংশনটি ব্যবহারকারী দ্বারা সরবরাহ করা হয় Link লিঙ্ক )