একটি স্টোরেজ ক্লাস একটি C++ প্রোগ্রামে ভেরিয়েবল এবং/অথবা ফাংশনের স্কোপ (দৃশ্যমানতা) এবং লাইফটাইম ডিফাইন করে। এই স্পেসিফায়ারগুলো যে টাইপকে মডিফাই করে তার আগে থাকে। C++ প্রোগ্রামে ব্যবহার করা যাওয়া স্টোরেজ ক্লাসগুলো হলো:
- auto
- register
- static
- extern
- mutable
C-এ, auto স্টোরেজ ক্লাস স্পেসিফায়ার আপনাকে স্বয়ংক্রিয় স্টোরেজ সহ একটি ভেরিয়েবল এক্সপ্লিসিটলি ডিক্লেয়ার করতে দেয়। auto স্টোরেজ ক্লাস একটি ব্লকে ডিক্লেয়ার করা ভেরিয়েবলগুলির জন্য ডিফল্ট। একটি ভেরিয়েবল x যার স্বয়ংক্রিয় স্টোরেজ আছে, সেটি মুছে ফেলা হয় যখন x ডিক্লেয়ার করা ব্লকটি এক্সিট করে।
আপনি শুধুমাত্র একটি ব্লকে ডিক্লেয়ার করা ভেরিয়েবল들의 নাম বা ফাংশন প্যারামিটার들의 নামের ওপর auto স্টোরেজ ক্লাস স্পেসিফায়ার প্রয়োগ করতে পারেন। তবে, এই নামগুলোর ডিফল্টরূপে স্বয়ংক্রিয় স্টোরেজ থাকে। তাই ডেটা ডিক্লেয়ারেশনে স্টোরেজ ক্লাস স্পেসিফায়ার auto সাধারণত অপ্রয়োজনীয়।
এটি প্রাথমিকভাবে সিনট্যাক্টিক্যাল কম্প্যাটিবিলিটির জন্য C++-এ আনা হয়েছিল, যদিও পরে এটি নিজস্ব অর্থ অর্জন করে: স্বয়ংক্রিয় টাইপ ডিডাকশন।
C-এ, register স্টোরেজ ক্লাস স্পেসিফায়ার কম্পাইলারকে ইঙ্গিত দেয় যে অবজেক্টটিকে একটি মেশিন রেজিস্টারে সংরক্ষণ করা উচিত। register স্টোরেজ ক্লাস স্পেসিফায়ারটি সাধারণত بشدة ব্যবহৃত ভেরিয়েবলগুলোর জন্য নির্দিষ্ট করা হয়, যেমন একটি লুপ কন্ট্রোল ভেরিয়েবল, আশা করা হয় যে অ্যাক্সেস টাইম কমিয়ে পারফরম্যান্স বাড়াবে। তবে, কম্পাইলার এই অনুরোধ মেনে চলার জন্য বাধ্য নয়। অধিকাংশ সিস্টেমে রেজিস্টারের সীমিত আকার এবং সংখ্যা থাকায়, قليلًا ভেরিয়েবলই আসলে রেজিস্টারে রাখা সম্ভব।
static স্টোরেজ ক্লাস কম্পাইলারকে নির্দেশ করে একটি লোকাল ভেরিয়েবলকে প্রোগ্রামের লাইফটাইম পর্যন্ত আস্তিত্বে রাখতে, প্রতিবার স্কোপে আসা এবং যাওয়ার সময় তৈরি ও ধ্বংস করার পরিবর্তে। তাই লোকাল ভেরিয়েবলকে static করলে সেগুলো ফাংশন কলের মধ্যে তাদের মান বজায় রাখতে পারে।
extern স্টোরেজ ক্লাস স্পেসিফায়ার আপনাকে এমন অবজেক্ট ডিক্লেয়ার করতে দেয় যা একাধিক সোর্স ফাইল ব্যবহার করতে পারে। একটি extern ডিক্লেয়ারেশন বর্তমান সোর্স ফাইলের পরবর্তী অংশে ভেরিয়েবলটি ব্যবহারযোগ্য করে তোলে। এই ডিক্লেয়ারেশন ডেফিনিশনকে প্রতিস্থাপন করে না। ডিক্লেয়ারেশনটি এক্সটার্নালি ডিফাইন করা ভেরিয়েবলটি বর্ণনা করতে ব্যবহৃত হয়।
mutable স্টোরেজ ক্লাস স্পেসিফায়ারটি শুধুমাত্র একটি ক্লাস ডেটা মেম্বারের ওপর ব্যবহৃত হয়, যাতে অবজেক্ট const ডিক্লেয়ার করা থাকলেও সেই মেম্বারটি মোডিফাইযোগ্য থাকে। আপনি static বা const ডিক্লেয়ার করা নাম বা রেফারেন্স মেম্বারের সাথে mutable স্পেসিফায়ার ব্যবহার করতে পারবেন না।
উদাহরণ
class A {
public:
A() : x(4), y(5) { };
mutable int x;
int y;
};
int main() {
const A var2;
var2.x = 345;
// var2.y = 2345;
}
কম্পাইলার var2.y = 2345 অ্যাসাইনমেন্ট অনুমতি দেবে না কারণ var2 const ডিক্লেয়ার করা। কিন্তু var2.x = 345 অনুমতি দেবে কারণ A::x mutable ডিক্লেয়ার করা।