در این جلسه از آموزش زبان ++C به بررسی کلاس های ذخیره سازی در ++C میپردازیم. کلاسهای ذخیرهسازی (Storage Class) دامنه و طول عمر متغیرها ویا توابع درون یک برنامه ++C را تعریف میکنند. این مشخصه پیش از نوع داده مورد نظر قرار میگیرد. کلاسهای ذخیرهسازی که در برنامه ++C قابل اعمال هستند در زیر آمده است.
- auto
- register
- static
- extern
- mutable
کلاس ذخیرهسازی auto
کلاس ذخیرهسازی auto، کلاس پیشفرض برای همه متغیرهای محلی میباشد.
{ int mount; auto int month; }
مثال بالا دو متغیر متفاوت با کلاس یکسان، یعنی auto را نشان میدهد که تنها درون توابع قابل استفاده هستند،در واقع این متغیرها محلی هستند.
کلاس ذخیرهسازی register
کلاس ذخیرهسازی register برای تعریف متغیرهایی به کار میرود که به جای ذخیره در RAM، در رجیسترها ذخیره میشوند. یعنی حداکثر اندازه این متغیرها برابر با اندازه یک رجیستر (معمولاً یک کلمه) بوده و نمیتوان عملگر یگانی «&» را به آنها اعمال کرد (زیرا به هیچ مکانی از حافظه اشاره نمیکند).
{ register int miles; }
رجیستر باید تنها برای متغیرهایی به کار رود که به دسترسی بسیار سریع نیاز دارند، مانند شمارندهها. همچنین باید متذکر شد که تعریف register بدین معنی نیست که متغیر در یک رجیستر ذخیره خواهد شد، بلکه بدین معنی است که بسته به سخت افزار و محدودیتهای پیادهسازی، متغیر ممکن است در یک رجیستر ذخیره شود.
کلاس ذخیرهسازی static
کلاس ذخیرهسازی static سبب میشود متغیر محلی در تمام طول حیات برنامه مقدار خود را حفظ کند، و دیگر با خارج شدن از دامنه آن، متغیر ما از بین نرود. بنابراین، ایستا (استاتیک) کردن متغیرهای محلی این امکان را فراهم میکند که مقدارشان را بین فراخوانی توابع مختلف حفظ کنند.
ویرایشگر static را میتوان به متغیرهای سراسری نیز اعمال کرد. در این صورت، دامنه آن متغیر به فایلی که در آن تعریف شده است محدود میماند.
در ++C، هنگامیکه داده عضو یک کلاس را ایستا میکنیم، باعث میشود که تنها یک کپی از آن بین همه ی اشیا آن کلاس به اشتراک گذاشته شود.
#include <iostream> // Function declaration void func(void); static int count = 10; /* Global variable */ main() { while(count--) { func(); } return 0; } // Function definition void func( void ) { static int i = 5; // local static variable i++; std::cout << "i is " << i ; std::cout << " and count is " << count << std::endl; }
با کامپایل و اجرای کد فوق، نتیجه زیر حاصل میشود.
i is 6 and count is 9 i is 7 and count is 8 i is 8 and count is 7 i is 9 and count is 6 i is 10 and count is 5 i is 11 and count is 4 i is 12 and count is 3 i is 13 and count is 2 i is 14 and count is 1 i is 15 and count is 0
کلاس ذخیرهسازی extern
کلاس ذخیرهسازی extern برای اشاره به متغیری به کار میرود که از طریق تمام فایلهای یک برنامه قابل دسترسی است. اگر از extern برای تعریف یک متغیر استفاده کنید، نمیتوانید آن را مقداردهی اولیه کنید زیرا آن متغیر تنها به منزلهی یک نام برای یک متغیر در مکانی از حافظه است که قبلاً تعریف شده است.
اگر چندین فایل دارید و یک متغیر یا تابع سراسری دارید که در فایلهای دیگر هم قابل استفاده است، آنگاه برای اشاره به آن متغیر یا تابع از طریق فایل های دیگر،باید از extern استفاده کنید. extern تنها برای اعلان یک متغیر یا تابع سراسری در دیگر فایلها استفاده میشود.
چنان که در زیر توضیح خواهیم داد، بیشترین کاربرد ویرایشگر extern در جاهایی است که یک متغیر یا تابع سراسری بین دو یا چند فایل به اشتراک گذاشته میشود.
فایل اول: main.cpp
#include <iostream> int count ; extern void write_extern(); main() { count = 5; write_extern(); }
فایل دوم: support.cpp
#include <iostream> extern int count; void write_extern(void) { std::cout << "Count is " << count << std::endl; }
در اینجا، کلمه کلیدی extern برای اعلان متغیر count در فایل دیگری استفاده میشود.حال دوفایل را به شکل زیر کامپایل کنید.
$g++ main.cpp support.cpp -o write
این کد فایل اجرایی write را تولید میکند، فایل write را اجرا کرده و نتیجه را به شکل زیر مشاهده کنید.
$./write 5
کلاس ذخیرهسازی mutable
مشخصه mutable تنها به اشیا یک کلاس اعمال میشود، که در ادامه این آموزش راجع به آن صحبت خواهیم کرد. این ویرایشگر به یک عضو از یک شی اجازه میدهد تا توابع عضو ثابت (const) را بازنویسی (override) کند. یعنی، یک عضو mutable را میتوان توسط یک تابع عضو ثابت ویرایش کرد.
منبع: ترجمه از سایت tutorialspoint.com
در جلسه بعدی آموزش ++C با ما همراه باشید و لطفا نظر خودتان را در قسمت کامنتها ⇓ بنویسید. در ضمن اگر علاقمند بودید توصیه میکنیم آموزشهای زبان پایتون را هم در کنار زبان ++C مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.