সি ++ 11 এর আগে আমরা কেবলমাত্র অবিচ্ছেদ্য বা গণনা প্রকারের স্ট্যাটিক কনস্ট সদস্যদের উপর শ্রেণি সূচনা করতে পারি। স্ট্রাস্ট্রাপ তার সি ++ এফএকিউতে এটি আলোচনা করে নিম্নলিখিত উদাহরণটি দিয়েছেন:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
এবং নিম্নলিখিত যুক্তি:
তাহলে এই অসুবিধাগুলি বিধিনিষেধ কেন বিদ্যমান? একটি শ্রেণি সাধারণত একটি শিরোনাম ফাইলে ঘোষিত হয় এবং একটি শিরোনাম ফাইল সাধারণত অনেক অনুবাদ ইউনিটে অন্তর্ভুক্ত থাকে। তবে জটিল লিঙ্কারের নিয়মগুলি এড়াতে, সি ++ এর প্রয়োজন প্রতিটি বস্তুর একটি অনন্য সংজ্ঞা রয়েছে। এই নিয়মটি ভঙ্গ করা হবে যদি সি ++ সত্তাগুলির বস্তুগুলির হিসাবে মেমোরিতে সঞ্চয় করা দরকার সত্তাগুলির শ্রেণিবদ্ধ সংজ্ঞা মঞ্জুরি দেয়।
যাইহোক, সি ++ 11 এই বিধিনিষেধগুলি শিথিল করে, অ স্থিতিশীল সদস্যদের (-12.6.2 / 8) শ্রেণিতে শুরুর অনুমতি দেয়:
কোনও অ-প্রতিনিধি কনস্ট্রাক্টরে, যদি প্রদত্ত নন-স্ট্যাটিক ডেটা সদস্য বা বেস ক্লাস কোনও মেমো-ইনিশিয়ালার -আইডি দ্বারা মনোনীত না করা হয় ( মেম-ইনিশিয়ালাইজার-তালিকা নেই এমন ক্ষেত্রে যা কনস্ট্রাক্টরের কোটার-ইনিশিয়ালাইজার নেই ) এবং সত্তা কোনও বিমূর্ত শ্রেণীর ভার্চুয়াল বেস শ্রেণি নয় (10.4), তারপরে
- সত্তা যদি কোনও অ-স্থিতিশীল ডেটা সদস্য হয় যার একটি ব্রেস-বা-সম-ইনিশিয়ালাইজার থাকে , সত্তাটি 8.5 -তে বর্ণিত হিসাবে শুরু করা হয়;
- অন্যথায়, সত্তা যদি একটি বৈকল্পিক সদস্য হয় (9.5), কোনও আরম্ভ করা হয় না;
- অন্যথায়, সত্তাটি ডিফল্ট-ইনিশিয়ালড (8.5)।
বিভাগ 9.4.2 এছাড়াও constexpr
নির্দিষ্ট -স্থির সদস্যদের স্পেসিফায়ারের সাথে চিহ্নিত করা হলে শ্রেণিকেন্দ্রিক সূচনার অনুমতি দেয় ।
তাহলে আমাদের C ++ 03 এ থাকা বিধিনিষেধের কারণগুলির কী হয়েছিল? আমরা কি কেবল "জটিল লিঙ্কার বিধিগুলি" গ্রহণ করি বা অন্য কিছু পরিবর্তন করেছি যা এটি কার্যকর করা সহজ করে তোলে?