নিম্নলিখিত বাক্যগুলির সি ++ এর অর্থ কী:
জিরো-আরম্ভের,
ডিফল্ট-সূচনা, এবং
মান-আরম্ভের
একটি সি ++ বিকাশকারীদের তাদের সম্পর্কে কী জানা উচিত?
নিম্নলিখিত বাক্যগুলির সি ++ এর অর্থ কী:
জিরো-আরম্ভের,
ডিফল্ট-সূচনা, এবং
মান-আরম্ভের
একটি সি ++ বিকাশকারীদের তাদের সম্পর্কে কী জানা উচিত?
উত্তর:
একটি জিনিস অনুধাবন করা যায় যে 'মান-সূচনা' সি ++ 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;
}
int
, তবে m()
তৃতীয় লাইনের মান মি। গুরুত্বপূর্ণ যদি আপনি পরিবর্তন int m;
করতে B m;
। :)
A
এবং C
এই উদাহরণে ব্যবহার করা হয় না (এগুলি অন্য লিঙ্কযুক্ত উত্তর থেকে বহন করা হয়)। যদিও কীভাবে A
এবং কীভাবে C
নির্মাণ করা হয় তার বর্ণনা দেওয়ার সময় সি ++ 98 এবং সি ++ 03 বিভিন্ন পরিভাষা ব্যবহার করে , ফলাফল উভয় মানের ক্ষেত্রে একই। শুধুমাত্র struct B
বিভিন্ন আচরণে ফলাফল।
struct C { C() : m() {}; ~C(); B m; };
, তাহলে আপনি থাকবে m.m
0. হতে কিন্তু এটি ডিফল্ট-ইনিশিয়ালাইজ করবে m
আপনার মত বলতে সি ++ 03 করে, তারপর m.m
98 সি ++ মত না সক্রিয়া করা হবে।
সি ++ 03 স্ট্যান্ডার্ড 8.5 / 5:
টাইপ টির একটি অবজেক্টের শূন্য-সূচনা করার জন্য:
- টি যদি একটি স্কেলার প্রকার (3.9) হয় তবে অবজেক্ট টিতে রূপান্তরিত 0 (শূন্য) এর মানতে সেট করা হয়;
- যদি টি একটি নন-ইউনিয়ন শ্রেণীর ধরণের হয় তবে প্রতিটি ননস্ট্যাটিক ডেটা সদস্য এবং প্রতিটি বেস-ক্লাস সাবোবজেক্ট শূন্য-ইনিশিয়েটেড হয়;
- টি যদি ইউনিয়নের ধরণ হয় তবে অবজেক্টের প্রথম নাম করা ডেটা সদস্য শূন্য-ইনিশিয়েলড হয়;
- যদি টি একটি অ্যারের ধরণ হয় তবে প্রতিটি উপাদান শূন্য-সূচনাযুক্ত হয়;
- টি যদি রেফারেন্স টাইপ হয় তবে কোনও সূচনা হয় না।টাইপ টির একটি অবজেক্টের ডিফল্ট-আরম্ভ করার জন্য:
- টি যদি টি-পি-ওডি ক্লাসের ধরণ (ধারা 9) হয় তবে টির জন্য ডিফল্ট কনস্ট্রাক্টর বলা হয় (এবং টি যদি অ্যাক্সেসযোগ্য ডিফল্ট কনস্ট্রাক্টর না থাকে তবে ইনিশিয়েশনটি খারাপ-গঠিত হয়);
- যদি টি একটি অ্যারের ধরণ থাকে তবে প্রতিটি উপাদান ডিফল্ট-আরম্ভ হয়;
- অন্যথায়, অবজেক্টটি শূন্য-সূচনাযুক্ত izedকরার মূল্য আরম্ভ টাইপ টি উপায়ে একটি বস্তু:
- যদি টি ব্যবহারকারী-ঘোষিত কন্সট্রাক্টর (12.1) সঙ্গে একটি বর্গ প্রকার (ধারা 9) হয়, তাহলে টি ডিফল্ট কন্সট্রাকটর বলা হয় (এবং আরম্ভের মন্দ গঠিত হয় যদি টি কোনও অ্যাক্সেসযোগ্য ডিফল্ট কনস্ট্রাক্টর নেই);
- যদি টি কোনও ব্যবহারকারী-ঘোষিত কনস্ট্রাক্টর ছাড়াই নন-ইউনিয়ন শ্রেণীর ধরণ হয়, তবে প্রতিটি অ-স্থিতিশীল ডেটা সদস্য এবং টি এর বেস-ক্লাস উপাদানটি মান-আরম্ভ হয়;
- যদি টি একটি অ্যারের ধরণ হয় তবে প্রতিটি উপাদান মান-আরম্ভ হয়;
- অন্যথায়, অবজেক্টটি শূন্য-সূচনাযুক্ত izedএকটি প্রোগ্রাম যা রেফারেন্স ধরণের কোনও সত্তার ডিফল্ট-ইনিশিয়ালাইজেশন বা মান-ইনিশিয়ালাইজেশনকে কল করে তা তৈরি হয়। যদি টি কোনও সিভি-যোগ্য ধরনের হয় তবে টি-এর সিভি-অযোগ্য সংস্করণ শূন্য-আরম্ভকরণ, ডিফল্ট-আরম্ভকরণ এবং মান-সূচনাকরণের এই সংজ্ঞাগুলির জন্য ব্যবহৃত হয়।