زبان برنامهنویسی ++C از کلاسهای حافظهی (Storage Classes) مختلفی برای تعریف متغیرها پشتیبانی میکند.
کلاس حافظهی اتوماتیک (auto)
این کلاس اصلیترین کلاس حافظهی زبان ++C محسوب میشود. متغیرهایی که توسط این کلاس تعریف میشوند، با خروج از محدودهی تعریف به طور خودکار از بین میروند. بنابراین تمامی متغیرهای عادی از این نوع کلاس هستند. یعنی شما برای مشخص کردن کلاس حافظه اتوماتیک نیاز به انجام کار خاصی ندارید. اما برای تاکید بر اتوماتیک بودن کلاس حافظه، میتوانید از کلمهی کلیدی auto استفاده کنید. به عنوان نمونه، دو عبارت زیر هم ارز هستند:
int n;
auto int n;
توجه: مفهوم کلمهی کلیدی auto در 11++C و بعدتر تغییر یافته و به معنی کلاس حافظهی اتوماتیک نیست.
کلاس حافظهی استاتیک (static)
متغیرهای کلاس حافظهی استاتیک تا اتمام برنامه حافظهی اختصاصی خودشان را حفظ میکنند؛ حتی اگر کنترل برنامه به خارج ناحیه تعریف آنها منتقل شود. مثال زیر را در نظر بگیرید:
void func( )
{
static int y = 1;
cout << y << "\t";
y *= 2;
}
void main( )
{
func( );
func( );
func( );
}
خروجی برنامه:
1 2 4
در اولین فراخوانی تابع func، برای متغیر y حافظه اختصاص داده میشود. خط آخر تابع مقدار 2 را در y قرار میدهد. اما با خروج از تابع متغیر از بین نمیرود. بار بعد که تابع فراخوانی شد، مقداردهی اولیه y (یعنی 1)در نظر گرفته نمیشود. در نتیجه عدد 2 چاپ میشود و الی آخر. حافظهی اختصاصی برای y فقط زمانی آزاد خواهد شد که اجرای برنامه تمام شود.
توجه: استفاده از دستور جداگانه برای مقداردهی اولیه متغیر استاتیک خطای منطقی محسوب میشود:
void func( )
{
static int y;
y = 1;
cout << y << "\t";
y *= 2;
}
void main( )
{
func( );
func( );
func( );
}
خروجی برنامه:
1 1 1
کلاس حافظهی ثبات (register)
زمانی که متغیری از نوع کلاس حافظهی ثبات تعریف شود، حافظه برای متغیر به جای حافظهی اصلی(RAM) از حافظهی پردازندهی مرکزی (CPU) اختصاص داده میشود. در نتیجه سرعت خواندن و نوشتن متغیر بالا میرود. از این نوع متغیرها عموما برای شمارندهی حلقهها استفاده میشود، تا سرعت اجرای حلقه بالاتر رود.
void main( )
{
register int i;
for( i = 0 ; i < 10 ; i++ )
{
cout << i * i << "\t";
}
}
توجه: استفاده از کلاس حافظهی ثبات یک درخواست محسوب میشود. یعنی ممکن است بنا به هر دلیلی تخصیص حافظه از CPU امکان نداشته باشد. در این حالت کلاس حافظه در نظر گرفته نمیشود.
کلاس حافظهی خارجی (extern)
پروژههای بزرگ همیشه از چندین فایل تشکیل میشوند. برای دسترسی به متغیری از فایل دیگر باید از کلاس حافظهی خارجی استفاده کنید. به عنوان مثال:
file1:
int n;
file2:
extern int n;
cout << n;
توجه:
در استفاده از کلاس حافظهی خارجی باید به دو نکته توجه داشت:
1 - کلاس حافظهی خارجی برای متغیرهای عمومی استفاده میشود.
2 - دو فایلی که با هم تبادل متغیر میکنند باید از یک پروژه باشند.
کلاس حافظهی mutable
این کلاس حافظه در تعاریف کلاسها و اشیاء کلاس کاربرد دارد. زمانی که یک شیء از کلاسی به صورت constتعریف شده باشد، امکان تغییر اعضای آن وجود ندارد. اما اگر عضوی با کلمهی کلیدی mutable معرفی گردد، این امکان فراهم میشود. به عنوان مثال:
class MyClass
{
...
public:
...
int a;
mutable int b;
...
};
int main( )
{
const MyClass sample;
sample.a = 1; // مجاز نیست
sample.b = 2; // مجاز است
...
}