زبان برنامهنویسی ++C از کلاسهای حافظه (Storage Classes) مختلفی برای تعریف متغیرها پشتیبانی میکند.
کلاس حافظه اتوماتیک (auto)
[برگرد بالا]
این کلاس اصلیترین کلاس حافظه زبان ++C محسوب میشود. متغیرهایی که توسط این کلاس تعریف میشوند، با خروج از محدوده تعریف به طور خودکار از بین میروند. بنابراین تمامی متغیرهای عادی از این نوع کلاس هستند. یعنی شما برای مشخص کردن کلاس حافظه اتوماتیک نیاز به انجام کار خاصی ندارید. اما برای تاکید بر اتوماتیک بودن کلاس حافظه، میتوانید از کلمه کلیدی auto استفاده کنید. به عنوان نمونه، دو عبارت زیر هم ارز هستند:
توجه: مفهوم کلمه کلیدی auto در 11++C و بعدتر تغییر یافته و به معنی کلاس حافظه اتوماتیک نیست.
کلاس حافظه استاتیک (static)
[برگرد بالا]
متغیرهای کلاس حافظه استاتیک تا اتمام برنامه حافظه اختصاصی خودشان را حفظ میکنند؛ حتی اگر کنترل برنامه به خارج ناحیه تعریف آنها منتقل شود. مثال زیر را در نظر بگیرید:
void func() {
static int y = 1;
cout << y << "\t";
y *= 2;
}
int main() {
func();
func();
func();
return 0;
}
خروجی برنامه:
در اولین فراخوانی تابع 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();
}
خروجی برنامه:
کلاس حافظه ثبات (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; // مجاز است
...
}