تعریف تابع عضو کلاس بصورت volatile - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تعریف تابع عضو کلاس بصورت volatile

+5 امتیاز

چرا بعضی وقت ها تابع عضو کلاس volatile تعریف میشه ؟ 

بعد این که اگر تابع ای که عضو کلاس نیست اگر volatile تعریف بشه آیا تفاوتی با حالت معمولی داره ؟

volatile int f(){....}

 

سوال شده شهریور 3, 1393  بوسیله ی sailent (امتیاز 355)   16 44 59
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade

1 پاسخ

+6 امتیاز
 
بهترین پاسخ

سلام .

اول اینکه تابعی که شما بالا نوشتید فقط نوع برگشتیش volatile int هست .

دلیل اینکه توابع عضو کلاس volatile تعریف میشن اینکه مثلا شما یک کلاس دارید مثل این :

class A
{
public:
     void Func (void)
     {
           x = 0;
     }

     int x = 0;
};

حالا اگر یک شی از کلاس A ایجاد کنید که volatile باشه ، چون تابع Func به صورت volatile نیست برنامه کامپایل نمیشه .

volatile A myA;
myA.Func();

به دلیل تعریف کردن شی به صورت volatile ، متغییر thisی که به متد Func فرستاده میشه هم volatile میشه .و متد Funcی که بالا تعریف شده volatile نیست که متغییر this ی که volatile شده رو  بپذیره . برای همین متد رو باید به صورت volatile تعریف کنید که موقع ایجاد شی های اون کلاس به صورت volatile بتونه اون اشیا رو بپذیره .

همچین چیزی رو ما توی const هم میبینیم مثلا :

class A
{
public:
	A() : x(1) {};
	void Func (void) 
	{
		x = 0;
		cout<<x<<endl;
	}

	int x;
};

 

حالا یک شی از کلاس A به صورت const ایجاد میکنیم و متد Func رو براش صدا میزنیم :

const A p;
p.Func();

شی ایجاد شده به صورت const هست ، در صورتی که متد Func متدی هست که یک شی بدون const رو میگیره و متغییر xش رو تغییر میده .

پس توی این مورد هم ما باید یه متدی که از نوع const باشه هم برای اشیا const تعریف کنیم .

همونطور که بالا گفتم ، موضوع اینه که شی volatile باشه یا نباشه .

تفاوت یک متد volatile و غیر volatile برای اینه که شما میخواهید شی هایی از کلاس داشته باشید که volatile باشن ، پس باید توابع از نوع volatile هم براشون بنویسید . اگر هم شی های volatile ندارید نیازی نیست که این کار رو بکنید .

برای مفهوم خود volatile هم اینجا رو نگاه کنید : volatile در C++ چیست؟

پاسخ داده شده شهریور 4, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد دی 7, 1393 بوسیله ی sailent
...