PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کلاس چیست?(class)



shirin71
08-06-2011, 08:57 PM
- کلاسها به صورت فايلهايی با پسوند" h " به طور مثال "cat.h " ذخيره ميشوند و برای استفاده از آن در برنامه نياز است که آنرا به برنامه ضميمه کنيد به طورمثال :("include " cat.h#)



2 - اما در داخل فايل کلاس چه چيزهايی نوشته می شود :

در کلاس دو مسئاله تعيين می شود :

الف ) متغييرهای لازم

ب ) توابع مورد نياز

در مورد تعريف متعييرها بايد گفت که همانند تعريف متغيير در بر نامه نويسی غير شئ گرا می باشد اما يک نکته مهم را بايد مد نظر داشت و آن اين است که در برنامه نويسی شئ گرا در کلاس شما حق مقدار دهی به يک متغيير در حين تعريف آن را نداريد . به مثال زير توجه کنيد :

;inta=10 اين در برنامه نويسی عادی مشکلی ندارد اما در يک کلاس حق چنين کاری نداريم و بايد به شکل زير بنويسيم :

;int a

چگونگی مقدار دهی به این متغییر در بحث شئ مورد بررسی قرار می گيرد .

و اما توابع مورد نياز نيز روش خاص خود را داراست .

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



}class cat

;int age
;intweight,length

