PDA

View Full Version : آموزش کلاس ها



baran_mehr
پنج شنبه 08 مهر 1389, 00:07 صبح
کلاس چیست ؟include 1- کلاسها به صورت فايلهايی با پسوند" h " به طور مثال "cat.h " ذخيره ميشوند و برای استفاده از آن در برنامه نياز است که آنرا به برنامه ضميمه کنيد به طورمثال :("include " cat.h#)
۲- اما در داخل فايل کلاس چه چيزهايی نوشته می شود :
در کلاس دو مسئاله تعيين می شود :
الف ) متغييرهای لازم
ب ) توابع مورد نياز
در مورد تعريف متعييرها بايد گفت که همانند تعريف متغيير در بر نامه نويسی غير شئ گرا می باشد اما يک نکته مهم را بايد مد نظر داشت و آن اين است که در برنامه نويسی شئ گرا در کلاس شما حق مقدار دهی به يک متغيير در حين تعريف آن را نداريد . به مثال زير توجه کنيد :
;int a=10 اين در برنامه نويسی عادی مشکلی ندارد اما در يک کلاس حق چنين کاری نداريم و بايد به شکل زير بنويسيم :
;int a
چگونگی مقدار دهی به این متغییر در بحث شئ مورد بررسی قرار می گيرد .
و اما توابع مورد نياز نيز روش خاص خود را داراست .
در يک کلاس شما فقط بايد تابع را تعريف کنيد و کد نويسی بدنه تابع در داخل کلاس انجام نمی شود . در ادامه يک نمونه از يک کلاس ساده آورده شده است :


}class cat

;int age
;int weight,length

