آشنایی با زبان C++

کلاس چیست ؟include

۱- کلاسها به صورت فایلهایی با پسوند" 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

}

 

سطح دسترسی در کلاسها

 

 

در مورد سطح دسترسی به متغییرها و توابع در یک کلاس بحث خواهیم کرد

سطح دسترسی یعنی چی؟

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

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

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

چند ریختی Polymorphism

 

 

چند ریختی یا Polymorphism یکی از خواص جالب در ++C محسوب میشه . شما نمی تونید توابعی با اسامی یکسان داشته باشید مگر در یک حالت استثناء اون هم مسئله چند ریختی هستش . یعنی چند تابع مختلف با یک اسم یکسان تعریف می کنید اما باید دقت داشته باشید که در مقادیر ورودی توابع متفاوت باشند .

 مثال :


}(void set(int a
; int b
;b=a
}
*************
}(void set(float s
; float m
;m=s
}
*************
}(int set(int f,int g
; int j,k
;j=f
;k=g
; return k+j
}
*************


در مثالهای بالا دقت کنید که اسم توابع یکسان است و تنها در موقع صدا زدن آنها با توجه به نوع ورودی تابع , تابع مورد نظر اجرا می شود .
مثال :
اگر بنویسیم ;(set (1 تابع اولی اجرا میشود

اگر بنویسیم ;(set (5.1 تابع دومی اجرا میشود

اگر بنویسیم ;(set (90, 8 تابع سومی اجرا میشود و مقدار ۹۸ را بر می گرداند.

ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر )

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

کلاس پدر را کلاس پایه گویند 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
.
.
.
.
}