تعريف کلاس

   توسط کلاس ها می توان اشيايی را با خصوصيات ( که توسط عناصر نمايش داده می شوند ) و اعمال ( که توسط توابع مشخص می شوند ) مدلسازی کرد . کلاسها همانند ساختارها تعريف می شوند با اين تفاوت که در کلاسها توابع نيز می توانند به عنوان عنصر کلاس باشند . يک کلاس توسط کلمه class تعريف می شود . به تعريف کلاس زير توجه کنيد :

class Time {
  public:
    Time();
    void setTime( int, int, int );
    void printUniversal();
    void printStandard();
 
  private:
    int hour;
    int minute;
    int second;
};

   تعريف کلاس Time با کلمه class شروع می شود و بدنه کلاس با {} مشخص می شود و در انتها تعريف کلاس با يک نقطه ويرگول (;) به پايان می رسد. همانند ساختار Time که در مبحث قبل ايجاد کرديم کلاس Time دارای سه عنصر از نوع عدد صحيح با نامهایhour وminute وsecond می باشد ساير اجزای کلاس جديد می باشد که به بررسی آنها می پردازيم . برچسبهای :public و :private معرفهای دستيابی به عنصر ( عضو ) ناميده می شوند . هر عضو داده ای يا تابع عضوی که بعد از public و قبل از private تعريف می شود ، در هر جايی که برنامه به شيئی از نوع Time دسترسی دارد قابل دستيابی می باشد. هر عضو داده ای يا تابعی که بعد از private تعريف می شود تنها برای توابع عضو کلاس قابل دستيابی می باشد و به طور مستقيم از داخل برنامه قابل دسترسی نمی باشند . تأکيد می شود که بعد از معرفهای دستيابی به اعضاء يک علامت دو نقطه (:) قرار می گيرد . ضمناً اين معرفها را در تعريف کلاسها ، چندين بار و به هر ترتيبی می توان به کار برد ولی توصيه می شود که برای خوانايی برنامه هر يک از اين معرفها را تنها يکبار به کار ببريد و ابتدا اعضای عمومی ( public ) را قرار دهيد . تعريف کلاس Time شامل پيش تعريف چهار تابع printUniversal , setTime ,Time و printStandard می شود که اين توابع ، اعضای عمومی کلاس Time می باشند ، چون بعد از publice تعريف شده اند .

   توجه داشته باشيد که تابع عضوی همنام با کلاس وجود دارد که اين تابع ، تابع سازنده ناميده می شود . تابع سازنده ، تابع عضو بخصوصی است که مقادير اوليه اعضای داده ای را تعيين می کند . هنگامی که برنامه شيئی از کلاسی را ايجاد می کند ، تابع سازنده به طور خودکار فراخوانی می گردد. توجه داشته باشيد که تابع سازنده نبايد مقداری را به عنوان خروجی خود برگرداند .

   همانند ساختارها ، هنگامی که کلاس Time تعريف گرديد می توان اشيايی را از نوع کلاس Time ايجاد کرد . به دستورات زير توجه کنيد :

Time sunset;
Time arrayofTime [5];
Time *timeptr = & sunset;

   توسط دستورات فوق sunset متغيری از نوع کلاس Time تعريف می شود. arrayofTime آرايه ای شامل 10 عنصر از نوع کلاس Time می باشد و timePtr اشاره گری به خانه ای از حافظه با نام sunset از نوع کلاس Time تعريف می گردد.

در برنامه زير کلاس Time مورد استفاده قرار گرفته است و توابع عضو آن تعريف گرديده اند. در اين برنامه شيئی از نوع کلاس Time بانام t ايجاد شده است. هنگامی  که اين شیء ايجاد می شود تابع سازنده Time به طور خودکار فراخوانی می شود ومقدار هر يک از اعضای داده (hour , minute , secound) را عدد صفر قرار می دهد. پس از ايجاد شدن شیء t توابع عضو printUniversal و printStandard فراخوانی می شوند تا با چاپ زمان توسط اين دو تابع از مقدار دهی اوليه به شیء t اطمينان حاصل کنيم. سپس با فراخوانی تابع setTime ، شیء t مقدار دهی می شود و سپس مجددا مقدار اين شیء به دو روش چاپ می گردد. هنگامی که با فراخوانی مجدد تابع عضو setTime سعی در مقدار دهی نادرست به شیء t می کنيم ، تابع عضو setTime از اين کار جلوگيری می کند.

#include <iostream.h>
 
class Time {
  public:
    Time();
    void setTime( int, int, int );
    void printUniversal();
    void printStandard();
 
  private:
    int hour; // 0 - 23 (24-hour clock format)
    int minute; // 0 - 59
    int second; // 0 - 59
}
 
Time::Time() 
{ 
  hour = minute = second = 0; 
}
 
void Time::setTime( int h, int m, int s )
{
  hour = ( h >= 0 && h < 24 ) ? h : 0;
  minute = ( m >= 0 && m < 60 ) ? m : 0;
  second = ( s >= 0 && s < 60 ) ? s : 0;
}
 
void Time::printUniversal()
{
  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 t;
  cout << "The initial universal time is ";
  t.printUniversal(); // 00:00:00
 
  cout << "\nThe initial standard time is ";
  t.printStandard(); // 12:00:00 AM
 
  t.setTime( 13, 27, 6 ); // change time
 
  cout << "\n\nUniversal time after setTime is ";
  t.printUniversal(); // 13:27:06
 
  cout << "\nStandard time after setTime is ";
  t.printStandard(); // 1:27:06 PM
 
  t.setTime( 99, 99, 99 ); // attempt invalid settings
 
  cout << "\n\nAfter attempting invalid settings:"
       << "\nUniversal time: ";
  t.printUniversal(); // 00:00:00
 
  cout << "\nStandard time: ";
  t.printStandard(); // 12:00:00 AM
  cout << endl;
 
  return 0; 
}
 

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

The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM
 
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
 
After attempting invalid settings:
Universal time: 00:00:00
Standard time: 12:00:00 AM

   همانطور که در برنامه فوق مشاهده می کنيد هنگام تعريف کلاس تنها پيش تعريف توابع عضو آورده شده است و خود توابع در خارج از کلاس تعريف شده اند. برای اين کار قبل از نام تابع ، نام کلاس را همراه با عملگر تفکيک دامنه(::) قرار می دهيم :

void Time::printUniversal()
{
  cout << (hour<10 ? "0":"") << hour << ":"
       << (minute<10 ? "0":"") << minute << ":"
       << (second<10 ? "0":"") << second;
}

 

 

 

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

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

   توابع

   آرايه ها

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

   کلاسها

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

 
 
 
   
 
 
 

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