আমি কেন staticক্লাসে ডেটা সদস্যদের আরম্ভ করতে পারি না ?
সি ++ স্ট্যান্ডার্ড ক্লাসের অভ্যন্তরে কেবল স্থিতিশীল ধ্রুবক অবিচ্ছেদ্য বা গণনা প্রকারকে মঞ্জুরি দেয়। aঅন্যদের না থাকলেই এই কারণটি শুরু করার অনুমতি দেওয়া হয়।
তথ্যসূত্র:
সি ++ 03 9.4.2 স্ট্যাটিক ডেটা সদস্য
-4 §
স্থিতিশীল ডেটা সদস্য যদি কনস্টিভ ইন্টিগ্রাল বা কনস্টের গণনা প্রকারের হয়, শ্রেণির সংজ্ঞাতে এর ঘোষণার ফলে একটি ধ্রুবক-আরম্ভকারী নির্দিষ্ট করা যায় যা একটি অবিচ্ছেদ্য ধ্রুবক প্রকাশ (5.19) হবে। সেক্ষেত্রে সদস্যটি অবিচ্ছেদ্য ধ্রুবক প্রকাশে উপস্থিত হতে পারে। সদস্যটি প্রোগ্রামে ব্যবহৃত হয় এবং নাম স্থানের স্কোপ সংজ্ঞাটিতে কোনও প্রাথমিককরণ উপস্থিত না থাকলে সদস্যের নাম স্পেস স্কোপে এখনও সংজ্ঞায়িত করা হবে।
অবিচ্ছেদ্য প্রকারগুলি কী কী?
সি ++ 03 3.9.1 মৌলিক ধরনের
§7
প্রকারের বিল, চর, wchar_t, এবং স্বাক্ষরিত এবং স্বাক্ষরযুক্ত স্বাক্ষর পূর্ণসংখ্যার প্রকারগুলি সম্মিলিতভাবে অবিচ্ছেদ্য প্রকারগুলি বলা হয় .4৩) অবিচ্ছেদ্য প্রকারের সমার্থক শব্দটি পূর্ণসংখ্যার প্রকার।
পাদটীকা:
৪৩) সুতরাং, গণনাগুলি (.2.২) অবিচ্ছেদ্য নয়; তবে, পরিসংখ্যানগুলি ইনট, স্বাক্ষরবিহীন ইনট, লম্বা বা স্বাক্ষরবিহীন দীর্ঘ হিসাবে উন্নীত করা যেতে পারে, ৪.৪-তে বর্ণিত।
কার্যসংক্রান্ত:
আপনি আপনার শ্রেণীর সংজ্ঞাটির মধ্যে একটি অ্যারে শুরু করতে এনাম ট্রিক ব্যবহার করতে পারেন ।
class A
{
static const int a = 3;
enum { arrsize = 2 };
static const int c[arrsize] = { 1, 2 };
};
স্ট্যান্ডার্ড কেন এটি অনুমতি দেয় না?
বর্জন এটিকে যথাযথভাবে এখানে ব্যাখ্যা করেছেন :
একটি শ্রেণি সাধারণত একটি শিরোনাম ফাইলে ঘোষিত হয় এবং একটি শিরোনাম ফাইল সাধারণত অনেক অনুবাদ ইউনিটে অন্তর্ভুক্ত থাকে। তবে জটিল লিঙ্কারের নিয়মগুলি এড়ানোর জন্য, সি ++ এর প্রয়োজন প্রতিটি বস্তুর একটি অনন্য সংজ্ঞা রয়েছে। এই নিয়মটি ভঙ্গ হবে যদি সি ++ সত্তাগুলির শ্রেণীর সংজ্ঞা দেয় যা অবজেক্ট হিসাবে মেমোরিতে সঞ্চয় করা দরকার।
কেন কেবলমাত্র static constঅবিচ্ছেদ্য প্রকার এবং এনামগুলিকে শ্রেণীর সূচনা করার অনুমতি দেওয়া হচ্ছে?
উত্তরটি লুকিয়ে আছে বার্জারের উক্তিটি খুব কাছ থেকে পড়তে হবে,
"সি ++ এর প্রয়োজন প্রতিটি বস্তুর একটি অনন্য সংজ্ঞা রয়েছে That এই নিয়মটি যদি ভেঙে দেওয়া হত যদি সি ++ সত্তা শ্রেণীর সংজ্ঞা দেবে যা বস্তু হিসাবে স্মৃতিতে সংরক্ষণ করতে হয়" "
মনে রাখবেন যে কেবল static constপূর্ণসংখ্যাগুলি সংকলনের সময় ধ্রুবক হিসাবে বিবেচনা করা যেতে পারে। সংকলকটি জানে যে পূর্ণসংখ্যার মান যে কোনও সময় পরিবর্তিত হবে না এবং তাই এটি নিজস্ব যাদু প্রয়োগ করতে পারে এবং অপ্টিমাইজেশান প্রয়োগ করতে পারে, সংকলকটি এই জাতীয় শ্রেণীর সদস্যদের কেবল ইনলাইন করে অর্থাৎ এগুলি আর মেমরিতে সংরক্ষণ করা হয় না, যেহেতু স্মৃতিতে সংরক্ষণের প্রয়োজনীয়তা অপসারণ করা হয় , এটি যেমন ভেরিয়েবলগুলি বর্ণন দ্বারা বর্ণিত ব্যতিক্রমকে ব্যতিক্রম দেয়।
এখানে লক্ষণীয় যে এখানে static constঅবিচ্ছেদ্য মানগুলিতে ইন-ক্লাস ইনিশিয়ালেশন থাকতে পারে এমন ধরণের ভেরিয়েবলের ঠিকানা গ্রহণের অনুমতি নেই। স্থিতিশীল সদস্যের ঠিকানা নেওয়া যেতে পারে (এবং কেবলমাত্র যদি) এটির শ্রেণীর বাইরে সংজ্ঞা থাকে his এটি উপরের যুক্তিটিকে আরও বৈধতা দেয়।
এনামগুলিকে এটি অনুমোদিত হয় কারণ একটি গণিত প্রকারের মানগুলি ব্যবহার করা যেতে পারে যেখানে ইনটগুলি আশা করা হয়। উপরে উদ্ধৃতি দেখুন
সি ++ 11 এ কীভাবে এই পরিবর্তন হয়?
সি ++ 11 নির্দিষ্ট পরিমাণে সীমাবদ্ধতা শিথিল করে।
সি ++ 11 9.4.2 স্ট্যাটিক ডাটা সদস্যদের
§3
যদি কোনও স্ট্যাটিক ডেটা সদস্য কনস্টাল আক্ষরিক ধরণের হয়, শ্রেণীর সংজ্ঞাতে এর ঘোষণাটি একটি ব্রেস-বা-সমমান-ইনিশিয়ালাইজার নির্দিষ্ট করতে পারে যেখানে প্রতিটি সূচনা-ধারাটি একটি অ্যাসাইনমেন্ট-এক্সপ্রেশন হয় একটি ধ্রুবক অভিব্যক্তি। আক্ষরিক ধরণের একটি স্ট্যাটিক ডেটা সদস্য constexpr specifier;যদি শ্রেণীর সংজ্ঞায় এটির সাথে ঘোষণা করা যায় তবে এর ঘোষণায় একটি ব্রেস-বা-সম-ইনিশিয়ালাইজার নির্দিষ্ট করা হবে যাতে প্রতিটি সূচনা-ধারাটি একটি অ্যাসাইনমেন্ট-এক্সপ্রেশনএকটি ধ্রুবক প্রকাশ। [দ্রষ্টব্য: এই উভয় ক্ষেত্রেই সদস্য স্থির মত প্রকাশের জন্য উপস্থিত হতে পারে। Noteend নোট] সদস্য যদি প্রোগ্রামে ব্যবহৃত হয় এবং নামপথের স্কোপ সংজ্ঞাটিতে কোনও আরম্ভকারী উপস্থিত না থাকে তবে সদস্যটির নাম স্পেস স্কোপে সংজ্ঞায়িত করা হবে।
এছাড়াও, সি ++ 11 হবে অনুমতি (§12.6.2.8) একটি অ স্ট্যাটিক ডাটা সদস্য যেখানে এটি ঘোষিত হয় সক্রিয়া করা (তার ক্লাসে)। এর অর্থ অনেক সহজ ব্যবহারকারী শব্দার্থক।
নোট করুন যে এই বৈশিষ্ট্যগুলি সর্বশেষতম জিসিসি ৪.7 এ এখনও প্রয়োগ করা হয়নি, সুতরাং আপনি এখনও সংকলনের ত্রুটি পেতে পারেন।