صفحه 1:

صفحه 2:
شي و كلاس باید دو فاز آنالیز و پیاده سازي را از هم جدا نمود * هنگام تجزیه و تحلیل مساله ما اشیا را شناسايي میکنیم و ویژ گيهاي هر يك را بیان میداریم هنگام پیاده سازي بصورت نرم افزار باید اشیا تعریف شوند و نمونه هايي از آنها ساخته شده و مساله را حل نمایند يك شي يس از اينكه طراحي شد بصورت يك کلاس در برنامه تعریف مي‌شود متغيرهايي که از کلاس ساخته مي‌شوند در برنامه اصطلاحاً شي و یا نمونه میگویند " بايد توجه داشت كه از كلمه شي در 2 جا با مفاهیم مختلف استفاده شده است * 1. هنكام طراحي * 2. هنكام ساخت برنامه

صفحه 3:
coe تئوري 2 ۱ " سه مولفه اصلي برنامه نويسي شي كرا * 1. بسته بندي اطلاعات * 2. پنهان سازي اطلاعات * 3 ورائت بسته بندي اطلاعات با تعریف يك شي و رفتارهایش و پیاده سازي بصورت كلاس انجام مي شود پنهان سازي اطلاعات با تعریف رفتارها و صفتهاي عمومي و خصوصي و يباده سازي بصورت ب نوع عضویت در کلاس انجام ورائت شبیه ورائت بیولوژیکی است که در آن فرزندان . صفاتي 5 از والدین به ارث می برند. در این رابطه می توان از کلاس موجودٌ ‎(4b)‏ کلاس جدید(فرزند) را ایجاد کرد.

صفحه 4:
کلاس . الگويي براي اشياء‌ي است که ويژگيهاي مشتر كي دارند و رفتارهاي ب .مي دهند ءشیء نمونه خاصی از کلاس است 7

صفحه 5:
(data abstraction) b ‏انتزاع داده‎ * فقط ويژگيهاي اساسي انواع بدن ارائه اطلاعات جزئي . قابل نمایش است. کلاسها از مفهوم نوع داده انتزاعي پيروي مي ‎MS‏

صفحه 6:
كلاس ها واشياء: بسته بندي 2 " در برنامه نويسي شي كرا هر شي از يك سري متغير هاي عضو به نام صفت و یک سري توابع كه به توابع رفتار(متد) معروفاند تشكيل مي شود " بايد توجه داشت كه براي اعلان كلاس از كلمه كليدي 1355© استفاده مى شود

صفحه 7:
خصوصي و عمومي: پنهان سازي " برخي ویژگیها و يا پيچبدگيهاي يك شي باید از دیگر اشیا پنهان بماند و هر شي تنها يك ظاهري (1۳0۲6۳۲366) که براي دیگر اشیا لازم است را به نمایش میگذارد * يك صفت و یا يك رفتار میتواند درون شي پنهان باشد و دیگر اشیا از آن بي اطلاع باشند مکانیسم اولیه پنهان سازي داده ها قرار دادن آن در یک کلاس و خصوصي سازي آن است داده ها یا توابع خصوصي را تنها میتوان از داخل کلاس در دسترس قرار دارد از سوي دیگر داده ها يا توابع عمومي از خارج کلاس در دسترس قرار میگیرند

صفحه 8:
توابع عضو * معمولا توابع به صورت عمومي وداده ها به صورت خصوصي تعریف مي شوند از این رو از داده ها فقط در توابع عضو كلاس استفاده مي شوند ولي از توابع عضو درخارج از كلاس هم مي توان استفاده كرد . بايد توجه داشت كه در بعضي مواقع مجبور مي شويم از توابع خصوصي و داده هاي عمومي استفاده کنیم * تابع عضو را مي توان : . 1 در داخل کلاس اعلان کرد ودر همان جا پیاده سازي کنیم (در صورتي که تعریف تابع کوتاه باشد) * 2. در داخل کلاس اعلان کرد ودر خارج کلاس پیاده سازي کنیم

صفحه 9:
تعریف کلاس در ) ++ براي تعریف کلاس از کلمه كليدي 255/» و ساختاري به 1 صورت زیر استفاده می شود: pubjic: داده ها و توابع عمومي داده ها و توابع اختصاصي Corretedied: 5 ‏داده ها ي حفاظت شده‎ i

صفحه 10:
قو 10 ضيح نحوه تعريف كلاس نامكذاري كلاس همانند متغيرها انجام ميشود. نام كلاس بايد بيانكر موجوديت باشد و حتي الامكان از اسامي بي ربط استفاده نشود توابع با داده هايي که بعد از تعریف کلاس يا بعد از کلمه كليدي 0۲1۷516 ‎Ole!‏ مي‌شوند , براي کلاس اختصاصي خواهند بود و فقط و فقط اجزاي همان كلاس حق استفاده و دسترسي به آنهارا دارند. 5 داده ها و توابعي كه بعد از كلمه كليدي 0110115 تعريف مي شوند به صورت عمومی خواهند بود و هر قسمت ديكر برنامه مى تواند به آنها دسترسى داشته باشد. " 5 . ‎els‏ و داده هایي که پس از کلمه كليدي 0۲0661601 تعریف مي‌شوند افظت شده هستند و در ورائت مورد آستفاده قرار مي گیرند. *

صفحه 11:
* براي تعریف شي از يك کلاس در هر جايي از برنامه به صورت زیر عمل کنید. " نام شي ء نام كلاس : " تعريف اشياء همانند تعريف متغيرهاست

صفحه 12:
كلاس ساده ‎of‏ اين برنامه شامل یک کلاس و دو شیء از آن #include <iostream.h> ‏كلاس است‎ class smallobj { private: int somedata; public: void setdata(int d) {somedata=d; } void showdata() {cout<<“data is”<<somedata;} yi 12

صفحه 13:
استفاده از کلاس بعنوان يك نوع داده‌اي 2 13 int main() smallobj s1,s2; sl.setdata(1006) ; s2.setdata(876); s1.showdata(); s2.showdata(); return 0; {

صفحه 14:
توضیح برنامه + ۱ " كلاس [5073|110 كه در اين برنامه اعلان شده حاوي یک عنصر داده‌اي و دو تابع عضو مي باشد كه اين دو تابع با عضو داده اي داخلي کار میکنند و از خارج كلاس در دسترسي هستند * تابع عضو اول به عضو داده اي یک مقدار نسبت میدهد و 9 تابع عضو دوم این مقدار را در خروجي نمایش میدهد 14

صفحه 15:
استفاده از کلاس ها 4 * پس از اعلان کلاس میتوان در داخل تابع 0۳031) از اين كلاس ها براي تعريف شيء استفاده كرد 2 — * مثال:52 , 51 [5۳۱۵۱۱00 : ‎C peek‏ نام اشیاء نام تس تعریف یک شیء شبیه تعریف یک متغیر از هر نوع داده اي است که براي حافظه گرفته مي شود چون شيء در واقع نمونه اي از یک کلاس است به تعریف ش شی نمونه سازي شیء نیز می گویند (توجه داشته باشید که اتلاقهاي فوق در هنگام پیاذه سازي معتبر هستند) 15

صفحه 16:
* دستور زیر تابع عضو 5610512 را احضار مي کند: ‎sl.setdata(1006) =‏ 1 * از آنجا که تابع ]05660 یک تابع عضو از کلاس مي‌باشد بايد در ارتباط با يكد شيء از اين كلاس (51) احضار شودپس نوشتن دستور زیر باعث تولید پیغام خطاي کاربر مي شود: ‎setdata(1006) *‏ * براي استفاده از یک تابع عضو عملگر نقطه نام شيء و تابع م, عضو را به هم وصل میکند

