سلام .
اول اینکه تابعی که شما بالا نوشتید فقط نوع برگشتیش 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++ چیست؟