اشياء ثابت و توابع عضو ثابت

   همانطور که می دانيد کلمه const از تغيير بر روی متغيری که بعد از اين کلمه قرار می گيرد جلوگيری می کند. برای ايجاد يک شیء ثابت و غير قابل تغييرنيز می توان از const استفاده کرد.

const Time noon(12, 0, 0);

   دستور فوق شيء ثابتی از نوع Time با نام noon ايجاد می کند و با 12 ظهر آنرا مقدار دهی می کند که اين مقدار قابل تغيير نمی باشد.

   کامپايلر ++C اجازه فراخوانی توابع عضو را برای اشياء ثابت نمی دهد مگر اينکه توابع عضو نيز خودشان به صورت const تعريف شده باشند. برای اينکه تابع عضوی به صورت const تعريف شود، بايد هم در پيش تعريف تابع و هم در تعريف تابع از کلمه const بعد از ليست آرگومان های تابع استفاده کنيم.

int Time::getHour() const
{ 
   return hour; 
}

دستور فوق تابع عضو getHour از کلاس Time را به صورت ثابت تعريف می کند.

   نکته:

  1.    تابع عضوی که يک عضو داده از شيئی را تغيير می دهد، اگر به صورت ثابت تعريف شود، باعث وقوع  خطا می گردد.
  2.    تابع عضوی که تابع عضو غير ثابت ديگری را فراخوانی می کند،  اگر به صورت ثابت تعريف شود، باعث وقوع  خطا می گردد.
  3.    فراخوانی يک تابع عضو غير ثابت از شيئی که به صورت ثابت تعريف شده است، باعث ايجاد خطا می گردد.
  4.    يک تابع عضو غير ثابت را می توان با نسخه غير ثابتی از آن گرانبار نمود. اينکه کدام تابع عضو گرانبار شده فراخوانی شود، توسط کامپايلر و بر اساس ثابت بودن يا نبودن شیء تعيين می گردد.
  5.    توجه داشته باشيد از آنجا که سازنده ها و نابود کننده ها نياز به تغيير اشياء دارند نبايد آنها را به صورت ثابت تعريف نمود و اگر کلمه const  برای آنها به کار رود و به صورت ثابت تعريفشان کنيم يک پيغام خطا دريافت خواهيم کرد.
  6. سازنده ها در اشياء ثابت می توانند تابع عضو غير ثابتی را فراخوانی کنند.

   در برنامه زير دو شیء نوع Time ايجاد شده اند که يکی ثابت و ديگری غير ثابت می باشد. در اين برنامه تابع عضو setHour و تابع عضو printStandard که به صورت توابع عضو غير ثابت می باشند، هنگام فراخوانی همانطور که در نکته 2 ذکر شد باعث وقوع خطا می گردند. برنامه زير نکات گفته شده در اين مبحث را روشن می سازد:

#include <iostream.h>
 
class Time {
  public:
    Time( int = 0, int = 0, int = 0);
    void setTime( int, int, int );
 
    void setHour( int );
    void setMinute( int );
    void setSecond( int );
 
    int getHour() const;
    int getMinute() const;
    int getSecond() const;
 
    void printUniversal() const;
    void printStandard();
 
  private:
    int hour; // 0 - 23 (24-hour clock format)
    int minute; // 0 - 59
    int second; // 0 - 59
}
 
Time::Time( int hour, int minute, int second )
{
  setTime( hour, minute, second );
}
 
void Time::setTime( int hour, int minute, int second )
{
  setHour( hour );
  setMinute( minute );
  setSecond( second );
}
 
void Time::setHour( int h )
{
  hour = ( h >= 0 && h < 24 ) ? h : 0;
}
 
void Time::setMinute( int m )
{
  minute = ( m >= 0 && m < 60 ) ? m : 0;
}
 
void Time::setSecond( int s )
{
  second = ( s >= 0 && s < 60 ) ? s : 0;
}
 
int Time::getHour() const
{
  return hour;
}
 
int Time::getMinute() const
{
  return minute; 
}
 
int Time::getSecond() const
{ 
  return second;
}
 
void Time::printUniversal() const
{
cout << (hour<10 ? "0":"") << hour << ":"
     << (minute<10 ? "0":"") << minute << ":"
     << (second<10 ? "0":"") << second;
}
 
void Time::printStandard()
{
  cout << ( ( hour == 0 || hour == 12 ) ?
             12 : hour % 12 ) << ":"
       << (minute<10 ? "0":"") << minute << ":"
       << (second<10 ? "0":"") << second
       << (hour < 12 ? " AM" : " PM" );
}
 
int main()
{
  Time wakeUp( 6, 45, 0 );      // non-constant object
  const Time noon( 12, 0, 0 );  // constant object
 
                          // OBJECT     MEMBER FUNCTION
  wakeUp.setHour( 18 );   // non-const  non-const
 
  noon.setHour( 12 );     // const      non-const
 
  wakeUp.getHour();       // non-const  const
 
  noon.getMinute();       // const      const
  noon.printUniversal();  // const      const
 
  noon.printStandard();   // const      non-const
 
  return 0;
}
 

پيغام های خطای برنامه فوق به صورت زير می باشد:

Warning W8037 100: Non-const function 
Time::setHour(int) 
called for const object in function main()
Warning W8037 107: Non-const function 
Time::printStandard() 
called for const object in function main()
*** 2 errors in Compile ***

 

 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد