ساختارهای شرطی در ++C
1396/03/19

حلقه های تکرار در ++C
1395/11/20

عملگرها در زبان ++C
1395/11/06

کلاس های ذخیره متغییر ها در ++C
1395/06/10

لیترال و ثابت در ++C
1395/05/07

کلاس های ذخیره متغییر ها در ++C


ناصر نادری 1395/06/10

بنام خدا. در این جلسه از آموزش های C++ قصد داریم روی انواع ذخیره متغییر ها در این زبان کار کنیم که مبحث  پایه ای و مهمی هم هست. در اینجا ما در واقع کلاسهای ذخیره سازی رو با هم بررسی خواهیم کرد .

تعریف : کلاس ذخیره سازی اشاره به دامنه دیده شدن و طول حیات یک متغییر یا تابع داره. انواع کلاسهای ذخیره سازی در C++ :

1-    Auto

2-    Register

3-    Static

4-    Extern

5-    Mutable

 

کلاس ذخیره سازی auto :

بطور پیشفرض هر متغییری که تعریف میکنیم auto هست و قوانین محلی یا سراسری بودن روی اونها بدون هیچ استثنایی اجرا میشه :


{
   int mount;
   auto int month;
}

توی مثال بالا هر دو تعریف یکی هستن و داخل براکت ها معتبر و قابل استفاده هستن.

کلاس ذخیره سازی register :

وقتی یک متغییر رو تعریف میکنیم یک فضای ذخیره سازی در حافظه ram براش رزرو میشه. در صورتی که قبل از تعریف کلمه کلیدی register رو بیاریم در واقع از کلاس ذخیره سازی  ثبات یا register استفاده کردیم. یعنی به کامپایلر میگیم که براش توی ثبات های cpu  جا رزرو کنه نه در حافظه ram  . روشن هست که اندازه داده ما در این صورت محدود و معمولا در حد یک word یا 2 بایت خواهد بود. در مواردی که سرعت بالای ذخیره سازی برای حجم کمی از داده لازم باشه بطور محدود استفاده از نوع ذخیره سازی register بسیار موثر خواهد بود.

 


{
   register int  age;
}

کلاس ذخیره سازی static  :

کلا وقتی میخواییم توی چرخه اجرای یک برنامه مقدار یک متغییر تغییر نکنه و هر جا آخرین تغییرات رو نگه داره از این روش استفاده میکنیم.  اگه اون رو بصورت  محلی تعریف کنیم باعث میشه که مقدار خودش رو بین توابع حفظ کنه .

کاربرد static  توی اعضای کلاس که بعدا در موردش بحث خواهیم کرد موجب میشه که تمامی آبجکت ها به یک مقدار از اون عضو کلاس دسترسی داشته باشن.

به مثال زیر توجه کنید :


#include <iostream>
 
// پیش تعریف یک تابع
void func(void);
 
static int count = 10; /* یک متغییر سراسری از نوع ایستا یا static */
 
main()
{
    // تازمانی که مقدار
    while(count--)
    {
       func();
    }
    return 0;
}
// تعریف بدنه تابع
void func( void )
{
    static int i = 5; // تعریف یک متغییر محلی از نوع ایستا
    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  :

برای دادن ارجاع به یک متغییر در تمام فایلهای مربوط به یک برنامه از این کلمه کلیدی استفاده میکنیم.  یعنی برای share  کردن یک متد و یا یک متغییر بین فایلهای مختلف پروژه ازش استفاده میکنیم.

در این صورت در فایلی که میخواد از یک متغییر تعریف شده در فایل دیگه استفاده کنه باید همون متغییر رو با کلمه کلیدی extern  ایجاد کنیم . به این ترتیب توی فایل دوم از پروژه میتونیم متغییر فایل اول رو ببینیم.


اول main.cpp
#include <iostream>

//تعریف یک متغییر سرارسری برای استفاده در فایلهای دیگه 
int count ;
// این متد توی فایل دوم ایجاد شده اینجا extern شده تا بیتونیم ازش استفاده کنیم
extern void write_extern();
 
main()
{
   count = 5;
   //فراخوانی تابع extern فایل user.cpp
   write_extern();
}
/////////////////////////////////////////////////////////////////////////
//فایل دوم uses.cpp
#include <iostream>
 
//تعریف متغییر هم نام متغییر فایل اول بصورت extern
extern int count;
 
void write_extern(void)
{
    //استفاده از متغییر extern
   std::cout << "Count is " << count << std::endl;
}

کلاس ذخیره سازی mutable :

فقط برای کلاس کاربرد داره . با استفاده از این کلمه کلیدی میتونیم تعریف ثابتها رو هم توی کلاسهای مختلف owerride  کنیم که بعدا در بحث شی گرایی بهش خواهیم پرداخت.

در پناه حق...

فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد
درباره نویسنده
admin
ناصر نادری
prgnaderi@hotmail.com
فوق لیسانس مهندسی نرافزار- برنامه نویس و مدرس دانشگاه
نظرات شما
نظر جدید