
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
آموزش Storage Class ها در C++
آموزش Storage Class ها در C++ / کلاس های تعیین کننده ی بخش حافظه جهت ذخیره ی اطلاعات آبجکت
کلاس Storage در C++ تعیین می کند که کدام بخش از حافظه برای ذخیره ی اطلاعات آّجکت تخصیص یافته و این میزان حافظه تا چه مدت در انحصار آبجکت مورد نظر باید قرار داشته باشد. به عبارت دیگر، Storage class حوزه دسترسی (visibility یا scope) و چرخه ی حیات (life-time) متغیرها و/یا توابع در برنامه ی C++ را تعیین می کند. این کلیدواژگان (توصیف کنندگان) قبل از data type که نوع متغیر را تعیین می کند، درج می شود. در زیر Storage class های مورد استفاده در C++ را مشاهده می کنید:
- auto
- register
- static
- extern
- mutable
auto storage class (موارد استفاده از کلیدواژه ی auto)
auto کلیدواژه ای است که به صورت پیش فرض برای تمامی متغیرهایی که به صورت محلی تعریف شده اند، مورد استفاده قرار می گیرد. به بیان دیگر، متغیرهایی که داخل بدنه ی تابع تعریف شده اند (= متغیرهای محلی)، به صورت پیش فرض با این کلیدواژه نشانه گذاری می شوند.
{ int mount; auto int month; }
در مثال فوق دو متغیر محلی را مشاهده می کنید که با کلیدواژه ی auto علامت گذاری شده اند. کلیدواژه ی auto تنها زمانی قابل استفاده می باشد که متغیر داخل بدنه ی تابع و به بیان ساده تر به صورت محلی تعریف شده باشد. بنابراین با خارج شدن از محدود ی اعلان خود به طور خودکار از حافظه حذف می گردد.
register Storage Class (موارد استفاده از کلیدواژه ی register)
کلیدواژه ی register برای تعریف متغیرهای محلی که می بایست بجای RAM داخل register (حافظه ای با قابلیت دسترسی سریع و رندوم در اختیار CPU) ذخیره شوند، مورد استفاده قرار می گیرد. به عبارت دیگر زمانی که متغیری با این کلیدواژه اعلان می شود، دارای یک حداکثر اندازه ی مشخص است که برابر ظرفیت register (معادل سایز یک word) بوده و همچنین امکان اعمال عملگر یگانی '&' برروی آن وجود ندارد (چرا که جایی در حافظه برای ذخیره ی اطلاعات ندارد).
به عبارت دیگر چنانچه توسعه دهنده متغیری را با واژه ی register تعریف یا علامت گذاری کند، آنگاه حافظه ی مورد نیاز از register یا حافظه ی سریع مستقر در پردازنده ی مرکزی برای ذخیره ی مقدار آن متغیر درنظر گرفته می شود.
1 2 3 4 | { register int miles; } <button></button> |
لازم است دقت داشته باشید که کلیدواژه ی register ویژه ی متغیرهایی نظیر counter که لازم است به صورت تصادفی و سریع به مقادیر آن ها دسترسی صورت گیرد، استفاده می شود. علاوه بر آن، صرف تعریف کلیدواژه ی register، مقدار متغیر مربوطه داخل register ذخیره نمی شود، بلکه معنیش این است که مقدار متغیر احتمال دارد با توجه به محدودیت های سخت افزاری و پیاده سازی، داخل حافظه ی register نگه داشته شود.
Static Storage Class (موارد استفاده از کلیدواژه ی Static)
کلیدواژه ی static به کامپایلر اعلان می کند که یک متغیر محلی را تا پایان عمر یا چرخه ی حیات کل اپلیکیشن در حافظه نگه دارد (زنده نگه دارد). بدین وسیله زمانی که متغیر ازحوزه ی اعلان و دسترسی (scope) خود خارج می شود، همچنان در حافظه باقی مانده و تا زمانی که برنامه ی جاری در حال اجرا است، از بین نمی رود.
بنابراین زمانی که توسعه دهنده متغیری را به صورت static تعریف می کند، آن متغیر بین توابع مختلف در یک فایل قابل دسترسی می باشد.
کلیدواژه ی static را می توان برای متغیرهای سراسری (global) نیز اعمال کرد. هنگامی که برنامه نویس متغیر مورد نظر را با این کلیدواژه ی static تعریف می کند، در واقع حوزه ی دسترسی به آن را محدود به فایل جاری (فایلی که متغیر در آن تعریف شده) می نماید.
در ++C، زمانی که متغیری داخل کلاس با واژه ی static تعریف می شود، یک کپی از آن متغیر بین تمامی آبجکت های ساخته شده از روی کلاس مورد نظر به اشتراک گذاشته می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #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; } </iostream><button></button> |
زمانی که از قطعه کد بالا خروجی می گیرید، نتیجه ی زیر را بدست می دهد:
1 2 3 4 5 6 7 8 9 10 11 | 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 <button></button> |
کلیدواژه ی Stern (Stern storage class)
چنانچه برنامه نویس متغیری را با کلیدواژه ی extern تعریف و علامت گذاری کند، آنگاه اشاره گری (reference) به آن متغیر سراسری، به طوری که برای تمامی فایل های آن برنامه قابل دسترسی باشد، فراهم می گردد.
پروژه های بزرگ از چندین فایل تشکیل می شوند. برای اینکه از فایل های مختلف پروژه بتوان به متغیر دسترسی داشت، بایستی آن را با کلیدواژه ی extern تعریف نمایید. لازم به ذکر است متغیر اعلان شده با extern، قابل مقداردهی اولیه نیست چرا که صرفا اسم متغیر را به مکانی از پیش تعریف شده در حافظه ارجاع می دهد.
چنانچه در پروژه ی بزرگ خود که از چندین فایل تشکیل شده، یک متغیر یا تابع سراسری (global) با هدف استفاده در چندین فایل از پروژه تعریف می کنید، لازم است بدانید که کلیدواژه ی extern در فایل دیگر استفاده می شود و اشاره گری (reference) به متغیر یا تابع تعریف شده فراهم می نماید.
به بیان ساده تر، کلیدواژه ی extern برای تعریف متغیر یا تابع سراسری در فایلی دیگر بکار می رود. توصیه می شود از این واژه ی کلیدی زمانی استفاده نمایید که یک متغیر یا تابع بین دو یا چندین فایل از پروژه مشترک بوده و توسط همگی آن ها فراخوانی می شود مانند نمونه ی زیر –
فایل 1: main.cpp
1 2 3 4 5 6 7 8 | #include <iostream> int count ; extern void write_extern(); main() { count = 5; write_extern(); } </iostream><button></button> |
فایل 2: support.cpp
1 2 3 4 5 6 | #include <iostream> extern int count; void write_extern( void ) { std::cout << "Count is " << count << std::endl; } </iostream><button></button> |
در مثال جاری، کلیدواژه ی extern برای اعلان متغیری سراسری به نام count (جهت استفاده در چندین فایل از پروژه) در فایلی دیگر بکار می رود. دو فایل بالا را مانند زیر کامپایل نمایید:
$g++ main.cpp support.cpp -o write
با اجرای این دستور، یک برنامه ی اجرایی write تولید می شود. حال write را اجرا کرده و نتیجه را بررسی نمایید.
خروجی:
1 2 3 | $./write 5 <button></button> |
کلیدواژه ی mutable (موارد استفاده از mutable)
این امکان در تعریف کلاس ها و آبجکت های ساخته شده از روی کلاس بکار می رود. کلیدواژه mutable در واقع به عضو یک آبجکت که با کلمه ی کلیدی const اعلان شده (تمامی اعضای آن ثابت بوده و مقدارشان غیرقابل تغییر می باشد) و بایستی غیرقابل تغییر باشد، این قابلیت را می دهد که مقدارش بروز رسانی شود.
به عبارت دیگر عضوی از آبجکت const که با کلیدواژه ی mutable تعریف شده باشد، مقدارش قابل تغییر می باشد.