نوشته شده توسط مدیر سایت
چهارشنبه 13 آبان 1388 ساعت 23:10
نحوهی تعریف کلاس
برای تعریف یک کلاس، از کلمهی کلیدی class استفاده میکنیم به صورت زیر:
class CRect{
public:
CRect()//default constructor
{
top = left = right = bottom = 0;
};
CRect(int t, int l, int r, int b) //A better constructor
{
top = t;
left = l;
right = r;
bottom = b;
};
~CRect(){};//default destructor
void ShowCoord()//A member function
{
std::cout << "(top, left): (" << top << "," << left << ")\n";
std::cout << "(bottom, right): (" << bottom << "," << right << ")\n";
}
int top, left, right, bottom; //Member variables
};
پس از کلمه کلیدی class، نام کلاس میآید که در مثال فوق، اسم CRect را انتخاب کردهایم. گذاشتن حرف C سنتی است که در visual c++ مرسوم است و برای انواع دادهای کلاس استفاده میشود؛ البته اختیاری است.
کلمهی کلیدی public سطح دسترسی را تعیین میکند و به معنی بیشترین سطح دسترسی به متغیرها و توابع کلاس است. بعدا در این مورد بیشتر صحبت خواهیم کرد. پس از این کلمه کلیدی، به ترتیب دو تابع سازنده ، یک تابع مخرب ، یک تابع عضو برای نمایش مختصات مستطیل و چهار متغیر برای نگهداری مختصات معرفی شدهاند. در ادامه به تعریف آنها میپردازیم.
توابع سازنده و مخرب
هر کلاس میتواند تعدادی تابع سازنده و یک تابع مخرب داشته باشد. تابع سازنده، مسئول مقداردهی متغیرهای عضو کلاس برای اشیاء جدید است. از سوی دیگر تابع مخرب، مسئول تخریب شیء ایجاد شده است. معمولا مهمترین کار تابع مخرب، آزادسازی حافظههایی است که احتمالا به شیء تخصیص پیدا کرده است. لذا اگر متغیری که حافظه مصرف کند نداشته باشیم، غالبا نیازی به پیاده سازی تابع مخرب نداریم. تابع سازنده باید همنام اسم کلاس باشد، در مثال فوق دو تابع سازنده تعریف کردهایم که یکی هیچ پارامتری نمیگیرد و دیگری مختصات چهارگانه را از کاربر میگیرد. همچنین یک تابع مخرب تعریف کردهایم که هیچ کاری انجام نمیدهد. تابع مخرب نیز همنام کلاس است با این تفاوت که یک علامت ~ قبل از آن قرار دارد.
سوالی که احتمالا برایتان پیش آمده، این است که چرا یک کلاس میتواند چندین تابع سازنده داشته باشد لیکن فقط یک تابع مخرب باید داشته باشد؟ برای روشن شدن موضوع بهتر است مثالی از دنیای واقعی بزنیم: یک لیوان شیشهای به طرق و اشکال مختلف قابل ساخت است، لیکن برای از بین بردن هر لیوانی تنها کافیست آن را به یک کودک بسپاریم! کلکش ساخته است و نیازی به مخرب دیگری نیtwست. البته خود شما هم میتوانید آن را به گوشهای پرت کنید و صدای خرد شدن آن را گوش کنید. باز هم لیوان تخریب خواهد شد. راه سوم هم این است که آن را ذوب و یا حتی تبخیر کنید (اگر مسافران فضایی باشید!). پس راههای بسیار زیادی برای تخریب وجود دارد که هر کدام از آنها به تنهایی کفایت کرده و عمر شیء مذکور را به پایان میرساند. بنابراین هیچ نیازی به داشتن چندین مخرب نداریم.
متغیرهای عضو
هر کلاس تعدادی متغیر دارد که ویژگیها و خواص آن کلاس را بیان میکنند. در مثال فوق، کلاس CRect چهار متغیر عضو دارد که بیانگر مختصات بالا، چپ، پایین و راست مستطیل هستند. در مقالات گذشته دیدیم که متغیرهای معمولی را میتوانیم در زمان تعریف مقدار دهی اولیه کنیم، لیکن متغیرهای عضو کلاس را نمی-توانیم در زمان تعریف مقداردهی اولیه کنیم؛ لذا تعریف زیر اشتباه است:
class CRect{
public:
//...
//Initialization is not possible
int top = 0, left = 0, right = 0, bottom = 0;//ERROR
};
خوب پس چاره چیست؟ بهترین راه برای مقداردهی اولیه متغیرهای عضو کلاس، استفاده از تابع سازنده است که اصولا به همین منظور به وجود آمده است. دقت کنید که اگر یکی از متغیرهای عضو کلاس، یک اشارهگر است که در تابع سازنده یا تابع دیگری از کلاس، با استفاده از عملگر new حافظهای را گرفته است، حتما باید با استفاده از عملگر delete، در تابع مخرب آزاد شود.
توابع عضو
توابعی که در کلاس تعریف میکنیم، قابلیتهای آن کلاس هستند. در مثال سادهای که مطرح کردهایم، تنها یک تابع عضو داریم که مشخصات مستطیل را چاپ میکند.
در مقالات بعدی، نحوه تولید اشیاء و استفاده از توابع و متغیرهای عضو کلاس را بیان خواهیم کرد.