;(void setage(int x
;( int getage(void
;(void Meow(void
{

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

حالا باید بتونیم توابع تعریف شده رو بصورت کامل بنویسیم .
برای این کار یک فایل هم نام با نام کلاس می سازند با پسوند cpp مثلا cat.cpp
در این فایل جدید ابتدا نوشته می شود " i #include "cat.hدیگر هدر فایلهای مورد نیاز نیز که جزء ملزومات برناه نویسی است نیز باید نوشته شود
بعد از آن نوشتن بدنه فایلها شروع می شود که همانند سی معمولی است اما با کمی تفاوت جزئی :
بعد از تعیین نوع تابع باید نام کلاس نوشته شده بعد ۲ تا علامت :: گذاشته و اسم تابع و بقیه مجرا نوشته شود . مثلا :


(void cat::setage (int a
}
;age=a
}

baran_mehr
پنج شنبه 08 مهر 1389, 00:11 صبح
سطح دسترسی در کلاسها
در مورد سطح دسترسی به متغييرها و توابع در يک کلاس بحث خواهيم کرد
سطح دسترسی يعنی چی؟
يعنی يک کلاس برای محتويات خود يکسری دسته بندی را رعايت می کند که هر کسی به هر چيزی نتواند دسرسی داشته باشد که در بعضی موارد اگر رعايت نشود می تواند باعث بسياری مشکلات شود.
در يک کلاس ۳ نوع دسترسی وجود دارد :
۱- Public:در اين نوع دسترسی هيچ محدوديتی اعمال نمی شود و هر چيزی چه داخلی و چه خارجی می تواند از ان استفاده کند (فعلا قصد بنده معرفی دسترسی ها می باشد و برای توضيحات عميق تر لازم به دانستن يک سری مطالب ديگر است که در روزهای آينده ذکر خواهد شد )
۲- Private: اين نوع دسترسی بر عکس نوع قبل عمل می کند . يعنی غير از توابع عضو اين کلاس هيچ چيز ديگری نمی تواند به آنها دسترسی داشته باشد . مثلا وقتی يک شئ از اين کلاس تعريف می کنيم از طريق شئ نمی توانيم مستقيما به ايم نوع متغييرها يا توابع دسترسی داشته باشيم اما خود توابع عضو اين کلاس ميتوانند در کد نويسی خود از اين نوع استفاده کنند که در آينده بيشتر آشنا خواهيم شد .
۳- Protected:در این نوع نیز شئی که از کلاس تعریف می شود نمی تواند به این نوع دسترسی داشته باشد . اين نوع تعريف خاص خود را دارد که بعد از بحث ارث بری قابل ذکر است و در اينجا تنها نامی از آن برای تکميل بحث آورده شده است .
*نکته قابل ذکر اين است که غالبا از دو نوع ۱و۲ استفاده می شود و از نوع ۳ خيلی کم استفاده خواهيد کرد .
در کلاس این انواع دسترسی با ۳ کلمه کلیدی ذکر شده تعیین می شوند :
اگر در ابتدای کلاس باشیو و هیچ کدام را ننویسیم متغییرها و توابع تعریفی تا کلمه کلیدی دیگر همه private محسوب می شوند تا زمانی که از یکی از دو کلمه دیگر استفاده شود . بعد از آن نیز بقیه از این کلمه استفاده شده تبعیت می کنند تا کلمه کلیدی بعدی .
------------------------------------------------------------------------------------------
در ادامه يک نمونه مثال از سطح دسترسی آورده شده و در ادامه آن مثالهای اشتباه و درست نيز آورده شده است :



class Cat
}
;int a,b
;(void setage(int age
:public
;int c,d
;(void setlength(int length
: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

baran_mehr
پنج شنبه 08 مهر 1389, 00:13 صبح
سازنده ها و مخربها در يک کلاس
در يک کلاس توابعی تعريف ميشه که یه دسته درست در هنگام ايجاد يک شئ از آن کلاس و دسته ديگر درست قبل از از بين بردن يک شئ از يک کلاس اجرا می شوند .
دسته اول را سازنده یا Constractor و دسته دوم را مخرب يا Destractor گويند .

==============
اگر توابعی به عنوان سازنده و مخرب تعريف نشود . کامپايلر توابع پيش فرضی را ايجاد می کند که تنها وجود دارند و هيچ کار خاصی انجام نمی دهند اما شما می توانيد سازنده يا مخرب دلخواه خود را بنويسيد که درست قبل ايجاد شئ اجرا شوند يا درست قبل از تخريب شئ اجرا شوند .
=============
برای روشن شدن مطلب یه مثال می زنم :
شاید شما بخواهید وقتی یک شئ ایجاد می کنید به یه تعداد معلوم یا نا معلومی متغییر به صورت دینامیکی از سیستم بگیرید . برای این کار آن را داخل تابع سازنده خود قرار می دهید .
حال وقتی این برنامه به اتمام می رسد یا این شئ از بین برده می شود باید این حافظه دینامیک به سیستم برگشت داده شود . پس تابعی به نام مخرب می نویسیم که قبل از اینکه شئ از بین برود حافظه را آزاد کند و به سیستم تحویل دهد .
=============
اما چگونه بنویسیم ؟؟؟
در یک کلاس اگر تابعی با نام آن کلاس بنویسید به عنوان سازنده محسوب می شود و قبل ایجاد شئ حتما یک بار اجرا می شود .
مثلا نام کلاس شما Cat.h باشد :
سازنده شما باید تابعی به نام Cat باشد که ممکن است ورودی و یا خروجی داشته ویا نداشته باشد که به اختیار شما است .
مخرب نیز مشابه به سازنده است با یک تفاوت در نام آن که در ابتدای نام تابع حرف(~) و سپس نام کلاس نوشته می شود و بقیه ماجرا ...

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



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

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

baran_mehr
پنج شنبه 08 مهر 1389, 00:17 صبح
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر )
ارث بری همونطور که از اسمش کاملا پيداست همانند قانون ارث بردن در موجودات زنده عمل می کند , يعنی همانند طبيعت يک کلاس به عنوان کلاس پدر (مادر) فرض می شود و يک کلاس به عنوان فرزند از اين کلاس يک سری خصوصيات و قابليتها را به ارث می برد (فرزند نیز دارای بعضی امکانات پدر می شود . البته میزان آن بستگی به خواست ما دارد که توضیح خواهم داد )
کلاس پدر را کلاس پایه گویند Base Class .
ارث بری را مشتق کردن نیز می گویند .

+++++++++++++++++++++++++++++++++
نحوه مشتق کردن یک کلاس از کلاس دیگر :
فرض می کنیم کلاسی با نام A وجود دارد :


} class B :(type) A
; int a,d
:public
;(void Rotate (void
}

نوشته بالا يعنی کلاس B از کلاس A با دسترسی نوع (type) که توضيح خواهم داد که نوع دسترسی ۳ دسته است مشتق شده یا خصوصیات و قابلیتهای آن را به ارث برده است .
۳ نوع دسترسی برای مشتق کردن وجود دارد که عبارتند از :
۱- public
۲- protected
۳- private
يعنی يکی از سه کلمه بالا به جای (type ) نوشته خواهد شد.

هر کدام از اين انواع دسترسی توضيحات خاص خود را دارد که عبارتند از :

۱- public :
يعنی تمام خواص عمومی و خصوصی کلاس پايه را به همان شکل به ارث می برد . بدين شکل که موارد public در کلاس مبنا (پايه) برای اين کلاس جديد نيز وجود دارد و برای اين نيز public خواهد بود . و تمام خواص protetted و private نيز به همين شکل می باشد که در کلاس جديد نیز هر کدام protected و private خواهند بود .
نکته مهم : در این نوع دسترسی توابع عضو کلاس جدید اجازه دسترسی به خواص protected کلاس مبنا را دارند اما به خواص private خیر !! دسترسی ندارند .

۲- protected :
در این نوع دسترسی , کلاس جدید خواص کلاس مبنا را به این شکل به ارث می برد که تنها توابع عضو کلاس جدید به فقط خواص public و protected کلاس مبنا دسترسی دارند و به خواص private دسترسی ندارند .

۳- private :
این نوع دسترسی یعنی نه شئی از کلاس جدید و نه تابع عضو کلاس جدید به هیچ چیز از کلاس مبنا دسترسی ندارند !! ( عملا یعنی این نوع دسترسی یعنی اصلا مشتق نکنیم سنگین تریم!!! )

نکته بسیار مهم :
ارث بری میتواند به گونه ای باشد که یک کلاس از تعداد بیش از ۱ کلاس ارث ببرد ( مشتق شود ) . مثلا :




}class B: public A , public C , protected D , public E , private F
.
.
.
.
}
منبع (http://visualc6.persianblog.com)