توسط کلاس ها می توان اشيايی را با خصوصيات ( که توسط عناصر نمايش داده می شوند ) و
اعمال ( که توسط توابع مشخص می شوند ) مدلسازی کرد . کلاسها همانند ساختارها تعريف
می شوند با اين تفاوت که در کلاسها توابع نيز می توانند به عنوان عنصر کلاس باشند .
يک کلاس توسط کلمه
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;
}
|