;(void setage(int x
;( int getage(void
;(voidMeow(void

{


همانطور که مشاهده کرديد در يک کلاس تنها تعريف متغييرها و توابع صورت می گيرد .

اين نوشته به صورت فايلی با پسوند "h " ذخيره می شود بطور مثال : cat.h
حالا باید بتونیم توابع تعریف شده رو بصورت کامل بنویسیم .

برای این کار یک فایل هم نام با نام کلاس می سازند با پسوند cpp مثلا cat.cpp

در این فایل جدید ابتدا نوشته می شود " i #include "cat.hدیگر هدر فایلهای مورد نیاز نیز که جزء ملزومات برناه نویسی است نیز باید نوشته شود

بعد از آن نوشتن بدنه فایلها شروع می شود که همانند سی معمولی است اما با کمی تفاوت جزئی :

بعد از تعیین نوع تابع باید نام کلاس نوشته شده بعد ۲ تا علامت :: گذاشته و اسم تابع و بقیه مجرا نوشته شود . مثلا :





(void cat::setage (inta
}
;age=a
{

shirin71
08-06-2011, 08:57 PM
سطح دسترسی در کلاسها


در مورد سطح دسترسی به متغييرها و توابع در يک کلاس بحث خواهيم کرد . سطح دسترسی يعنی چی؟

يعنی يک کلاس برای محتويات خود يکسری دسته بندی را رعايت می کند که هر کسی به هر چيزی نتواند دسرسی داشته باشد که در بعضی موارد اگر رعايت نشود می تواند باعث بسياری مشکلات شود.

در يک کلاس ۳ نوع دسترسی وجود دارد :

۱- Public:در اين نوع دسترسی هيچ محدوديتی اعمال نمی شود و هر چيزی چه داخلی و چه خارجی می تواند از ان استفاده کند .

۲- Private: اين نوع دسترسی بر عکس نوع قبل عمل می کند . يعنی غير از توابع عضو اين کلاس هيچ چيز ديگری نمی تواند به آنها دسترسی داشته باشد . مثلا وقتی يک شئ از اين کلاس تعريف می کنيم از طريق شئ نمی توانيم مستقيما به ايم نوع متغييرها يا توابع دسترسی داشته باشيم اما خود توابع عضو اين کلاس ميتوانند در کد نويسی خود از اين نوع استفاده کنند که در آينده بيشتر آشنا خواهيم شد .

۳- Protected:در این نوع نیز شئی که از کلاس تعریف می شود نمی تواند به این نوع دسترسی داشته باشد . اين نوع تعريف خاص خود را دارد که بعد از بحث ارث بری قابل ذکر است و در اينجا تنها نامی از آن برای تکميل بحث آورده شده است .

*نکته قابل ذکر اين است که غالبا از دو نوع ۱و۲ استفاده می شود و از نوع ۳ خيلی کم استفاده خواهيد کرد .

در کلاس این انواع دسترسی با ۳ کلمه کلیدی ذکر شده تعیین می شوند :

اگر در ابتدای کلاس باشیو و هیچ کدام را ننویسیم متغییرها و توابع تعریفی تا کلمه کلیدی دیگر همه private محسوب می شوند تا زمانی که از یکی از دو کلمه دیگر استفاده شود . بعد از آن نیز بقیه از این کلمه استفاده شده تبعیت می کنند تا کلمه کلیدی بعدی .

shirin71
08-06-2011, 08:57 PM
در ادامه يک نمونه مثال از سطح دسترسی آورده شده و در ادامه آن مثالهای اشتباه و درست نيز آورده شده است :




class Cat
}
;inta,b
;(void setage(int age
:public
;int c,d
;(void setlength(intlength
:protected
;int e
;(void setwidth(int width
}



-------------------------------------

در بالا يک نمونه کلاس آورده شده حالا يک شئ از آن تعريف کرده و مثالهای درست و غلط را ذکر ميکنم :




;Cat m


مثالهای درست :



;m.a=10
;m.b=80
;()m.setage


مثالهای غلط :



;m.b=20
;m.c=13
;()m.setlength
;m.e=90
;()m.setwidth

shirin71
08-06-2011, 08:58 PM
سازنده ها و مخربها در يک کلاس



در يک کلاس توابعی تعريف ميشه که یه دسته درست در هنگام ايجاد يک شئ از آن کلاس و دسته ديگر درست قبل از از بين بردن يک شئ از يک کلاس اجرا می شوند .

دسته اول را سازنده یا Constractor و دسته دوم را مخرب يا Destractor گويند .


==============


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

=============


برای روشن شدن مطلب یه مثال می زنم :

شاید شما بخواهید وقتی یک شئ ایجاد می کنید به یه تعداد معلوم یا نا معلومی متغییر به صورت دینامیکی از سیستم بگیرید . برای این کار آن را داخل تابع سازنده خود قرار می دهید .

حال وقتی این برنامه به اتمام می رسد یا این شئ از بین برده می شود باید این حافظه دینامیک به سیستم برگشت داده شود . پس تابعی به نام مخرب می نویسیم که قبل از اینکه شئ از بین برود حافظه را آزاد کند و به سیستم تحویل دهد .

=============


اما چگونه بنویسیم ؟؟؟

در یک کلاس اگر تابعی با نام آن کلاس بنویسید به عنوان سازنده محسوب می شود و قبل ایجاد شئ حتما یک بار اجرا می شود .

مثلا نام کلاس شما Cat.h باشد :

سازنده شما باید تابعی به نام Cat باشد که ممکن است ورودی و یا خروجی داشته ویا نداشته باشد که به اختیار شما است .

مخرب نیز مشابه به سازنده است با یک تفاوت در نام آن که در ابتدای نام تابع حرف(~) و سپس نام کلاس نوشته می شود و بقیه ماجرا ...


++++++++++++++++++++++


اگر به یاد داشته باشید دردرسهای قبل گفته شد که در یک کلاس فقط تعریف تابع آورده می شود و خود تابع در یک فایل با پسوند cpp نوشته می شود . اما یک استثنا وجود دارد به نام توابع In Line یا یک خطی ::

می توان توابع کوتاه در حد یکی دو خط را همانجا در کنار تعریف تابع در کلاس مورد نظر نوشت .

این معمولا برای سازنده ها و مخربهای کوتاه کاربرد دارد و لطفا از این سوء استفاده نکنید



مثال :



} class Cat
:public
{voidCat(void){int a=10
{void ~Cat(void){a=20
}


البته اين تنها يک مثال است و هر کار ديگری نيز می توانيد در سازنده و مخرب به عنوان يک تابع انجام دهيد .