اشیاء و کلاس ها
اسلاید 1: 1 اشياء و کلاس ها
اسلاید 2: 2شي و كلاسبايد دو فاز آناليز و پياده سازي را از هم جدا نمودهنگام تجزيه و تحليل مساله ما اشيا را شناسايي ميكنيم و ويژگيهاي هر يك را بيان ميداريمهنگام پياده سازي بصورت نرم افزار بايد اشيا تعريف شوند و نمونه هايي از آنها ساخته شده و مساله را حل نماينديك شي پس از اينكه طراحي شد بصورت يك كلاس در برنامه تعريف ميشودمتغيرهايي كه از كلاس ساخته ميشوند در برنامه اصطلاحاً شي و يا نمونه ميگويند بايد توجه داشت كه از كلمه شي در 2 جا با مفاهيم مختلف استفاده شده است1. هنگام طراحي2. هنگام ساخت برنامه
اسلاید 3: 3تئوري سه مولفه اصلي برنامه نويسي شي گرا1. بسته بندي اطلاعات2. پنهان سازي اطلاعات3. وراثتبسته بندي اطلاعات با تعريف يك شي و رفتارهايش و پياده سازي بصورت كلاس انجام ميشودپنهان سازي اطلاعات با تعريف رفتارها و صفتهاي عمومي و خصوصي و پياده سازي بصورت تعيين نوع عضويت در كلاس انجام ميگيردوراثت شبيه وراثت بيولوژيکي است که در آن فرزندان ، صفاتي را از والدين به ارث مي برند. در اين رابطه مي توان از کلاس موجود (پايه)، کلاس جديد(فرزند) را ايجاد کرد.
اسلاید 4: 4کلاس ، الگويي براي اشياءي است که ويژگيهاي مشترکي دارند و رفتارهاي يکساني از خود نشان ميدهند.شيء نمونه خاصي از کلاس است.
اسلاید 5: 5انتزاع داده ها (data abstraction)فقط ويژگيهاي اساسي انواع بدن ارائه اطلاعات جزئي ، قابل نمايش است. کلاسها از مفهوم نوع داده انتزاعي پيروي مي کند
اسلاید 6: 6کلاس ها واشياء: بسته بنديدر برنامه نويسي شي گرا هر شي از يک سري متغير هاي عضو به نام صفت و يک سري توابع که به توابع رفتار(متد) معروفاند تشکيل ميشودبايد توجه داشت که براي اعلان کلاس از کلمه کليديclass استفاده ميشود
اسلاید 7: 7خصوصي و عمومي: پنهان سازيبرخي ويژگيها و يا پيچيدگيهاي يك شي بايد از ديگر اشيا پنهان بماند و هر شي تنها يك ظاهري (interface) كه براي ديگر اشيا لازم است را به نمايش ميگذارد يك صفت و يا يك رفتار ميتواند درون شي پنهان باشد و ديگر اشيا از آن بي اطلاع باشندمکانيسم اوليه پنهان سازي داده ها قرار دادن آن در يک کلاس و خصوصي سازي آن استداده ها يا توابع خصوصي را تنها ميتوان از داخل کلاس در دسترس قرار دارد از سوي ديگر داده ها يا توابع عمومي از خارج کلاس در دسترس قرار ميگيرند
اسلاید 8: 8توابع عضومعمولا توابع به صورت عمومي وداده ها به صورت خصوصي تعريف ميشوند از اين رو از داده ها فقط در توابع عضو کلاس استفاده ميشوند ولي از توابع عضو درخارج از کلاس هم مي توان استفاده کردبايد توجه داشت که در بعضي مواقع مجبور مي شويم از توابع خصوصي و داده هاي عمومي استفاده کنيمتابع عضو را مي توان :1. در داخل کلاس اعلان کرد ودر همان جا پياده سازي کنيم (در صورتي که تعريف تابع کوتاه باشد)2. در داخل کلاس اعلان کرد ودر خارج کلاس پياده سازي کنيم
اسلاید 9: 9تعريف کلاس در c ++براي تعريف کلاس از کلمه کليدي class و ساختاري به صورت زير استفاده مي شود:class نام کلاس {public: داده ها و توابع عموميprivate:داده ها و توابع اختصاصيprotected:داده ها ي حفاظت شده};
اسلاید 10: 10نامگذاري کلاس همانند متغيرها انجام ميشود.نام كلاس بايد بيانگر موجوديت باشد و حتي الامكان از اسامي بي ربط استفاده نشودتوابع يا داده هايي كه بعد از تعريف کلاس يا بعد از کلمه کليدي private اعلان ميشوند ، براي کلاس اختصاصي خواهند بود و فقط و فقط اجزاي همان کلاس حق استفاده و دسترسي به آنها را دارند.داده ها و توابعي که بعد از کلمه کليدي public تعريف ميشوند به صورت عمومي خواهند بود و هر قسمت ديگر برنامه مي تواند به آنها دسترسي داشته باشد.توابع و داده هايي که پس از کلمه کليدي protected تعريف ميشوند محافظت شده هستند و در وراثت مورد استفاده قرار مي گيرند.توضيح نحوه تعريف كلاس
اسلاید 11: 11براي تعريف شي از يك كلاس در هر جايي از برنامه به صورت زير عمل کنيد. نام شي ء نام کلاس ;تعريف اشياء همانند تعريف متغيرهاست تعريف يك شي از كلاس
اسلاید 12: 12کلاس سادهاين برنامه شامل يک کلاس و دو شيء از آن کلاس است#include <iostream.h>class smallobj{private:int somedata;public:void setdata(int d){somedata=d;}void showdata(){cout<<“data is”<<somedata;}};
اسلاید 13: 13استفاده از كلاس بعنوان يك نوع دادهايint main(){smallobj s1,s2;s1.setdata(1006);s2.setdata(876);s1.showdata();s2.showdata();return 0;}
اسلاید 14: 14توضيح برنامه کلاس smallobj که در اين برنامه اعلان شده حاوي يک عنصر دادهاي و دو تابع عضو ميباشد که اين دو تابع با عضو داده اي داخلي كار ميكنند و از خارج كلاس در دسترسي هستندتابع عضو اول به عضو داده اي يک مقدار نسبت ميدهد و تابع عضو دوم اين مقدار را در خروجي نمايش ميدهد
اسلاید 15: 15استفاده از کلاس هاپس از اعلان کلاس ميتوان در داخل تابع main() از اين کلاس ها براي تعريف شيء استفاده کردمثال:smallobj s1 , s2 ; نام کلاسنام اشياءتعريف يک شيء شبيه تعريف يک متغير از هر نوع داده اي است که براي حافظه گرفته مي شود چون شيء در واقع نمونه اي از يک کلاس است به تعريف شي نمونه سازي شيء نيز مي گويند (توجه داشته باشيد كه اتلاقهاي فوق در هنگام پياده سازي معتبر هستند)
اسلاید 16: 16احضار تابع هاي عضودستور زير تابع عضو setdata() را احضار مي کند:s1.setdata(1006)از آنجا که تابع setdata() يک تابع عضو از کلاس ميباشد بايد در ارتباط با يک شيء از اين کلاس (s1) احضار شودپس نوشتن دستور زير باعث توليد پيغام خطاي کاربر مي شود:setdata(1006)براي استفاده از يک تابع عضو عملگر نقطه نام شيء و تابع عضو را به هم وصل ميکند
اسلاید 17: 17توابع عضو كلاس حتماً بايد براي يك شيءساخته شده فراخواني شوند
اسلاید 18: 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مثالدر اين مثال يک کلاس که مربوط به شيء دايره است را مورد بررسي قرار ميدهيم.تعريف كلاس به همراه متغيرهاي عضو و بيان نمونه اوليه توابع عضو
اسلاید 19: 19ادامه مثال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);}پياده سازي توابع عضوبيان نام كلاساپراتور محدوده كلاستابع براي مقدار دهي به مقادير عضواستفاده شده است
اسلاید 20: 20ادامه مثال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);}
اسلاید 21: خروجي برنامه21
اسلاید 22: توضيحدر برنامه قبل با دو نوع داده اي جديد آشنا شديم:COLORREFCDCنوع داده اي اول (COLORREF) براي نگهداري رنگ است. رنگها در ويندوز از ترکيب سه رنگ اصلي قرمز، سبز و آبي توليد ميشوند.ماکرو RGB، سه رنگ قرمز، سبز و آبي را با هم ترکيب ميکند. ميزان هر رنگ مقداري بين 0 تا 255 دارد.RGB(255,0,0) رنگ قرمز است.نوع داده اي دوم (CDC) کلاسي است که توابع مربوط به عمليات نقاشی روي فرمها در ويندوز را انجام ميدهد. 22
اسلاید 23: 23class employee {char name[20]; // private by defaultpublic : void putname (char * s); //publicsvoid 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 (){. . . . . . . . .}مثالي ديگر از تعريف كلاس
اسلاید 24: 24تمرين: برنامه اي که يك شي دايره در آن تعريف شود. شعاع دايره را از ورودي خوانده و مساحت آن را محاسبه کرده و در خروجي ببرد. (تمام اعضاي داده اي اختصاصي اند)#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;}
اسلاید 25: 25void circle : : print (){float s;s = radius * radius * 3.14;cout << “ Area = ” << s;}//////////////////////////////////////////////////////////////////int main (){circle c1;c1.get_radius();c1.print();getch();return 0;}
اسلاید 26: تمرين 2:بخش 1:يك كلاس براي مشخصات درس تعريف نماييدصفات: نام درس، تعداد واحد و نمرهرفتارها: قراردادن نام براي درس، قرار دادن تعداد واحد براي درس، قرار دادن نمره براي درس و توابعي براي برگرداندن مقادير نسبت داده شدهديگر رفتارها: محاسبه نمره در واحد و برگرداندن آن26
اسلاید 27: ادامه تمرينبخش 2: براي تست كلاس نوشته شده با نام Clesson درون تابع main اشيا مناسب از نوع كلاس را تعريف نموده و متغيرهاي عضو آنرا مقداردهي نماييد و مقادير نسبت داده شده را نمايش دهيد.27
اسلاید 28: ادامه تمرينبخش 3: يك كلاس با نام Cstudent تعريف نماييدصفات: نام دانشجو، شماره دانشجويي، سه درس در نيمسال (از نوع Clesson كه قبلاً طراحي شده)رفتارها: توابع مورد نياز جهت مقدار دهي به نام و شماره دانشجويي و برگرداندن اين مقاديرديگر رفتارها: تعيين نام براي هر يك از دروس دانشجو و نمره براي آن درسديگر رفتارها: محاسبه معدل با توجه به نمره دانشجو در دروس.28
اسلاید 29: پروژه معرفي شده را بعنوان تمرين درسي انجام دهيد29(زمان تحويل جلسه آينده)
اسلاید 30: 30سازنده ها (Constructor)
اسلاید 31: 31سازنده ها (constructors)اغلب اوقات ميخواهيم هنگام ايجاد شيء (تعريف متغير از يک کلاس) آنرا مقداردهي اوليه كنيم (متغيرهاي عضو آن را مقداردهي کنيم) و يا عمليات خاصي را انجام دهيم.تمامي کلاس ها تابعي به نام سازنده دارند که بطور خودکار هنگام تعريف شي از آن، کلاس اجرا ميشود.يکي از وظايف سازنده، مقدار دهي اوليه به متغيرهاي عضو شي است. توابع سازنده هر کلاس، هم نام کلاس هستند.يک کلاس ميتواند بيش از يک سازنده داشته باشد. که براساس قوانين چندريختي، هنگام ساخت شي، مشخص ميشود که از کدام سازنده بايد استفاده شود.
اسلاید 32: 32سازنده ها و دادن مقدار اوليه به اشياءبراي پي بردن به مفهوم سازنده ها (constructor) روش مقدار دادن به يک متغير را به ياد آوريد. دستور زير ضمن تعريف متغير y از نوع int مقدار اوليه آن را صفر تعيين مي کند. int y = 0 ;کلاس مي تواند تابع عضو ويژه اي به نام سازنده داشته باشد ولي اين تابع هيچ مقداري را نميتواند برگرداند و حتي از نوع void هم نيست. سازنده ، همنام با کلاسي است که در آن تعريف مي شود و هنگام ايجاد اشيايي از آن کلاس به طور خودکار اجرا مي شود.class myClass {int a;int b;public:myClass();void show();};
اسلاید 33: 33myClass : : 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
اسلاید 34: 34سازنده ها (ادامه...)تمامي كلاسها داراي سازنده هستند و اگر ما براي يك كلاس سازنده ننويسيم كامپايلر از سازنده پيش فرض (Default Constructor) استفاده ميكندفراخواني سازنده توسط كامپايلر هنگام تعريف متغير بصورت خودكار انجام ميشود
اسلاید 35: 35سازنده هايي با پارامترتوابع سازنده مي توانند پارامتر داشته باشند. معمولاً اين پارامترها براي مقدار اوليه دادن به متغیر های عضو شيء به کار مي روند. مثال زير را در نظر بگيريدclass myClass {int x;int y;public:myClass ( int i, int j);void show();};myClass : : myClass (int i, int j ){x = i ;y = j ;}
اسلاید 36: 36void 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
اسلاید 37: 37مثال: يک سازندهروش اول: (فراخواني سازنده براي cnt ) class counter {private:int cnt;public:counter():cnt(0){}};روش دوم: (دستور انتساب)class counter {private:int cnt;public:counter() { cnt=0; }};نتيجه عملي كه انجام ميشود در هر دو روش يكسان استپس از تعريف يك شي از كلاس counter مقدار cnt بصورت خودكار برابر صفر خواهد شد
اسلاید 38: 38مثال: يك سازندهدر مثال circle که در قبل گفته شد مي توان به جاي تابع set() از يک سازنده استفاده کنيم:circle(int x ,int y,int r,color fc) : xco(x) , yco(y) , radius(r) , fillcolor(fc) { } بايد توجه داشت که توابع سازنده هيچ نوع برگشتي ندارند زيرا سازنده به طور اتوماتيک توسط سيستم احضار مي شود
اسلاید 39: تمرين 3:يك كلاس براي نگهداري دانشجويان طراحي كنيد با نام (CStList) كه ظرفيت نگهداري شماره دانشجويي 20 دانشجو را داشته باشد.صفتها: 1- ارايه اي از نوع صحيح به طول 20 براي نگهداري شماره دانشجويي2- تعداد دانشجوياني كه در حال حاضر در ليست هستندرفتارها:افزودن يك دانشجو به ليست: پارامتر ورودي يك عدد صحيح (شماره دانشجويي) مقدار خروجي تابع اگر بتواند اضافه كند 1 و در غير اينصورت صفر بر ميگرداندتوجه: در فراخواني اين تابع در صورت موفقيت آميز بودن بايد به تعداد دانشجويان ليست يكي اضافه شودحذف يك دانشجو از ليست:ورودي: شماره دانشجوييخروجي: اگر فرد در ليست باشد آنرا حذف و عدد 1 برميگرداند و در غير اينصورت صفر برميگرداندتوجه: در فراخواني اين تابع در صورت موفقيت آميز بودن بايد به تعداد دانشجويان ليست يكي كم شودنمايش ليستبرگرداندن تعداد دانشجويان در ليست39(زمان تحويل جلسه آينده)
اسلاید 40: 40سازنده ها مي توانند حاوي آرگومانهاي پيش فرض باشند.با تعيين آرگومانهاي پيش فرض براي سازنده حتي در صورت عدم مقدار دهي در فراخواني سازنده، اين اطمينان وجود دارد که اشياء مقداردهي اوليه شده اند.سازنده اي که برنامه نويس ايجاد ميکند و تمام آرگومانهاي آن را به طور پيش فرض انتخاب کرده است (يا به هيچ آرگوماني نياز ندارد )، سازنده پيش فرض نام دارد.هر کلاس فقط يک سازنده پيش فرض مي تواند داشته باشد.آرگومانهاي پيش فرض در سازنده ها
اسلاید 41: 41class 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 ;}
اسلاید 42: 42void 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=99x=0 y=10
اسلاید 43: تمرين 4:يك كلاس براي ذخيره سازي زمان تعريف نماييد با نام CMyTimeمتغيرهاي عضو: ساعت، دقيقه و ثانيهسازنده: سازنده پيش فرض كه مقادير 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) 43
اسلاید 44: ادامه تمرين 4يك كلاس براي ذخيره سازي زمان تعريف نماييد با نام CMyDateTimeمتغيرهاي عضو: ساعت، دقيقه و ثانيهسازنده: سازنده پيش فرض كه مقادير تاريخ و زمان جاري سيستم براي تمامي متغيرها لحاظ كندسازنده كپي كه با توجه به شي ورودي و مقادير آن متغيرهاي عضو را مقداردهي نمايدسازنده اي كه پارمترهاي سال، ماه، روز، ساعت، دقيقه و ثانيه را بگيرد و اعضا را مقداردهي نمايد.توابع عضو: تابعي كه تفاضل زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyDateTime برگرداند CMyDateTime CMyDateTime::Diff(const CMyTime &t) تابعي كه حاصل جمع زماني شي و شي ورودي را محاسبه نموده و بصورت يك شي CMyDateTime برگرداند CMyDateTime CMyTime::Add(const CMyDateTime &t) تابعي كه يك شي از نوع CMyDateTime را بعنوان پارامتر گرفته و اگر مقدار آن بزرگتر از پارامتر ورودي باشد مقدار 1 و اگر كوچكتر بود -1 و اگر برابر بودند مقدار 0 برگرداند.int CMyDateTime::Compare(const CMyDateTime &t) 44
اسلاید 45: 45مخرب ها(نابود کننده ها)destructor
اسلاید 46: 46مخرب ها(نابود کننده ها)همان طور که وقتي يک شي براي اولين بار اجرا مي شود تابع سازنده آن احضار ميشود با نابود شدن شيء نيز تابع ديگري به نام تابع مخرب (destructor) به طور اتوماتيک احضار ميشودتابع مخرب همنام با سازنده (يعني همنام با کلاس) است اما قبل از آن علامت مد يعني ~ قرار ميگيرد.مخرب ها مانند سازنده ها مقدار برگشتي ندارند و هيچ آرگوماني نيز نمي گيرند
اسلاید 47: 47مثالي از يک مخربclass foo{private:int data;public:foo() : data(0){ }~foo(){ }};
اسلاید 48: 48اشياء به عنوان آرگومان هاي تابعمي توان از اشياء به عنوان آرگومان ورودي يک تابع استفاده کرد به مثال زير توجه کنيد:(با رنگ قرمز مشخص شده است)class distance{private: int feet; float inches;public: distance() : feet(0),inches(0.0) { } distance(int ft, float in) : feet(ft), inches(in) { } void add_dist(distance ,distance);};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;}
اسلاید 49: 49شرح مثالبا توجه به شماره هاي 7 الي 11 ستون اول مثال قبل متوجه مي شويم کلاس distance دو سازنده دارد دليل وجود اين دو سازنده اين است که:مي خواهيم متغير هايي از نوع distance بدون مقدار دهي اوليه به آن ها تعريف کنيم (شماره 7و8)مي خواهيم متغير هايي که از نوع distance براي اولين بار ايجاد کنيم مقدار جايگزين کنيم (شماره هاي 9و10و11)
اسلاید 50: 50برگرداندن اشياء از توابعتابع add_dist() که در مثال قبل تعريف کرديم را مي توانيم به صورت زير تعريف کنيم در اين صورت مقدار برگشتي اين تابع يک شيء ميباشد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;}چون اين تابع عضو يک شيء از نوع distance برمي گرداند نوع برگشتي اينتابع distance ميباشد واين تابع شيءdistance را به شيءd2 اضافه ميکند و جمع اين دو شيء را بر مي گرداند
اسلاید 51: 51void 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();getch();}d3 is:feet=6inches =8d4 is:feet=6inches =8
اسلاید 52: 52داده هاي کلاس staticاگر يک عنصر داده اي در يک کلاس به صورت static اعلان شده باشد صرف نظر از تعداد اشياءي كه از كلاس ساخته شدهاند، براي متغير عضو static تنها يک عنصر ايجاد ميشود.براي يک عضو static کلاس حافظه جداگانهاي اخذ ميشود و تمامي نمونه هاي ساخته شده از کلاس به اين متغير دسترسي دارند و هر تغييري که در اين نوع عضو داده اي ايجاد شود تمامي اشياء ديگر به آخرين مقدار دسترسي دارنديک متغير عضو استاتيک بسيار شبيه به يک متغير سراسري است
اسلاید 53: 53مثال#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:3count is:3count is:3
اسلاید 54: 54شرح مثالدر اين مثال کلاسfoo يک عنصر داده اي به نام count ازنوع static دارد سازنده اين کلاس باعث مي شود count افزايش يابددر main() سه شيء از کلاس foo تعريف کرديم از آنجا که سازنده سه بار احضار مي شود count سه بار افزايش مي يابد و از آن جايي که داده count از نوع static ميباشد در نتيجه براي هر 3 شيءاي که تابع getcount() احضار مي شود يک مقدار(يعني 3) را برمي گردانداگردر اين مثال از يک متغير معمولي به جاي متغير استاتيک استفاده مي کرديم مقداري که تابع getcount() برمي گرداند براي هر سه تابع عدد 1 بود زيرا در هر شيء فقط يک بار به count اضافه ميشود
اسلاید 55: تمرين 5:يك كلاس براي نگهداري آرايه اي از نوع int به طول n طراحي نماييد بطوري كه n تعداد عناصر ليست است و در سازنده طول آرايه وارد ميشود. در مخرب كلاس حافظه اختصاص يافته به سيستم برگردانده ميشود.55class CList{public:Clist(int len);~Clist(int len);int GetItem(int Idx);void SetItem(int Idx , int Val);privete:int *ptr;};
اسلاید 56: 56توابع staticتوابع عضو نيز مي توانندstatic باشند اين ويژگي باعث ميشود که بتوان بدون ساخت يک شيء يک تابع را فراخواني کرد توابع static تنها به متغير هاي عضو از نوعstatic دسترسي دارند
اسلاید 57: 57class 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 استفاده ميکنيم قبل از تابع عضو ابتدا بايد نام کلاس وعلامت:: را بنويسيم
اسلاید 58: 58موردهاي كاربرد توابع و متغيرهاي staticدر سيستم انتخاب واحد تمامي دانشجويان دروس ارائه شده در ترم را ميبينند و بايد اين اطلاعات بين همه مشترك باشد.در سيستم حمل و نقل تمامي خودروها اطلاعات يكساني از مسيرها دارند. اگر كلاسي به صورت وسيله نقليه داشته باشيم ميتوانيم اطلاعات مربوط به خيابانها و تقاطعها را بصورت متغير static تعريف نماييمدر بازي فوتبال تمامي بازيكنان موقعيت توپ و مالك
اسلاید 59: 59توابع عضو constتابع عضوconst تضمين مي کند که هيچ يک از داده عضو کلاس خود را تغيير نمي دهداگر بعد از اعلان تابع و قبل از بدنه آن کلمه کليدي const قرار دهيد آن تابع به يک تابع ثابت(const) تبديل مي شودتوابع عضوي که کاري انجام نمي دهند اما داده ها را از شيء دريافت مي کنند نامزدهاي خوبي براي const شدن هستند زيرا نمي خواهند هيچ داده اي را تغيير دهندConst ساختن يک تابع کمک مي کند تا کامپايلر در صورت نياز پيغامهاي خطا چاپ کند و به کاربر اطلاع ميدهد که که تابع نمي خواهد چيزي را در داخل شيء آن تغيير دهد
اسلاید 60: 60مثالclass aclass{private:int alpha;public:void nonfunc() //non-const member function{alpha=99;} //okvoid confunc() const //const member function{alpha=99;} //error: can’t modify a member};
اسلاید 61: 61اشياء constهر گاه يک شيء را به صورت const اعلان کنيم ديگر نمي توانيم آن شيء را تغيير دهيم بنابراين تنها از توابع عضو const مي توانيم استفاده کنيم زيرا تنها توابعي هستند که تضمين ميکنند محتواي آن تغيير نمي کند
اسلاید 62: 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;} void showdist() const{cout<<feet<<“”<<inches<<“”;}};int main(){const distance football(300,0);football.getdist(); //errorcout<<“football=“;football.showdist(); //okcout<<endl;return 0;}
اسلاید 63: 63شرح مثالچون شيء football که از تعريف کرديم از نوع const ميباشد آن خط از برنامه که با رنگ سبز نمايش داده شده است باعث ايجاد error مي شود زيرا تابع getdist يک تابع عضو از نوع const نميباشد اين در حالي است که چون تابع showdist() از نوع const ميباشد باعث ايجاد error در برنامه نمي شود
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.