صفحه 17:
جح + توابع عضو کلاس حتماً باید براي يك شيءساخته شده فراخواني شوند

صفحه 18:
J a * در این مثال یک کلاس که مربوط به شیء دایره است را مورد بررسي قرار میدهي class CCircle { قرفا كلتو عورا رمال عن ‎private:‏ ‏تعريف كلاس به همراه متفيرهاي عضو ۲ و بيان نمونه اوليه توابع عضو 60 1101 ‎int Radius;‏ ‎COLORREF Fillcolor;‏ public: void set(int x,int y,int r, COLORREF fc); void draw(CDC *pdc); 1

صفحه 19:
ادامه مثال اننم کی ‎void circle): set (int x,int y,int r, COLORREF fc)‏ ‎qt‏ اپراتور محدوده کلاس ‎Xco=x;‏ تابع براي مقدار دهي به مقادیر عضو استفاده شده است Radius=r; Fillcolor=fc; 1 void CCircle::draw(CDC *pdc) { CBrush mBrush; mBrush. CreateSolidBrush(Fillcolor) ; CBrush *0ldBrush=pdc->SelectObject (&mBrush) ; pdc->ELlipse(Xco-Radius , Yco-Radius , Xco+Radius , Yco+Radius) ; pdc->SelectObject (OldBrush) ; پیاده سازي توابع عضو

صفحه 20:
ادامه مثال void CTestAppD1lg: : OnBnClickedBtndrawcircle() { CCircle cl,c2; cl.set(40,40,30,RGB(255,0,0)); c2.set(100,100,50,RGB(0,0,255)); CDC *pdc=GetDC(); cl.draw(pdc) ; c2.draw(pdc) ; ReleaseDC(pdc) ; 20

صفحه 21:

صفحه 22:
توضیح + ۱ 9 در برنامه قبل با دو نوع داده اي جدید اشنا شدیم: ‎COLORREF *‏ ۰« * نوع داده اي اول (010888۴)) براي نگهداري رنگ است. رنگها در ویندوز از ترکیب سه رنگ اصلي قرمز. سبز و آبي تولید میشوند. ‎RGB 9 Slo *‏ سه رنگ قرمز. سبز و آبي را با هم تر کیب میکند. میزان هر رنگ مقداري بین 0 تا 255 دارد. * (808)255,0,0 رنگقرمز لست " نوع داده اي دوم (0100) كلاسي است كه توابع مربوط به عمليات نقاشى روي فرمها در ويندوز را انجام ميدهد. 22

صفحه 23:
مثالي دیگر از تعریف کلاس ‎class employee {‏ ‎char name[20]; // private by default‏ ‎public :‏ ‎void putname (char *s); //publics‏ ‎void getname (char *s);‏ ‎void putage (double w);‏ ‎double getage ();‏ ‎private :‏ ‎double Age; //private again‏ , 6۳1 ( ‎employee em3,em4;‏ ‎void employee : : putname ()‏ 5 + void employee : : putname () 23

صفحه 24:
تمرین: برنامه اي که يك شي دایره در آن تعریف شود. شعاع دایره را از ورودي خوانده و مساحت آن را محاسبه کرده و در خروجي ببرد. (تمام اعضاي داده اي اختصا اند) #include <conio.h> #include <iostream.h> class circle{ int radius; public: void get_radius(); void print(); 17 void circle : : get_radius() { cout<<“Enter radius”; cin>> radius; 24

صفحه 25:
void 61۳016 : : print () { float 5: s = radius * radius * 3.14; cout << “ Area="<<s; + MA | | | | | 0 00/0/0000 ۱۱ int main () { circle cl; C1.get_radius(); cl.print(); getch(); return 0; 25

صفحه 26:
* بخش 1: " يك كلاس براي مشخصات درس تعریف نمایید * صفات: نام درس, تعداد واحد و نمره * رفتارها: قراردادن نام براي درس, قرار دادن تعداد واحد براي درس قرار دادن نمره براي درس و توابعي براي بر گرداندن مقادیر نسبت داده شده * دیگر رفتارها: محاسبه نمره در واحد و برگرداندن آن 26

صفحه 27:
ادامه تمرین + 9 بخش 2 " براي تست کلاس نوشته شده با نام 16550۳/) درون تابع ۲۱۵۴ اشیا مناسب از نوع کلاس را تعریف نموده و متفيرهاي عضو آنرا مقداردهی نمایید و مقادیر نسبت داده شده را 27

صفحه 28:
9 بخش 3 " يك كلاس با نام 111 ©5]1000) تعريف نماييد * صفات: نام دانشجو, شماره دانشجويي, سه درس در نيمسال (از نوع ‎us «s Clesson‏ طراحي شده) * رفتارها: توابع مورد نیاز جهت مقدار دهي به نام و شماره دانشجويي و بر گرداندن اين مقادیر * دیگر رفتارها: تعیین نام براي هر يك از دروس دانشجو و نمره براي آن درس * دیگر رفتارها: محاسبه معدل با توجه به نمره دانشجو در دروس. 28

صفحه 29:
* پروژه معرفي شده را بعنوان تمرین درسي انجام دهید (نمانتحویل‌جلسه لینده)

صفحه 30:
= (Constructor) le 035 jle

صفحه 31:
سازنده ها (620۳51۲۱610۲5) اغلب اوقات میخواهیم هنكام ايجاد شيء (تعريف متغي کلاس) آترا مقداردهي اولیه کنیم (متفيرهاي عضو ان را مقداردهي کنیم) و پا عملیات خاصي را انجام دهیم. 9 تمامي كلاس ها تابعي به نام سازنده دارند که بطور خودکار هنگام تعريف شي از آن: كلاس اجرا ميشود. يکي از وظایف سازنده. مقدار دهي اوليه به متغيرهاي عضو شي است. توابع سازنده هر کلاس, هم نام کلاس هستند. یک کلاس میتواند بیش از یک سازنده داشته باشد. که براساس قوانین چندريختي, هنگام ساخت شي. مشخص میشود که از کدام سازنده بايد استفاده شود. 31

صفحه 32:
سازنده ها و دادن مقدار اولیه به اشیاء براي پي بردن به مفهوم سازنده ها (60۳51۲610۲) روش مقدار دادن به یک متفیر را به یاد آورید. دستور زیر ضمن تعریف متغیر ۷ از نوع 11 مقدار اولیه آن را صفر تعیین مي کند. 0 2 ۷ ۱۱۲ : کلاس مي تواند تابع عضو ویژه اي به نام سازنده داشته باشد ولي این تابع هیچ مقداري را نمیتواند پر اند و حتي از نوع ۷0/0 هم نیست. سازنده , همنام با كلاسي است که در آن تعریف مي شود و هنگام ایجاد اشيايي از آن کلاس به طور خودکار اجرا مي شود. class myClass { int a; int b; public: myClass(); void show();

صفحه 33:
33 myClass : : myClass ( ) void myClass : : show ( ) 1 cout << “a="<<a; cout<<“b="<<b; + int main () 1 myClass ob1; ob1.show(); return 1; 1 ‏خروجي‎ : a=0 b=10

صفحه 34:
سازنده ها (ادامه...) + * تمامي کلاسها داراي سازنده هستند و اگر ما براي يك کلاس سازنده ننویسیم کامپایلر از سازنده پیش فرض ‎Default)‏ ‏۷۲ استفاده میکند * فراخوانی سازنده توسط کامپایلر هنكام تعریف متغير بصورت خود کار انجام میشود

صفحه 35:
35 سازنده هايي با پارامتر توابع سازنده مي توانند پارامتر داشته باشند. معمولاً این پارامترها براي مقدار اولیه دادن به متغیر های عضو شيء به کار مي روند. مثال زیر را در نظر بگیرید ‎class myClass {‏ int x; int y; public: myClass ( int i, int j); void show(); 1 myClass : : myClass (int i, int j ) 1

صفحه 36:
void myClass : : show ( ) 1 cout << “x="<<x; cout << “y ="<<y << endl; myClass ob1 (10, 15); myClass ob2 (20, 25); ob1.show(); ob1.show(); return 1; x=10 y=15 x=20 y=25 36 ۱ 1 int main () {

صفحه 37:
مثال: یک سازنده * روش اول: * روش دوم: (دستور انتساب) (فراخواني سازنده براي 6۳1 ) ‎class counter class counter 5‏ 1 3 ‎private: private:‏ ‎int cnt; int cnt;‏ ‎public: public:‏ ‎counter() { counter():cnt(0)‏ ‎cnt=0; {‏ } } 1 1 نتیجه عملي که انجام میشود در هر دو روش یکسان است يس از تعريف يك شي از كلاس 2010111 مقدار ۲01 بصورت خود کار برابر صفر خواهد شد

صفحه 38:
مثال: يك سازنده + " در مثال 6 که در قبل گفته شد مي توان به جاي تابع 6() از یک سازنده استفاده کنیم: circle(int x ,int y,int r,color fc) : xco(x) , yco(y), radius(r) * { }, fillcolor(fc) * _ باید توجه داشت که توابع سازنده هیچ نوع بر گشتي ندارند زیرا سازنده به طور اتوماتنیک توسط سیستم احضار مي شود 38

صفحه 39:
تمرین 3 * يك كلاس براي نگهداري دانشجویان طراحي کنید با نام (أ5 511) که ظرفیت نگهداري قیازه دانشجويي 20 دانشجو را داشته باشد. نوع صحیح به طول 20 براي نگهداري شماره دانشجويي ياني که در حال حاضر در لیست هستند نما نت حمیا حلسه * افزودن يك دانشجو به لیست: (زمانت حویل‌علسه [ * بارامتر ورودي يك عدد صحيح (شماره دانشجوبي) * مقدار خروجي تابع اكر بتواند اضافه كند 1 و در غير اينصورت صفر بر ميكرداند هر فا این از سوت میت یز بت هد مینست هو حذف يك دانشجو از لیست: شیر داد خروجي: اگر فرد در لیست باشد آنرا حذف و عدد 1 برمیگرداند و در غير اینصورت صفر برمیگرداند و قراخ ی کرت میت ]و تن تا جرا یس جک قوق * نمایش لیست 39 بر گرداندن تعداد دانشجویان در ليست

صفحه 40:
آر گومانهاي پیش فرض در سازنده ها * سازنده ها مي توانند حاوي آرگومانهاي پیش فرض باشند. = با تعیین آر گومانهاي پیش فرض براي سازنده حتي در صورت عدم مقدار دهي در فراخواني سازنده, این آطمینان وجود دارد که اشیاء مقداردهی اولیه شده اند. * سازنده اي که برنامه نویس ایجاد میکند و تمام آر گومانهاي آن را به طور پیش فرض انتخاب کرده است (يا به هیچ آر گوماني نیاز ندارد ) سازنده پیش فرض نام دارد. * هر کلاس فقط یک سازنده پیش فرض می تواند داشته باشد. 40

صفحه 41:
41 class myClass { int x; int y; public: myClass (int i = 0, int j = 10); void show(); 1 mycClass : : myClass (inti, int j ) { x=i; y=); 7

صفحه 42:
void myClass : : show () { cout << “x="<<x; , cout << “y="<<y<<endl; } int main () { myClass ob1 (11, 99); myClass ob2 (); ob1.show(); ob1.show(); return 1; } ‏خروجي‎ : 211 ۷۶9 x=0 y=10 42

صفحه 43:
تمرین 4 * يك کلاس براي ذخیره سازي زمان تعریف نمایید با نام ۲1۳06 01/۷ متفيرهاي عضو: ساعت. دقيقه و ثانیه پیش فرض که مقادیر 0 براي تمامي متفیرها لحاظ کند که با توجه به شي ورودي و مقادیر آن متفيرهاي عضو را مقداردهي نماید * تابعي که تفاضل زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي ‎CMYTIMe‏ ‏برگرداند (6 0۱۷/۲۱۴06 ا5عم))۲۱6::۵166 0 عصصن۲ لا * تابعي که حاصل جمع زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي 0۱/۲۱۳6 بر گرداند (6 ‎CMyTime CMyTime::Add(const CMyTime‏ * تابعي که يك شي از نوع ۱۷/۷/۲106 را بعنوان پارامتر گرفته و اگر مقدار ‎HT‏ ‏ورودي باشد مقدار 1 و اگر کوچکتر بود -1 و اگر برابر بودند مقدار 0 برگرداند. int CMyTime::Compare(const CMyTime &t) * رگتر از پارامتر 43

صفحه 44:
4 ‏تمرین‎ dol! * يك کلاس براي ذخیره سازي زمان تعریف نمایید با نام ‎CMyDateTime‏ و ثانیه متفيررهاي عضو: ساعت. دا * سازنده: * سازنده پیش فرض که مقادیر تاریخ و زمان جاري سیستم براي تمامي متفیرها لحاظ کند * سازنده كپي که با توجه به شي ورودي و مقادیر آ متفيرهاي عضو را مقداردهي نماید * سازنده اي که پارمترهاي سال, ماه. روز. ساعت. دقیقه و ثانیه را بگیرد و اعضا را مقداردهي نماید. ۴ توابع عضود * تابعي که تفاضل زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي 0۱/۲0۵۲61۳6 برگرداند (6 6۳۲۱۴6 ‎CMyDateTime CMyDateTime::Diff(const‏ * تابعي که حاصل جمع زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي 0۷۲۵۵۲671۳06 برگرداند ‎CMyDateTime CMyTime::Add(const CMyDateTime &t)‏ * تابعي که يك شي ‎S19 485 prolyl, olpin | CMyDateTime gsi jl‏ مقدار آن بزركتر از يارامتر ورودي باشد مقدار 1 و اگر کوچکتر بود -1 و اگر برابر بودند مقدار 0 بر گرداند. ‎int CMyDateTime::Compare(const CMyDateTime &t) *‏ 44

صفحه 45:
45 مخرب ها(نابود کننده ها) ‎a‏ destructor

صفحه 46:
مخرب ها(نابود کننده ها) ‎of‏ 46 همان طور که وقتي يك شي براي اولين بار اجرا مي شود تابع سازنده آن احضار : مي‌شود با نابود شدن شيء نيز تأبع ديكري به نام تابع مخرب ‎(destructor)‏ به طور اتوماتیک احضار مي‌شود تابع مخرب همنام با سازنده (يعني همنام با کلاس) است اما قبل از آن علامت مد يعني - قرار میگیرد. * مخرب ها مانند سازنده ها مقدار بر گشتي ندارند و هیچ آرگوماني نیز نمي گیرند

صفحه 47:
مثالي از یک مخرب 1 class foo { private: int data; public: foo() : data(0) ‏3ع‎ ‎~foo() ‎{} ‎3

صفحه 48:
اشیاء به عنوان آر گومان هاي تابع مشخص شده است) void distance::add_dist (distance d2,distance d3) ~ inches=d2.inches+d3.inches; feet=0; if(inches>=12.0) inches-=12.0; feet++; + feet+=d2.feet+d3.feet; 48 1 2 3 4 5 6 7 8 9 {} void add_dist(distance ,distance); 1 مي توان از اشیاء به عنوان آر گومان ورودي یک تابع استفاده کرد به مثال زیر توجه کنید:(با رنگ قرمز class distance 1 private: int feet; float inches; public: distance() : feet(0),inches(0.0) {} distance(int ft, float in) : feet(ft), inches(in) i

صفحه 49:
با توجه به شماره هاي 7 الي 11 ستون اول مثال قبل متوجه مي شويم كلاس ‎distance‏ دو سازنده دارد دلیل وجود این دو سازنده اين است كه: مي خواهیم متغیر هايي از نوع 0150۳066 بدون مقدار دهي اولیه به آن ها تعریف کنیم (شماره 7وع) مي خواهيم متغير هايي كه از نوع ‎gly distance‏ اولين بار ایجاد کنیم مقدار جایگزین کنیم (شماره هاي 9و10و11)

صفحه 50:
بر گرداندن اشیاء از توابع * تابع ا5أه_300) که در مثال قبل تعریف کردی را مي توانیم به صورت زیر تعریف کنیم در اين صورت مقدار بر ‎at ol‏ یک شیء می‌باشد distance temp; temp.inches=inches + d2.inches; 3 if(temp.inches>=12.0) ۱ ‏چون نوع‎ | { ‏رميوكردلند نوع بركشتولين‎ »— distance ! ۱ temp.inches-=12.0; ۱ ‏هم مي باشد واين تابع شيء‎ ev! ۱ | 052066 رابه ۰ شي 02 لضافه میکند ‏ ! ‎temp.feet=1;‏ ‏گرداند_ \ 1 temp.feet+=feet+d2.feet; return temp; 50

صفحه 51:
void distance::Display() 1 cout<<"\n feet="<<feet; cout<<"\n inches="<<inches<<endl; void main() 1 distance d1(1,2),d2(5,6); distance d3,d4; d3. add_dist(d1,d2); 0401, 00 |_dist2(d2); cout<<"d3 is:”; d3. Display(); cout<<"d4 is:”; d4. Display(); getch(); ‏تا‎ ‎1 ‏تست‎ ‏تحايكانا‎ ‏ين‎ ‏تتا‎ inches =8 51

صفحه 52:
داده هاي كلاس ‎static‏ * اگر یک عنصر داده اي در یک کلاس به صورت ]5311 اعلان شده باشد صرف نظر از تعداد اشياء‌ي که از کلاس ساخته شده‌اند. براي متفیر عضو ‎gs Static‏ یک عنصر ایجاد مي‌شود. * براي یک عضو او کلاس حافظه جداگانه‌اي اخذ مي‌شود و تمامي نمونه هاي ساخته شده از کلاس به این متغیر دسترسي دارند و هر تغييري كه در اين نوع عضو داده اي ایجاد شود تمامي اشياء ديكر به آخرين مقدار دسترسي دارند " يك متغير عضو استاتیک بسیار شبیه به یک متغير سراسري است 52

صفحه 53:
int main() { foo f1,f2,f3; cout<<“count is:”<<fl.getcount(); cout<<“count is”<<f2.getcount(); cout<<“count is”<<f3.getcount(); count is:3 count is:3 count is:3 mal 5 #include<iostream.h> class foo { private static int count; public: foo() {count++} int getcount() {return count;} } foo:: count = 0;

صفحه 54:
شرح مثال 2 54 در این مثال کلاس00] یک عنصر داده اي به نام 00۴ ازنوع ‎Static‏ ‏دارد سازنده اين كلاس باعث مي شود ‎count‏ افزایش یابد در 0۳0۵1 سه شيء از كلاس 600 تعريف كرديم از آنجا كه سازنده سه بار احضار مي شود ۲00106 سه بار افزایش مي یابد و از آن جايي که داده ‎Count‏ از نوع 56261 مي باشد در نتيجه ‎ly‏ هر 3 شيءاي که تابع 601۴و احضار مي شود یک مقدار(يعني 3 را برمي گرداند اگردر این مثال از یک متفیر معمولي به جاي متفیر استاتیک استفاده مي کردیم مقداري که تابع اطدامع096 برمي گرداند براي هر سه تابع عدد 1 بود زیرا در هر شیء فقط یک بار به 0۱10۲ اضافه می‌شود

صفحه 55:
تمرین 5: ۴ يك کلاس براي نگهداري آرایه اي از نوع 00 به طول ‎!١‏ طراحي نمایید بطوري که ۲ تعداد عناصر لیست است و در سازنده طول آرایه وارد ميشود. در مخرب کلاس حافظه اختصاص يافته به سیستم بر گردانده میشود. class CList 1 public: Clist(int len); ~Clist(int len); int Getitem(int Idx); void SetItem(int Idx , int Val); privete: int *ptr; 1 55

صفحه 56:
توابع »51011 3 " توابع عضو نیز مي توانند»اه5 باشند اين ويژگي باعث مي‌شود که بتوان بدون ساخت یک شيء یک تابع را فراخواني كرد "" توابع 58311 تنها به متغير هاي عضو از نوع ©5]3]1 دسترسي دارند

صفحه 57:
class MyMath { ۱ public: static double SQUARE(double d) {return sqrt(d);} static double POW(double d,double n) {return pow(d,n);} 3; int main(int argc, char* argv[]) { cout<<"sqrt(100)= 10.0)<<endl; getch(); return 0; }

صفحه 58:
موردهاي کاربرد توابع و متفيرهاي + static در سیستم انتخاب واحد تمامی دانشجویان دروس ارائه شده در ترم را ميبينند و بايد اين اطلاعات بين همه مشترك باشد. 5 در سيستم حمل و نقل تمامي خودروها اطلاعات يكساني از مسيرها دارند. اكر كلاسي به صورت وسيله نقليه داشته باشيم ميتوانيم اطلاعات مربوط به خيابانها و تقاطعها را بصورت متغیر ‎static‏ تعريف نماييم در بازي فوتبال تمامي بازیکنان موقعیت توپ و مالك

صفحه 59:
توابع عضو 0151© 21 " تابع عضو 0105© تضمين مي كند كه هيج يك از داده عضو كلاس خود را تغيبر نمي دهد ۴ اگر بعد از اعلان تابع و قبل از بدنه آن کلمه كليدي ۲ قرار دهید آن تابع به یک تابع ثابت(20۳051) تبدیل مي شود = توابع عضوي كه كاري انجام نمي دهند اما داده ها رااز شيع دریافت مي کنند نامزدهاي خوبي براي 05۴ شدن هستند زیرا نمي خواهند هیچ داده اي را تفییر دهند * 00056 ساختریکقتاب بع کمکميک ند تاکامپایلر در صورت نیز پیغامهاي‌خا چاپک ند وب كاربر لطلاع ميدهد كه كه تابع نميخولهد جيزيرا در دلخلشيع آن‌تفییر دهد 59

صفحه 60:
مثال 2 class aclass { private: int alpha; public: void nonfunc(}————-+_//non-const member function 10۱093299: ‏مط‎ //01 void confunc() const__, _//const member function 131002299: + //6۲۲0۲: 69۳01] modify a member }; 60

صفحه 61:
const ‏اشیاء‎ 61 +_¥ * هر گاه یک شيء را به صورت ]60۳5 اعلان کنیم دیگر نمي توانیم آن شيء را تغيير دهيم بنابراين تنهااز توابع عضو 0051© مي توانيم استفاده كنيم زيرا تنها توابعي هستند كه تضمين ميكنند محتواي آن تغيير نمي كند

صفحه 62:
مثال void showdist() const { cout<<feet<<"\"<<inches<< } 1 int main() const distance football(300,0); football.getdist(); ۲ cout<<“football="; football.showdist(); //ok cout<<endl; return 0; 1 62 class distance { private: int feet; float inches; public: distance(int ft, float in) : feet(ft), inches(in) {} void getdist() cout<<“\n enter feet” ; cin>>feet; cout<<" enter inchest”; cin>>inches; }

صفحه 63:
98 ۲00102۱۱ که از تعریف کردیم از نوع ‎Const‏ ‏مي‌باشد. آن خط از برنامه که با رنگ سبز نمایش داده شده است باعث ایجاد 6۲۲0۲ مي شود زیرا تابع ا960[5 یک تابع عضو از نوع 6005 نمي‌باشد این در حالي است که چون تابع ‎Qshowdist‏ از نوع ‎const‏ مي‌باشد باعث ابجاد 6۲۲0۲ در برنامه نمی شود 63

اشياء و کالس ها 1 شي و كالس ‏ ‏ ‏ ‏ ‏ ‏ بايد دو فاز آناليز و پياده سازي را از هم جدا نمود هنگام تجزيه و تحليل مساله ما اشيا را شناسايي ميكنيم و ويژگيهاي هر يك را بيان ميداريم هنگام پياده سازي بصورت نرم افزار بايد اشيا تعريف شوند و نمونه هايي از آنها ساخته شده و مساله را حل نمايند يك شي پس از اينكه طراحي شد بصورت يك كالس در برنامه تعريف مي‌شود متغيرهايي كه از كالس ساخته مي‌شوند در برنامه اصطالحًا شي و يا نمونه ميگويند بايد توجه داشت كه از كلمه شي در 2جا با مفاهيم مختلف استفاده شده است ‏ ‏ 2 .1هنگام طراحي .2هنگام ساخت برنامه تئوري ‏ سه مولفه اصلي برنامه نويسي شي گرا ‏ ‏ ‏ ‏ ‏ ‏ 3 .1بسته بندي اطالعات .2پنهان سازي اطالعات .3وراثت بسته بندي اطالعات با تعريف يك شي و رفتارهايش و پياده سازي بصورت كالس انجام مي‌شود پنهان سازي اطالعات با تعريف رفتارها و صفتهاي عمومي و خصوصي و پياده سازي بصورت تعيين نوع عضويت در كالس انجام ميگيرد وراثت شبيه وراثت بيولوژيکي است که در آن فرزندان ،صفاتي را از والدين به ارث مي برند .در اين رابطه مي توان از کالس موجود (پايه) ،کالس جديد(فرزند) را ايجاد کرد. کالس ،الگويي براي اشياءي است که ويژگيهاي مشترکي دارند و رفتارهاي يکساني از خود نشان ميدهند ‌ . .شيء نمونه خاصي از کالس است 4 ()data abstraction فقط ويژگيهاي اساسي انواع بدن ارائه اطالعات جزئي ،قابل نمايش است .کالسها از مفهوم نوع داده انتزاعي پيروي مي کند 5 کالس ها واشياء :بسته بندي ‏ در برنامه نويسي شي گرا هر شي از يک سري متغير هاي عضو به نام صفت و يک سري توابع که به توابع رفتار(متد) معروف‌اند تشکيل مي‌شود ‏ بايد توجه داشت که براي اعالن کالس از کلمه کليديclass استفاده مي‌شود 6 خصوصي و عمومي :پنهان سازي ‏ برخي ويژگيها و يا پيچيدگيهاي يك شي بايد از ديگر اشيا پنهان بماند و هر شي تنها يك ظاهري ( )interfaceكه براي ديگر اشيا الزم است را به نمايش ميگذارد ‏ يك صفت و يا يك رفتار ميتواند درون شي پنهان باشد و ديگر اشيا از آن بي اطالع باشند ‏ مکانيسم اوليه پنهان سازي داده ها قرار دادن آن در يک کالس و خصوصي سازي آن است ‏ داده ها يا توابع خصوصي را تنها ميتوان از داخل کالس در دسترس قرار دارد از سوي ديگر داده ها يا توابع عمومي از خارج کالس در دسترس قرار ميگيرند 7 توابع عضو ‏ ‏ ‏ معموال توابع به صورت عمومي وداده ها به صورت خصوصي تعريف مي‌شوند از اين رو از داده ها فقط در توابع عضو کالس استفاده مي‌شوند ولي از توابع عضو درخارج از کالس هم مي توان استفاده کرد بايد توجه داشت که در بعضي مواقع مجبور مي شويم از توابع خصوصي و داده هاي عمومي استفاده کنيم تابع عضو را مي توان : ‏ ‏ 8 .1در داخل کالس اعالن کرد ودر همان جا پياده سازي کنيم (در صورتي که تعريف تابع کوتاه باشد) .2در داخل کالس اعالن کرد ودر خارج کالس پياده سازي کنيم تعريف کالس در ++ c براي تعريف کالس از کلمه کليدي classو ساختاري به صورت زير استفاده مي شود: { نام کالس class ‏public: داده ها و توابع عمومي ‏private: داده ها و توابع اختصاصي ‏protected: داده ها ي حفاظت شده ;} 9 توضيح نحوه تعريف كالس ‏ نامگذاري کالس همانند متغيرها انجام ميشود. نام كالس بايد بيانگر موجوديت باشد و حتي االمكان از اسامي بي ربط استفاده نشود ‏ توابع يا داده هايي كه بعد از تعريف کالس يا بعد از کلمه کليدي private اعالن مي‌شوند ،براي کالس اختصاصي خواهند بود و فقط و فقط اجزاي همان کالس حق استفاده و دسترسي به آنها را دارند. ‏ داده ها و توابعي که بعد از کلمه کليدي publicتعريف مي‌شوند به صورت عمومي خواهند بود و هر قسمت ديگر برنامه مي تواند به آنها دسترسي داشته باشد. ‏ توابع و داده هايي که پس از کلمه کليدي protectedتعريف مي‌شوند محافظت شده هستند و در وراثت مورد استفاده قرار مي گيرند. ‏ 10 تعريف يك شي از كالس ‏ براي تعريف شي از يك كالس در هر جايي از برنامه به صورت زير عمل کنيد. نام کالس ; نام شي ء ‏ تعريف اشياء همانند تعريف متغيرهاست 11 کالس ساده اين برنامه شامل يک کالس و دو شيء از آن کالس است #include <iostream.h> class smallobj { private: int somedata; public: void setdata(int d) {somedata=d;} void showdata() {cout<<“data is”<<somedata;} }; 12 استفاده از كالس بعنوان يك نوع داده‌اي int main() { smallobj s1,s2; s1.setdata(1006); s2.setdata(876); s1.showdata(); s2.showdata(); return 0; } 13 توضيح برنامه ‏ ‏ ‏ 14 کالس smallobjکه در اين برنامه اعالن شده حاوي يک عنصر داده‌اي و دو تابع عضو مي‌باشد که اين دو تابع با عضو داده اي داخلي كار ميكنند و از خارج كالس در دسترسي هستند تابع عضو اول به عضو داده اي يک مقدار نسبت ميدهد و تابع عضو دوم اين مقدار را در خروجي نمايش ميدهد استفاده از کالس ها ‏ ‏ ‏ ‏ 15 پس از اعالن کالس ميتوان در داخل تابع )(mainاز اين کالس ها براي تعريف شيء استفاده کرد مثال; smallobj s1 , s2: نام اشياء نام کالس تعريف يک شيء شبيه تعريف يک متغير از هر نوع داده اي است که براي حافظه گرفته مي شود چون شيء در واقع نمونه اي از يک کالس است به تعريف شي نمونه سازي شيء نيز مي گويند (توجه داشته باشيد كه اتالقهاي فوق در هنگام پياده سازي معتبر هستند) احضار تابع هاي عضو ‏ دستور زير تابع عضو )(setdataرا احضار مي کند: ‏ ‏ )s1.setdata(1006 از آنجا که تابع )(setdataيک تابع عضو از کالس مي‌باشد بايد در ارتباط با يک شيء از اين کالس ( )s1احضار شودپس نوشتن دستور زير باعث توليد پيغام خطاي کاربر مي شود: ‏ )setdata(1006 براي استفاده از يک تابع عضو عملگر نقطه نام شيء و تابع 16عضو را به هم وصل ميکند توابع عضو كالس حتمًا بايد براي يك شيءساخته شده فراخواني شوند 17  مثال در اين مثال يک کالس که مربوط به شيء دايره است را مورد بررسي قرار ميدهيم. تعريف كالس به همراه متغيرهاي عضو و بيان نمونه اوليه توابع عضو ‏class CCircle { ‏private: ;int Xco,Yco ;int Radius ;COLORREF Fillcolor ‏public: ;)void set(int x,int y,int r, COLORREF fc ;)void draw(CDC *pdc ;} 18 بيان نام كالس ادامه مثال void CCircle::set(int x,int y,int r, COLORREF fc) { اپراتور محدوده كالس Xco=x; تابع براي مقدار دهي به مقادير عضو Yco=y; استفاده شده است Radius=r; Fillcolor=fc; } void CCircle::draw(CDC *pdc) { CBrush mBrush; mBrush.CreateSolidBrush(Fillcolor); CBrush *OldBrush=pdc->SelectObject(&mBrush); pdc->Ellipse(Xco-Radius,Yco-Radius,Xco+Radius,Yco+Radius); pdc->SelectObject(OldBrush); } پياده سازي توابع عضو 19 ادامه مثال void CTestAppDlg::OnBnClickedBtndrawcircle() { CCircle c1,c2; c1.set(40,40,30,RGB(255,0,0)); c2.set(100,100,50,RGB(0,0,255)); CDC *pdc=GetDC(); c1.draw(pdc); c2.draw(pdc); ReleaseDC(pdc); } 20 خروجي برنامه 21 توضيح ‏ در برنامه قبل با دو نوع داده اي جديد آشنا شديم: ‏ ‏ ‏ ‏ نوع داده اي اول ( ) COLORREFبراي نگهداري رنگ است .رنگها در ويندوز از ترکيب سه رنگ اصلي قرمز ،سبز و آبي توليد ميشوند. ماکرو ، RGBسه رنگ قرمز ،سبز و آبي را با هم ترکيب ميکند .ميزان هر رنگ مقداري بين 0تا 255دارد. ‏ ‏ 22 ‏COLORREF ‏CDC ) RGB(255,0,0رنگ قرمز است. نوع داده اي دوم ( ) CDCکالسي است که توابع مربوط به عمليات نقاشی روي فرمها در ويندوز را انجام ميدهد. مثالي ديگر از تعريف كالس class employee { char name[20]; // private by default public : void putname (char * s); //publics void getname (char * s); void putage (double w); double getage (); private : double Age; //private again } em1 , em2 ; employee em3, em4 ; void employee : : putname () { ......... } void employee : : putname () { ......... } 23 شعاع دايره را از ورودي خوانده و. برنامه اي که يك شي دايره در آن تعريف شود:تمرين ) (تمام اعضاي داده اي اختصاصي اند.مساحت آن را محاسبه کرده و در خروجي ببرد #include <conio.h> #include <iostream.h> class circle{ int radius; public: void get_radius(); void print(); }; void circle : : get_radius() { cout<<“Enter radius”; cin>> radius; } 24 void circle : : print () { float s; s = radius * radius * 3.14; cout << “ Area = ” << s; } ///////////////////////////////// ///////////////////////////////// int main () { circle c1; c1.get_radius(); c1.print(); getch(); return 0; } 25 تمرين :2 ‏ بخش :1 ‏ يك كالس براي مشخصات درس تعريف نماييد ‏ ‏ ‏ 26 صفات :نام درس ،تعداد واحد و نمره رفتارها :قراردادن نام براي درس ،قرار دادن تعداد واحد براي درس، قرار دادن نمره براي درس و توابعي براي برگرداندن مقادير نسبت داده شده ديگر رفتارها :محاسبه نمره در واحد و برگرداندن آن ادامه تمرين ‏ بخش :2 ‏ 27 براي تست كالس نوشته شده با نام Clessonدرون تابع main اشيا مناسب از نوع كالس را تعريف نموده و متغيرهاي عضو آنرا مقداردهي نماييد و مقادير نسبت داده شده را نمايش دهيد. ادامه تمرين ‏ بخش :3 ‏ يك كالس با نام Cstudentتعريف نماييد ‏ ‏ ‏ ‏ 28 صفات :نام دانشجو ،شماره دانشجويي ،سه درس در نيمسال (از نوع Clessonكه قبًال طراحي شده) رفتارها :توابع مورد نياز جهت مقدار دهي به نام و شماره دانشجويي و برگرداندن اين مقادير ديگر رفتارها :تعيين نام براي هر يك از دروس دانشجو و نمره براي آن درس ديگر رفتارها :محاسبه معدل با توجه به نمره دانشجو در دروس.  پروژه معرفي شده را بعنوان تمرين درسي انجام دهيد )زمان تحويل جلسه آينده( 29 )Constructor( سازنده ها 30 سازنده ها ()constructors ‏ ‏ ‏ ‏ ‏ 31 اغلب اوقات ميخواهيم هنگام ايجاد شيء (تعريف متغير از يک کالس) آنرا مقداردهي اوليه كنيم (متغيرهاي عضو آن را مقداردهي کنيم) و يا عمليات خاصي را انجام دهيم. تمامي کالس ها تابعي به نام سازنده دارند که بطور خودکار هنگام تعريف شي از آن ،کالس اجرا ميشود. يکي از وظايف سازنده ،مقدار دهي اوليه به متغيرهاي عضو شي است. توابع سازنده هر کالس ،هم نام کالس هستند. يک کالس ميتواند بيش از يک سازنده داشته باشد .که براساس قوانين چندريختي ،هنگام ساخت شي ،مشخص ميشود که از کدام سازنده بايد استفاده شود. سازنده ها و دادن مقدار اوليه به اشياء براي پي بردن به مفهوم سازنده ها ( )constructorروش مقدار دادن به يک متغير را به ياد آوريد .دستور زير ضمن تعريف متغير yاز نوع intمقدار اوليه آن را صفر تعيين مي کند. ; int y = 0 کالس مي تواند تابع عضو ويژه اي به نام سازنده داشته باشد ولي اين تابع هيچ مقداري را نميتواند برگرداند و حتي از نوع voidهم نيست .سازنده ،همنام با کالسي است که در آن تعريف مي شود و هنگام ايجاد اشيايي از آن کالس به طور خودکار اجرا مي شود. { class myClass ;int a ;int b ‏public: ;)(myClass ;)(void show ;} 32 myClass : : myClass ( ) { a = 0; b = 10; } void myClass : : show ( ) { cout << “a = ” << a ; cout << “ b = ” << b ; } int main () { myClass ob1; ob1.show(); return 1; } خروجي: a=0 b=10 33 سازنده ‏ ‏ 34 ها (ادامه)... تمامي كالسها داراي سازنده هستند و اگر ما براي يك كالس سازنده ننويسيم كامپايلر از سازنده پيش فرض (Default )Constructorاستفاده ميكند فراخواني سازنده توسط كامپايلر هنگام تعريف متغير بصورت خودكار انجام ميشود سازنده هايي با پارامتر توابع سازنده مي توانند پارامتر داشته باشند .معموًال اين پارامترها براي مقدار اوليه دادن به متغیر های عضو شيء به کار مي روند .مثال زير را در نظر بگيريد { class myClass ;int x ;int y ‏public: ;)myClass ( int i, int j ;)(void show ;} ) myClass : : myClass (int i, int j { ;x=i ;y=j } 35 void myClass : : show ( ) { cout << “x = ” << x ; cout << “y = ” << y << endl ; } int main () { myClass ob1 (10 , 15); myClass ob2 (20 , 25); ob1.show(); ob1.show(); return 1; } خروجي: x=10 y=15 x=20 y=25 36 مثال :يک سازنده روش اول: (فراخواني سازنده براي ) cnt ‏class counter { ‏private: ;int cnt ‏public: )counter():cnt(0 { } ;} ‏ روش دوم( :دستور انتساب) ‏class counter { ‏private: ;int cnt ‏public: { )(counter ;cnt=0 } ;} نتيجه عملي كه انجام ميشود در هر دو روش يكسان است پس از تعريف يك شي از كالس counterمقدار cntبصورت خودكار برابر صفر خواهد 37 شد مثال :يك سازنده ‏ ‏ ‏ 38 در مثال circleکه در قبل گفته شد مي توان به جاي تابع )(setاز يک سازنده استفاده کنيم: )circle(int x ,int y,int r,color fc) : xco(x) , yco(y) , radius(r )} { , fillcolor(fc بايد توجه داشت که توابع سازنده هيچ نوع برگشتي ندارند زيرا سازنده به طور اتوماتيک توسط سيستم احضار مي شود تمرين :3 ‏ ‏ يك كالس براي نگهداري دانشجويان طراحي كنيد با نام ( )CStListكه ظرفيت نگهداري شماره دانشجويي 20دانشجو را داشته باشد. صفتها: ‏ ‏ ‏ -1ارايه اي از نوع صحيح به طول 20براي نگهداري شماره دانشجويي -2تعداد دانشجوياني كه در حال حاضر در ليست هستند رفتارها: ‏ افزودن يك دانشجو به ليست: ‏ ‏ ‏ ‏ ‏ ‏ ‏ 39 ‏ پارامتر ورودي يك عدد صحيح (شماره دانشجويي) مقدار خروجي تابع اگر بتواند اضافه كند 1و در غير اينصورت صفر بر ميگرداند توجه :در فراخواني اين تابع در صورت موفقيت آميز بودن بايد به تعداد دانشجويان ليست يكي اضافه شود حذف يك دانشجو از ليست: ‏ )زمان تحويل جلسه آينده( ورودي :شماره دانشجويي خروجي :اگر فرد در ليست باشد آنرا حذف و عدد 1برميگرداند و در غير اينصورت صفر برميگرداند توجه :در فراخواني اين تابع در صورت موفقيت آميز بودن بايد به تعداد دانشجويان ليست يكي كم شود نمايش ليست برگرداندن تعداد دانشجويان در ليست آرگومانهاي پيش فرض در سازنده ها ‏ ‏ ‏ ‏ 40 سازنده ها مي توانند حاوي آرگومانهاي پيش فرض باشند. با تعيين آرگومانهاي پيش فرض براي سازنده حتي در صورت عدم مقدار دهي در فراخواني سازنده ،اين اطمينان وجود دارد که اشياء مقداردهي اوليه شده اند. سازنده اي که برنامه نويس ايجاد ميکند و تمام آرگومانهاي آن را به طور پيش فرض انتخاب کرده است (يا به هيچ آرگوماني نياز ندارد ) ،سازنده پيش فرض نام دارد. هر کالس فقط يک سازنده پيش فرض مي تواند داشته باشد. class myClass { int x; int y; public: myClass (int i = 0 , int j = 10); void show(); }; myClass : : myClass (int i , int j ) { x=i; y=j; } 41 void myClass : : show ( ) { cout << “x = ” << x ; cout << “y = ” << y << endl ; } int main () { myClass ob1 (11 , 99); myClass ob2 (); ob1.show(); ob1.show(); return 1; } خروجي: x=11 y=99 x=0 y=10 42 تمرين :4 ‏ يك كالس براي ذخيره سازي زمان تعريف نماييد با نام CMyTime ‏ ‏ متغيرهاي عضو :ساعت ،دقيقه و ثانيه سازنده: ‏ ‏ ‏ توابع عضو: ‏ ‏ ‏ ‏ 43 سازنده پيش فرض كه مقادير 0براي تمامي متغيرها لحاظ كند سازنده كپي كه با توجه به شي ورودي و مقادير آن متغيرهاي عضو را مقداردهي نمايد تابعي كه تفاضل زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyTime برگرداند )CMyTime CMyTime::Diff(const CMyTime &t تابعي كه حاصل جمع زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyTime برگرداند )CMyTime CMyTime::Add(const CMyTime &t تابعي كه يك شي از نوع CMyTimeرا بعنوان پارامتر گرفته و اگر مقدار آن بزرگتر از پارامتر ورودي باشد مقدار 1و اگر كوچكتر بود 1-و اگر برابر بودند مقدار 0برگرداند. )int CMyTime::Compare(const CMyTime &t ادامه تمرين 4 ‏ يك كالس براي ذخيره سازي زمان تعريف نماييد با نام CMyDateTime ‏ ‏ متغيرهاي عضو :ساعت ،دقيقه و ثانيه سازنده: ‏ ‏ ‏ ‏ توابع عضو: ‏ ‏ ‏ ‏ 44 سازنده پيش فرض كه مقادير تاريخ و زمان جاري سيستم براي تمامي متغيرها لحاظ كند سازنده كپي كه با توجه به شي ورودي و مقادير آن متغيرهاي عضو را مقداردهي نمايد سازنده اي كه پارمترهاي سال ،ماه ،روز ،ساعت ،دقيقه و ثانيه را بگيرد و اعضا را مقداردهي نمايد. تابعي كه تفاضل زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyDateTime برگرداند )CMyDateTime CMyDateTime::Diff(const CMyTime &t تابعي كه حاصل جمع زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyDateTime برگرداند )CMyDateTime CMyTime::Add(const CMyDateTime &t تابعي كه يك شي از نوع CMyDateTimeرا بعنوان پارامتر گرفته و اگر مقدار آن بزرگتر از پارامتر ورودي باشد مقدار 1و اگر كوچكتر بود 1-و اگر برابر بودند مقدار 0برگرداند. )int CMyDateTime::Compare(const CMyDateTime &t مخرب ها(نابود کننده ها) ‏destructor 45 مخرب ها(نابود کننده ها) ‏ همان طور که وقتي يک شي براي اولين بار اجرا مي شود تابع سازنده آن احضار مي‌شود با نابود شدن شيء نيز تابع ديگري به نام تابع مخرب ( )destructorبه طور اتوماتيک احضار مي‌شود ‏ تابع مخرب همنام با سازنده (يعني همنام با کالس) است اما قبل از آن عالمت مد يعني ~ قرار ميگيرد. ‏ مخرب ها مانند سازنده ها مقدار برگشتي ندارند و هيچ آرگوماني نيز نمي گيرند 46 مثالي از يک مخرب class foo { private: int data; public: foo() : data(0) { } ~foo() { } }; 47 اشياء به عنوان آرگومان هاي تابع 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. (با رنگ قرمز: مي توان از اشياء به عنوان آرگومان ورودي يک تابع استفاده کرد به مثال زير توجه کنيد )مشخص شده است class distance 1. void distance::add_dist (distance { d2,distance d3) private: 2. { int feet; 3. inches=d2.inches+d3.inches; float inches; 4. feet=0; public: 5. if(inches>=12.0) distance() : feet(0),inches(0.0) 6. { { } 7. inches-=12.0; distance(int ft, float in) : feet(ft), 8. feet++; inches(in) 9. } { } 10. feet+=d2.feet+d3.feet; void add_dist(distance ,distance); 11. } }; 48 شرح مثال ‏ .1 .2 49 با توجه به شماره هاي 7الي 11ستون اول مثال قبل متوجه مي شويم کالس distanceدو سازنده دارد دليل وجود اين دو سازنده اين است که: مي خواهيم متغير هايي از نوع distanceبدون مقدار دهي اوليه به آن ها تعريف کنيم (شماره 7و)8 مي خواهيم متغير هايي که از نوع distanceبراي اولين بار ايجاد کنيم مقدار جايگزين کنيم (شماره هاي 9و10و)11 برگرداندن اشياء از توابع تابع )(add_distکه در مثال قبل تعريف کرديم را مي توانيم به صورت زير تعريف کنيم در اين صورت مقدار برگشتي اين تابع يک شيء مي‌باشد ‏ چون اين تابع عضو يک شيء از نوع distanceبرمي گرداند نوع برگشتي اين تابع distanceمي‌باشد واين تابع شيء distanceرا به شيء d2اضافه ميکند و جمع اين دو شيء را بر مي گرداند 50 )distance distance::add_dist2(distance d2 { ;distance temp ;temp.inches=inches + d2.inches )if(temp.inches>=12.0 { ;temp.inches-=12.0 ;temp.feet=1 } ;temp.feet+=feet+d2.feet ;return temp } void distance::Display() { cout<<“\n feet=“<<feet; cout<<“\n inches=“<<inches<<endl; } void main() { distance d1(1,2),d2(5,6); distance d3,d4; d3. add_dist(d1,d2); d4=d1. add_dist2(d2); cout<<“d3 is:”; d3. Display(); cout<<“d4 is:”; d4. Display(); d3 is: getch(); feet=6 } inches =8 d4 is: feet=6 inches =8 51 داده هاي کالس static ‏ ‏ ‏ 52 اگر يک عنصر داده اي در يک کالس به صورت staticاعالن شده باشد صرف نظر از تعداد اشياءي كه از كالس ساخته شده‌اند ،براي متغير عضو staticتنها يک عنصر ايجاد مي‌شود. براي يک عضو staticکالس حافظه جداگانه‌اي اخذ مي‌شود و تمامي نمونه هاي ساخته شده از کالس به اين متغير دسترسي دارند و هر تغييري که در اين نوع عضو داده اي ايجاد شود تمامي اشياء ديگر به آخرين مقدار دسترسي دارند يک متغير عضو استاتيک بسيار شبيه به يک متغير سراسري است مثال #include<iostream.h> class foo { private: static int count; public: foo() {count++} int getcount() {return count;} }; foo:: count = 0; int main() { foo f1,f2,f3; cout<<“count is:”<<f1.getcount(); cout<<“count is”<<f2.getcount(); cout<<“count is”<<f3.getcount(); return 0; }count is:3 :خروجي count is:3 count is:3 53 شرح مثال ‏ ‏ ‏ 54 در اين مثال کالس fooيک عنصر داده اي به نام countازنوع static دارد سازنده اين کالس باعث مي شود countافزايش يابد در )(mainسه شيء از کالس fooتعريف کرديم از آنجا که سازنده سه بار احضار مي شود countسه بار افزايش مي يابد و از آن جايي که داده countاز نوع staticمي‌باشد در نتيجه براي هر 3شيءاي که تابع )(getcountاحضار مي شود يک مقدار(يعني )3را برمي گرداند اگردر اين مثال از يک متغير معمولي به جاي متغير استاتيک استفاده مي کرديم مقداري که تابع )(getcountبرمي گرداند براي هر سه تابع عدد 1بود زيرا در هر شيء فقط يک بار به countاضافه مي‌شود تمرين :5 ‏ يك كالس براي نگهداري آرايه اي از نوع intبه طول nطراحي نماييد بطوري كه nتعداد عناصر ليست است و در سازنده طول آرايه وارد ميشود .در مخرب كالس حافظه اختصاص يافته به سيستم برگردانده ميشود. ‏class CList { ‏public: ;)Clist(int len ;)~Clist(int len ;)int GetItem(int Idx ;)void SetItem(int Idx , int Val ‏privete: ;int *ptr ;} 55 توابع static توابع عضو نيز مي توانند staticباشند اين ويژگي باعث مي‌شود که بتوان بدون ساخت يک شيء يک تابع را فراخواني کرد توابع staticتنها به متغير هاي عضو از نوعstatic دسترسي دارند 56 class MyMath { public: static double SQUARE(double d) {return sqrt(d);} static double POW(double d,double n) {return pow(d,n);} }; int main(int argc, char* argv[]) { cout<<"sqrt(100)=“<<MyMath::SQUARE(100.0)<<endl; getch(); return 0; ايجاد کنيم از تابعMyMath بدون اينکه يک شيء از کالس } استفاده ميکنيم قبل از تابع عضو ابتدا بايد نامSQUAREعضو را بنويسيم::کالس وعالمت 57 موردهاي كاربرد توابع و متغيرهاي ‏static ‏ ‏ ‏ 58 در سيستم انتخاب واحد تمامي دانشجويان دروس ارائه شده در ترم را ميبينند و بايد اين اطالعات بين همه مشترك باشد. در سيستم حمل و نقل تمامي خودروها اطالعات يكساني از مسيرها دارند .اگر كالسي به صورت وسيله نقليه داشته باشيم ميتوانيم اطالعات مربوط به خيابانها و تقاطعها را بصورت متغير staticتعريف نماييم در بازي فوتبال تمامي بازيكنان موقعيت توپ و مالك توابع عضو const ‏ ‏ ‏ ‏ 59 تابع عضو constتضمين مي کند که هيچ يک از داده عضو کالس خود را تغيير نمي دهد اگر بعد از اعالن تابع و قبل از بدنه آن کلمه کليدي constقرار دهيد آن تابع به يک تابع ثابت( )constتبديل مي شود توابع عضوي که کاري انجام نمي دهند اما داده ها را از شيء دريافت مي کنند نامزدهاي خوبي براي constشدن هستند زيرا نمي خواهند هيچ داده اي را تغيير دهند Constساختن يک تابع کمک مي کند تا کامپايلر در صورت نياز پيغامهاي خطا چاپ کند و به کاربر اطالع ميدهد که که تابع نمي خواهد چيزي را در داخل شيء آن تغيير دهد مثال class aclass { private: int alpha; public: void nonfunc() {alpha=99;} void confunc() const {alpha=99;} }; //non-const member function //ok //const member function //error: can’t modify a member 60 اشياء const ‏ 61 هر گاه يک شيء را به صورت constاعالن کنيم ديگر نمي توانيم آن شيء را تغيير دهيم بنابراين تنها از توابع عضو constمي توانيم استفاده کنيم زيرا تنها توابعي هستند که تضمين ميکنند محتواي آن تغيير نمي کند مثال class distance { private: int feet; float inches; public: distance(int ft, float in) : feet(ft), inches(in) { } void getdist() { cout<<“\n enter feet” ; cin>>feet; cout<<“ enter inchest”; cin>>inches; } void showdist() const { cout<<feet<<“\”<<inches<< “\”; } }; int main() { const distance football(300,0); football.getdist(); //error cout<<“football=“; football.showdist(); //ok cout<<endl; return 0; } 62 شرح مثال ‏ چون شيء footballکه از تعريف کرديم از نوع const مي‌باشد آن خط از برنامه که با رنگ سبز نمايش داده شده است باعث ايجاد errorمي شود زيرا تابع getdistيک تابع عضو از نوع constنمي‌باشد اين در حالي است که چون تابع )(showdistاز نوع constمي‌باشد باعث ايجاد errorدر برنامه نمي شود 63

51,000 تومان