توابع :
دربرنامه های طولانی وپیچیده که شامل چندین بخش منطقی ومستقل از هم هستند ، بهتر است برای هرقسمت منطقی ، برنامه جداگانه ای نوشته شود .
برنامه هایی که برای هر یک از بخش نوشته می شود ، تابع نام دارد درواقع تابع ، برنامه ای است که برای حل بخشی از مسئله نوشته می شود .
- توابع کتابخانه ای :
تعدادی از توابع که دراغلب برنامه ها مورد استفاده قرارمی گیرند و کاربرد زیادی دارند ، از قبل نوشته شده ، به همراه کامپایلر C++ ارائه می شوند که به آنهاتوابع کتابخانه ای گویند مثل تابع clrsc() که صفحه نمایش را پاک می کند .
برحسب ضرورت می توان توابعی را بنویسید ودر برنامه مورد استفاده قرار داد .
بااستفاده از توابع می توان برنامه های ساخت یافته نوشت وظایف این نوع برنامه ها توسط بخش های مستقلی که تشکیل دهنده برنامه اند انجام می شود .
این بخش ها ی مستقل همان توابع هستند امتیازات برنامه نویسی ساخت یافته عبارتند از 1- نوشتن برنامه های ساخت یافته آسان است 2- همکاری بین افراد رافراهم می کند 3- اشکال زدایی برنامه های ساخت یافته ساده تر است 4- برنامه نویس ساخت یافته موجب صرفه جویی در وقت می شود .
نوشتن تابع
برای نوشتن تابع باید اهداف تابع مشخص باشد تابع چه وظیفه ای به عهده دارد ،ورودی های تابع چیست ، وخروجی های تابع کدامند با دانستن این موارد نوشتن تابع چندان دشوار نیست .
هر تابع دارای سه جنبه است ،1- جنبه تعریف تابع : که مجموع ای از دستورات است که عملکرد تابع را مشخص می کند 2- جنبه فراخوانی تابع دستوری است که تابع را فراخوانی می کندفراخوانی تابع بانام آن انجام می شود 3- جنبه اعلان .
نکاتی درمورد نوشتن تابع :
1- ابتدا بدون پرداختن به جزئیات پیاده سازی توابع ، آرگومانها ونتیجه ای را که ازتابع انتظار دارید ،مشخص کرده ،برنامه اصلی را بنویسید به عبارت دیگر درقدم اول لازم نیست با جزئیات پیاده سازی تابع بپردازید پس ازنوشتن برنامه اصلی ، توابع دیگر را بنویسید 2- توابع را طوری طراحی وپیاده سازی کنید که هرتابع فقط به آنچه که نیاز دارد دسترسی داشته باشد وبقیه قسمتهای برنامه وسایر اطلاعات توسط توابع غیرمرتبط قابل دستیابی نباشد این موضوع را پنهان سازی اطلاعات گویند برای این منظور ، هرتابع باید یک نقطه ورود ویک نقطه خروج داشته باشد .
3- برای ارتباط بین توابع ، ازآرگومان ها وپارامترها استفاده کنید .
چگونگی کار تابع :
وقتی تابعی ،توسط تابع دیگری فراخوانی می شود ، دستورات آن تابع اجرا می شوند پس از اجرای دستورات تابع ،کنترل اجرای برنامه ، به برنامه فراخوانی بر می گردد ، پس ازبرگشت ازتابع فراخوانی شده ، اولین دستور بعداز فراخوانی تابع ( درتابع فراخوانی ) اجرامی شود .
روش های ارسال پارامترها به توابع :
پارامترها را به دوطریق می توان ازتابع فراخوانی شونده ارسال کرد .
این دوروش عبارت اند از 1- روش فراخوانی بامقدار 2- روش فراخوانی با ارجاع .
روش فراخوانی ، تعداد مقادیری رامشخص می کندکه توابع فراخوانی شونده می توانند بر گردانند در روش فراخوانی بامقدار ، دو دسته توابع می توانند وجود داشته باشد 1- توابعی که هیچ مقداری رابر نمی گردانند 2- توابعی که فقط یک مقدار را برمی گردانند اما در روش فراخوانی باارجاع توابع می توانند چندین مقدار را به تابع فراخوان برگردانند .
توابعی که هیچ مقداری را برنمی گردانند :
ممکن است در برنامه ای
توابعی که هیچ مقداری را بر نمی گردانند
ممکن است دربرنامه از توابعی استفاده کنیم که آن توابع پس از فراخوانی ، عملیات مورد نظر را انجام دهند و خروجی های مورد انتظار راتولید وچاپ نمایند وهیچ مقداری را به تابع فراخوان تحویل ندهند .
دربسیاری از مسئله هایی که با کامپیوتر حل می شوند ، این گونه توابع به چشم می خورند .
توابعی که یک مقدار را بر می گردانند در بسیاری از مسئله هایی که توسط کامپیوتر حل می شوند ، نیاز به نوشتن توابعی است که یک مقدار را بر می گردانند .
مثل تابع Sin () که سینوس یک زاویه رابر می گرداند .
اینگونه ، توابع کاربردهای فراوانی دارند .
برای نوشتن اینگونه توابع ، نوع آنها رابا ید در الگوی تابع وعنوان تابع مشخص کرد برای برگرداندن مقداری توسط تابع ، ازدستور return به صورت های زیر استفاده میشود : ،(> عبارت ؛ >عبارت تفاوتی بین دورش کاربرد return وجودندارد مقداری که توسط دستور returnبرگشت داده می شود درنام تابع قرارمی گیرددربرنامه فراخوان ، می توان نام تابع را به متغیری نسبت داد وازمحتویات آن استفاده کرد.
به عنوان مثال اگر ، f1() یک تابع از نوع x,int متغیری از نوع int باشد ، دستورزیر ، تابع f1() رافراخوانی کرده ، مقداری را که توسط دستور return در نام تابع قرارمی گیرد ، در x قرار می دهد .
بازگشتی بازگشتی به مفهومی گفته می شود که در آن ، تابعی خودش را فراخوانی می کند .
توابع می توانند به طور مستقیم یا غیر مستقیم خودشان رافراخوانی کنند .
درروش مستقیم ، یکی ازدستورات تابع ، فراخوانی خودش است در روش غیر مستقیم ، تابعی مثل f1() تابع f2() رافراخوانی می کند وتابع f2() نیز به نوبه خود تابع f1() را فرا خوانی می نماید برای ایجاد بازگشتی ، الگوریتمی که توسط تابع پیاده سازی می شود ، باید خصوصیت بازگشتی داشته باشد .
طرح کلی الگوریتم های بازگشتی به صورت زیر است : یک یا چند حالت ، که در آن ، تابع وظیفه خودش را به صورت بازگشتی انجام می دهد .
یعنی این حالت ها خاصیت بازگشتنی دارند .
یک یا چندحالت که در آن ، تابع وظیفه خودش را بدون فراخوانی بازگشتنی انجام می دهد .
این حالت را حالت توقف گویند .
اغلب با استفاده از یک دستور if مشخص می شود که کدام یک از این حالت ها باید انجام شوندبرای این که فراخوانی های بازگشتی به اتمام برسد .
باید حالت توقف اتفاق بیفتد .
یعنی هر فراخوانی تابع ، سرانجام باید به حالت توقف ختم شود ، در غیر این صورت ، فراخوانی تابع خاتمه نمی یابد .
( به حالت توقف رسیدی ) if مسئله حالت توقف را حل کن تابع را بار دیگر فراخوانی کن Else عملگرها عملگرها نمادهایی هستند که اعمال خاصی را انجام می دهند .
به عنوان مثال نماد ُ+ ُ عملگری است که دو مقدار را باهم جمع می کند ( عمل جمع را انجام می دهد ) پس از اعلان متغیرها ومقدار دادن به آنها باید بتوان عملیاتی را روی آنها انجام دادبرای انجام این عملیات باید از عملگرها استفاده کرد .
عملگرها درزبان C++ به چند دسته تقسیم می شوند : عملگرهای محاسباتی عملگرهای رابطه ای عملگرهای منطقی عملگرهای ترکیبی عملگرهای بیتی عملگرهای متفرقه عملگرها بر روی یک یا دو مقدار عمل می کنند .
مقادیری را که عملگرها بر روی آنها عمل می کنند ، عملوند گویند .
1-7-1 عملگرهای محاسباتی عملگرهای محاسباتی ، اعمال محاسباتی را روی عملوندها انجام می دهند .
تقدم عملگرهای محاسباتی وقتی درعبارتی ، چندین عملگر با هم ترکیب می شوند ، ترتیب اجرای آنها با دوویژگی زبان برنامه سازی C+ + تعیین می شود : تقدم علمگرها شرکت پذیری عملگرها جدول4-1 تقدم عملگرهای محاسباتی عملگرهای رابطه ای عملگرهای رابطه ای ، ارتباط بین عملوندها رامشخص می کنند .اعمالی مثل تساوی دو مقدار ، کوچک تر یا بزرگ تر بودن ، مقایسه با صفر وغیره ، توسط عملگرهای رابطه ای مشخص می شودعملگرهای رابطه ای در جدول 5-1 آمده اند .
درمورد عملگرهای رابطه ای ، شاید با عملگر == آشنایی نداشته باشید .
این عملگر دردستورات شرطی برای مقایسه دو مقدار مورد استفاده قرار می گیرد به عنوان مثال ، دستور مقایسه دومقدار Y,X بایدبه صورت آیا X = = Y نوشته شود .
جدول 5-1 عملگرهای رابطه ای عملگرهای منطقی عملگرهای منطقی بر روی عبارات منطقی عمل می کنند .
عبارات منطقی دارای دو ارزش درستی ونادرستی اند .
در زبان C ++ ارزش نادرستی بامقدار صفر وارزش درستی بامقادیر غیر صفر مشخص می شود روش دیگر تعیین مقادیر درستی ونادرستی ،استفاده از ثوابت False, trueاست .
true به معنی ارزش درستی وfalse به معنی ارزش نادرستی است ثابت true به 1 وثابت false به صفر تبدیل می شود ، عکس این مطلب نیز درست است ، مقدار صفر به false ومقدار یک به true تبدیل خواهد شد .
عملگرهای منطقی درجدول 6-1 آمده اند ترتیب قرارگرفتن آنهادر جدول ، از تقدم بالا به پایین است .
جدول 6-1 عملگرهای منطقی به ترتیب تقدم عملگرهای ترکیبی ازترکیب عملگرهای محاسباتی وعملگر = مجموعه دیگر ی از عملگرها ایجاد می شود که عمل محاسباتی وانتساب را انجام می دهد این عملگرها در جدول 8-1 آمده اند تقدم این عملگرها پایین تر ازسایر عملگرها است .
جدول 8-1 عملگرهای ترکیبی عملگرهای بیتی وجود عملگرهای بیتی در C++ موجب شد تا بسیاری ازکارهای زبان اسمبلی در انجام شود عملگرهای بیتی برای تست کردن ، مقدار دادن یا شیفت دادن وسایر اعمال بر روی مقادیری به کارمی روند که دریک بایت ( CHAR) یاکلمه ( int) ذخیره شده اند عملگرهای بیتی را نمی توان با انواع void,long,double,double,float یا سایر انواع پیچیده به کار برد .
عملگرهای بیتی در جدول 9-1 آمده اند .
جدول 9-1 عملگرهای بیتی عملگرهای متفرقه تعدادی ازعملگرها در C++ وجود دارند که دردسته بندی خاصی نمی گنجد .
به همین دلیل آنها را تحت عنوان عملگرهای متفرقه مورد بحث قرار می دهیم .
عملگرهای & و ْ همان طور که گفته شد ، متغیرها نامی برای کلمات حافظه اند وکلمات حافظه نیزدارای شماره ردیف می باشند که ما آنها را آدرس می نامیم با استفاده از عملگر & می توانیم به آدرس متغیرها دسترسی داشته باشیم عملگر * نیز برای دسترسی غیرمستقیم به حافظه مورد استفاده قرار می گیرد .
عملگر ؟
این عملگر ، عبارتی را ارزیابی کرده ، براساس ارزش آن عبارت ( درستی یا نادرستی ) نتیجه عبارت دیگر را در متغیری قرار می دهد .
>عبارت 3 عبارت 2 عبارت 1 عملگر کاما ( ، ) این عملگر برای انجام چندعمل در یک دستوربه کار می رود وکاربرد آن به صورت زیراست : >) , عبارت 2 ,عبارت 1 ( عملگر sizeof این عملگر ، یک عملگر زمان ترجمه است ومی تواند طول یک متغیر یانوع داده را برحسب بایت تعیین کند .
اگر با کامپیوتری کار می کنید ونمی دانید انواع آن ، مثلا نوع int چندبایتی است ، با این عملگر می توانید به آن پی ببرید این عملگر به صورت های زیر به کار می رود : عملگر() پرانتزها عملگرهایی هستند که تقدم عملگرهای داخل خود را بالا می برند به عنوان مثال ، عبارت زیرا را درنظر بگیرید : Y = 4 * 2/(3+ 1) +( 6+ ( 7-2)) تقدم عملگرها درحالت کلی تاکنون عملگرهای موجود در C++ رامطالعه کردیم .
اگرانواع مختلفی از عملگرها با هم در عبارتی به کار گرفته شوند ، برای ارزیابی عبارت باید ترتیب اجرای آنها را بدانیم تقدم عملگرها در حالت کلی ، درجدول 12-1 آمده است .
جدول 12-1 تقدم عملگرها درحالت کلی بعضی از عملگرها رامی توانید طوری تعریف کنید که اعمال خاصی را در مورد کلاس هایی که ایجاد می کنید انجام دهند این عمل را تعریف مجدد عملگر گویند وقتی عملگری دوباره تعریف می شودتاماموریت جدیدی را درموردکلاس ها انجام دهد ، وظیفه اصلی خودش رانیز می تواند انجام دهد .
عملگرها رامی توان با ایجادتابعی به نام تابع عملگر مجدداً تعریف کرد .
این تابع ، اعمالی را تعریف می کند که این عملگر بایددر تعریف جدیدخود ، درخصوص کلاس ها انجام دهد .
این تابع به کلمه کلیدی operator شروع می شود که پس از آن عملگری که دوباره بایدتعریف شود ، قرار می گیرد .
برای به کار بردن عملگرها باا شیای کلاس ، آن عملگرها باید دوباره تعریف شوند دراین خصوص ،دو استثنا وجود دارد ، عملگر انتساب ( =) را بدون تعریف مجددمی توان با کلاس ها به کار برد .
رفتارعادی عملگر انتساب این است که اعضای داده ای کلاس را بیت به بیت به یکدیگر نسبت می دهد البته در ادامه خواهیم دید که این کار برای اعضایی ازکلاس که از نوع اشاره گر هستند ، خطرناک است درمورد این گونه کلاس ها ، عملگر انتساب را مجدداً تعریف خواهیم کرد .
توصیه می شود که درتعریف مجدد عملگرها کاری کنید که مفهوم اصلی عملگر از دست نرود به عنوان مثال ، عملگر * را طوری تعریف نکنند که عمل تقسیم را انجام دهد ویاعملگر + را طوری تعریف نکنید که عمل تفریق را انجام دهد .
1-8 محدودیت های تعریف مجدد عملگرها اغلب عملگرها رامی توان در C++ مجدداً تعریف کرد .
عملگرهایی را که می توان مجددا تعریف کرد در جدول 1-8 وعملگرهایی را که نمی توان مجددا تعریف کرد درجدول 2-8 نشان دادیم .
هنگام تعریف مجدد عملگرها ،تقدم آنها قابل تغییر نیست .
اما پرانتز می تواند ترتیب ارزیابی عملگرها را تغییر دهد .
2-8 تعریف مجدد عملگرها به کمک تابع عضو کلاس برای تعریف تابع عملگر عضو کلاس ، به صورت زیر عمل می شود .
( لیست آرگومان ها ) عملگر operator: نام کلاس نوع تابع { اعمالی که باید انجام شوند } اغلب توابع عملگر ، شیئی از نوع کلاسی را که بر روی آن عمل می کنند ، بر می گردانند ،ولی نوع تابع می تواند ازهر یک از انواع معتبر باشد .
وقتی که عملگرهای یکانی ( عملگرهایی که برروی یک عملوند عمل می کنند ) مجددا تعریف می شوند ، لیست آرگومان ها خالی خواهد بود ، ولی هنگام تعریف مجدد عملگری که دو عملوند دارد ،لیست آرگومان ها حاوی یک آرگومان است .
جدول 1-8 عملگرهایی که می توانند مجددا تعریف شوند .
جدول 2-8 عملگرهایی که نمی توانند مجددا تعریف شوند .
همانطور که گفته شد ، معمولا تابع عملگری که مجددا تعریف شده است ، شیئی از نوع کلاسی راکه بر روی آن عمل می کند بر میگرداند به این ترتیب ، آن عملگر رامی توان در عبارات محاسباتی پیچیده تر به کار برد .
نکته ای راجع به تعریف مجدد عملگرهای افزایش وکاهش در C++ می توان عملگرهای افزایش (+ +) وکاهش ( - -) رابه صورت پیشوند وپسوند مجددا تعریف کرد برای این کار باید تابع عملگر را دوباره تعریف کرد .
تعریف مجدد عملگرهای ترکیبی عملگرهایی مثل = + ، = - ، و = * راعملگرهای ترکیبی گویند .
این عملگرها رانیزمی توان مجددا تعریف کرد .
تعریف مجدد عملگرها به کمک تابع دوست عملگر رامی توان بااستفاده ازتابعی که عضو کلاس نیست ، مجددا تعریف کرد .
این تابع باید دوست این کلاس تعریف شود چون تابع دوست ، عضوی از کلاس نیست فاقد اشاره گر this است بنابراین ، این گونه توابع ، عملوند ها راصریحا ارسال می کنند .
یعنی تابعی که عملگری با دو عملوند رامجددا تعریف می کند دارای دوپارامتر است که پارامتر اول ،اولین عملوند وپارامتر دوم ، عملوند دوم رامشخص می کندوتابعی که عملگری با یک عملوند را مجددا تعریف میکند ، یک پارامتر دارد .
توابع عملگر دوست ،محدودیتهایی دارند اول این که ، با استفاده از این توابع نمی توان عملگرهای = ، () ، [] یا - > رامجددا تعریف کرد دوم این که هنگام تعریف مجدد عملگرهای افزایش وکاهش به وسیله توابع دوست ، باید از پارامترهای مرجع استفاده نمود .
4-8 تعریف مجددعملگرهای delete , new برای این که از روش خاصی برای تخصیص حافظه استفاده کنید ، می توانید عملگرهای delete , new رامجددا تعریف کنید .
به عنوان مثال ، ممکن است روشی را برای تخصیص حافظه پویا درنظربگیرید که درصورت تمام شدن فضای آزاد حافظه ، برنامه می تواند از یک فایل موجوددر دیسک ،به عنوان حافظه مجازی استفاده کندتعریف مجدد عملگرهای delete , new ممکن است به دلایل زیرمهم باشد : اشکالزدایی مدیریت حافظه برنامه استفاده از روال های مخصوص سیستم که ممکن است کار آمدتر از روال های تخصیص حافظه ای باشد که سیستم عامل درنظرگرفته است.
جمع آوری آماری راجع به تخصیص وآزاد سازی حافظه ، جهت ارزیابی کارایی واثر بخشی برنامه شکل کلی تعریف مجدد این عملگرها را می توان به صورت زیر بیان کرد : // Allocate an object Void * oprator new ( size t size) { // perform allocation.
Throw bad alloc on failure.
// constructor called automatically .
Return pointer to memory, } // Delete an object.
Void operator dalete ( void * p) { // Free memory pointed to by p.
// Destrutor called automatically } عملگرهای delete , new رامی توان برای کل برنامه وبا یک کلاس خاص مجددا تعریف کرد دراینجا مثالی رادرنظر می گیریم که این عملگرهارا برای کلاس خاصی تعریف کرده است .
6-8 تعریف مجدد عملگر [] در C ++ وقتی عملگر [] رامجددا تعریف می کنید ، عملگری با یک عملوند درنظر گرفته می شود بنابراین ، شکل کلی تابع عضو ()[] Operator به صورت زیر درنظر گرفته می شود : Operator [] () (int i)نام کلاس : نوع { … } ازنظر تکنیکی ، این پارامتر حتما نباید از نوع صحیح باشد ، اماچون تابع operator [] () معمولا برای اندیس آرایه به کارمی رود ، مقدار صحیح مورد استفاده قرار می گیرد اگرشیء ob به صورت ob[3] فراخوانی شود ، به تابع زیر ترجمه می شود : Ob.
Operator [] (3) یعنی مقدار موجود درعبارت ob[3] به عنوان پارامتر تابع[ ] () operator منظور می شود اشاره گر this به شی ء ob اشاره می کند این شی ء فراخوانی تابع را انجام می دهد .
تعریف مجدد عملگر() وقتی عملگر () مجددا تعریف می شود ، راه جدیدی برای فراخوانی به تابع ارائه نمی شود .
بلکه تابع عملگری ایجاد می شود که می تواند تعداد آرگومان های خاصی داشته باشد .
تعریف مجدد عملگر - > عملگر اشاره گر - > که نام دیگرش عملگر دستیابی به عضو کلاس است هنگام تعریف مجدد ، یک عملوند می پذیرد .
شکل کلی کاربرد آن به صورت زیراست : Object -> element ; دراینجا Object شیئی است که تابع عملگر را فراخوانی می کند تابع operator -> () بایداشاره گری به یک شیء از کلاسی که برای آن تعریف شده است بر گرداند .
element عنصری از شی ء است .
تعریف مجدد عملگرها کاما عملگر کاما دوعملوند دارد وهمچون سایر عملگرهایی که مجددا تعریف می شوند ، می توانید کاری کنید که این عملگر هر عمل موردنظرتان را انجام دهد برای برای این که تعریف مجدد عملگر کاما ، مانند حالت عادی عمل کند .
تابع عملگر بایدطوری نوشته شود که مقادیر تمام عملگرها به جز آخرین عملوند را نادیده بگیرد .
سمت راست ترین مقدار، نتیجه عمل کاما خواهد بود .
این روش ، همان روش عادی عملکردکاما در C++ است .
تعریف مجدد عملگرهای >> , در C++ می توان با استفاده ازعملگرهای > اعمال ورودی وخروجی رابر روی انواع اولیه انجام داد .
این عملگرها درکتابخانه ای کلاس C++ طوری مجددا تعریف شدند که همه انواع داده های اولیه را پردازش نمایند .
این عملگرها رامی توان مجددا تعریف کرد ، تا اشیای از کلاس ها رانیز پردازش کنند.
کلاس ها : کلاس هاواشیاء مبانی برنامه نویسی شی ء گرا هستندکه باید به خوبی درک شوند .
کلاس ها واشیا کلاس ، نوع جدیدی استکه برنامه نویس آن را برای حل مسئله های دنیای واقعی تعریف می کند ، حاوی داده ها وتعریف عملیات ها است داده های عضو کلاس را فیلد یا صفت گویند ، درحالی که عملیات های کلاس را تابع یامتد می نامند .
متدها بر روی صفات اجرا می شوند .
شی ء نمونه ای ا زکلاس است که در تکنیک برنامه نویسی شی ء گرا یک نهاد ( موجود یت ) زمان اجرا می باشد .
درمقایسه با انواع اولیه ، می توان گفت همانطور که متغیر نمونه ای از انواع اولیه است .
شی ء ، نمونه ای از کلاس ( نوع جدید یا نوع داده انتزاعی ) است کلاس وشی ء را می توان مانندشکل زیر نمایش داد : نامگذاری کلا س همانند نامگذاری متغیرها انجام می شود داده ها وتوابعی که بلافاصله پس ازنام کلاس می آیند .
مختص این کلاس اند یعنی هیچ تابع یاکلاس دیگری نمی تواند به این اجزای کلاس دسترسی داشته باشد .
بلکه فقط اجزای همین کلاس می توانند از آنها استفاده نمایند به همین دلیل آنها را از اعضای اختصاصی کلاس گویند .
روش دیگر تعریف اشیایی از کلاس این است که ، پس از تعریف کلاس ، درهر جایی از برنامه ، به صورت زیر عمل کنید : ;نام شی ء نام کلاس نامگذاری برای اشیا مانند نامگذاری برای متغیرها است که در فصل اول با آن آشنا شدید .
پس از این که کلاس را تعریف کردید ، باید توابع عضو مربوط به آن کلاسی را نیز بنویسید برای نوشتن توابع عضو کلاس ، باید نام کلاس رابه همراه عملگر :: ، قبل از نام تابع عضوذکر کنید البته ، اگر توابع دستور العمل های زیادی نداشته باشند ( به خصوص اگر فاقد حلقه تکرار باشند ) میتوانید آنها را درتعریف کلاس بگنجانید.
اعضای کلاس با ویژگی Static هر یک از اعضای کلاس ، چه اعضای داده ای ، وچه توابع عضو ، می توانند به صورت Static تعریف شوند .
اعضای داده ای استاتیک وکاربردهای آن هر شی ء ای ازکلاس ، یک کپی از تمام اعضای داده ای آن کلاس را داراست در بعضی از موارد ، فقط یک کپی از یک متغیر باید بین تمام اشیای یک کلاس مشترک باشد کلمه کلیدی Static برای این منظور واهداف دیگر به کار می رود .
وقتی کلمه کلیدی Static رابا اعضای داده ای کلاس به کار می برید ، به کامپایلر می گویید که فقط یک کپی ازآن متغیر وجود خواهد داشت وتمام اشیای آن کلاس ، آن متغیر را به اشتراک می گذارند .
کلاس های فایل برای ورودی – خروجی فایل در C++ بایدفایل رابه برنامه ضمیمه کرد این فایل ، چندین کلاس ، از جمله ifstream (برای خواندن از فایل ) ofstream ( برای نوشتن درفایل ) و Fstream( برای خواندن ونوشتن در فایل ) را تعریف می کنداین کلاس ها به ترتیب از Jostream, ostream, istream مشتق می شوند .
کلاس های انتزاعی کلاسی که حداقل دارای یک تابع مجازی محض باشد ، کلاس انتزاعی نام دارد .
درواقع ف کلاس انتزاعی ، یک نوع ناقص ( غیر کامل ) را ایجاد می کندکه به عنوان مبنایی برای کلاس های مشتق مورد استفاده قرار می گیرد .
گرچه نمی توانید اشیایی از کلاس انتزاعی را ایجاد کنید ، ولی می توانید اشاره گر ها ومرجعی به کلاس انتزاعی را به وجود آورید به این ترتیب ، کلاس های انتزاعی چندریختی زمان اجرا را پشتیبانی می کنند کلاس لیست پیوندی لیست پیوندی را به صورت کلاسی تعریف می کنیم که شامل اعضای داده ای وتوابع عضوی باشد که بر روی داده ها عمل کنند به عبارت دیگر ، لیست پیوندی به عنوان نوعی داده ، به این اعمال نیاز دارد : افزودن عنصری به لیست ، حذف عنصری لیست ، درج عنصری در لیست ، نمایش عناصر لیست وموارد دیگری که برنامه نویس می تواندپیش بینی کند .
توابع مجازی با توابع مجازی وچند ریختی می توان سیستم هایی را طراحی وپیاده سازی کرد که به آسانی قابل توسعه باشند .
چند ریختی هم در زمان ترجمه وهم در زمان اجرادر C++ امکان پذیر است چندریختی زمان ترجمه ، با تعریف مجدد توابع وعملگرها صورت می گیرد و چندریختی زمان اجرا با استفاده ازوراثت وتوابع مجازی انجام می شود .
تابع مجازی یک تابع عضو است که در یک کلاس پایه اعلان می شود ودوباره در کلاس مشتق تعریف می گردد کلاس هایی ازاشیاء مثل Square , rectangle , triangle , circle وغیره را که همگی ازکلاس shape مشتق می شونددرنظر بگیرید در برنامه نویسی شی ء گرا می توان قابلیتی را به هر کدام از این کلاس ها اضافه کرد که خودشان را رسم کنندتابعی که شکل را رسم می کند draw مخصوص به خود رادارند ، ولی این تابع برای هر شکل ، متفاوت است .
وقتی کلاسی ازیک کلاس پایه با تابع مجازی مشتق می شود ، کلاس مشتق ، آن تابع را طوری درخودش تعریف می کند که نیازهای خودش را بر طرف کند به طور کلی ، توابع مجازی فلسفه ، یک واسط چندمتد ، راکه مربوط به چندریختی است پیاده سازی می کند علتش این است که تعریف مجددتابع مجازی در کلاس مشتق ، عملش را طوری پیاده سازی می کند که به کلاس مشتق مربوط می شود .
یعنی موجب به وجود آوردن متدجدیدی می شود هنگامی که تابع مجازی به طور عادی دستیابی می شود ، همچنین سایر توابع عضو عمل می کند ، اما آنچه تابع مجاری را با اهمیت جلوه می دهد وموجب پشتیبانی چندریختی در زمان اجرا می شود ، چگونگی رفتار آنها در هنگام دسترسی از طریق اشاره گراست .
وقتی اشاره گر پایه به شی ء مشتقی اشاره میکند که حاوی تابع مجازی است C+ + تعیین می کند که کدام نسخه از آن تابع باید فراخوانی شود این کار را باتوجه به نوعی از شی ء که اشاره گر به آن اشاره می کند ،انجام می دهد این کار درزمان اجرا انجام می شود .
بنابراین ، وقتی به اشیایی با انواع گوناگون اشاره شود ، نسخه های گوناگونی از تابع مجازی اجرا می شوند این موضوع در مورد مرجع های کلاس پایه نیز صادق است .
صفت مجازی ، موروثی است وقتی تابع مجازی توسط کلاسی به ارث برده می شود ، ماهیت مجازی بودن آن نیز به ارث برده خواهد شد .
یعنی اگر یک کلاس مشتق ، تابع مجازیی رااز کلاس پایه ای به ارث ببرد واین کلاس مشتق به عنوان کلاس پایه ای برای کلاس مشتق دیگری محسوب می شود ، تابع مجازی در این کلاس مشتق نیز قابل استفاده است .
توابع مجازی سلسله مراتبی اند وقتی تابعی درکلاس پایه به صورت مجازی تعریف شد ، توسط کلاس مشتق مجددا قابل تعریف است اما لازم نیست کلاس مشتق حتما آن را دوباره تعریف نماید .
اگر کلاس مشتق ، تابع مجازی رادوباره درخودش تعریف نکند ، هنگامی که شیء ازآن کلاس مشتق به آن تابع مراجعه کند ، تابعی که در کلاس پایه تعریف شد مورداستفاده قرارمی گیرد .
این حالت بیانگر یک قاعده کلی در C++ است ، زیراهمان طور که وراثت در این زبان سلسله مراتبی است ، توابع مجازی نیز سلسله مراتبی اند .
توابع مجازی محض اگر یک تابع مجازی درکلاس مشتق تعریف نشود ، تابع موجود در کلاس پایه آن مورد استفاده قرارمی گیرد اما دربسیاری ازموارد ، تعریف دقیقی از تابع مجازی درکلاس پایه ارائه نمی شود .
به عنوان مثال ، یک کلاس پایه ممکن است نتواند شیئی را طوری تعریف کند تااجازه دهد که تابع مجازی کلاس پایه ایجاد شود .
علاوه براین ، در بعضی از مواردممکن است بخواهید مطمئن شوید که تمام کلاس های مشتق ، تابع مجازی را در خودشان نیز تعریف کنند برای پاسخگویی به این حالت ها C++ تابع مجازی محض را ارائه می کند .
تابع مجازی محض ، نوعی تابع مجازی است که در کلاس پایه تعریف نشده باشد برای اعلان تابع مجازی محض ، از شکل کلی زیر استفاده می شود : 0 ;=( لیست پارامترها ) نام تابع نوع Virtual وقتی تابع مجازی به صورت محض باشد ،هر کلاس مشتق باید تعریف خاص خودش را ارائه کنداگر کلاس ، مشتقی نتواند تابع مجازی را برای خودش تعریف کند ، کامپایلر خطایی رااعلان می کند .
بالاترین تقدم -- ++ - ( منهای یکانی ) % / * پایین ترین تقدم - + عملگرناممثال> >= بزرگتر بزرگتر یامساوی کوچکتر کوچکتر یامساوی متساوی نامساویX>Y X>=Y X عملگرناممثال!
&& ||نقیض(not) و(and) یا (or)×!
x>y&&my|| m عملگرناممثالمعادل= + = - =* =/ = %انتساب جمع انتساب تفریق انتساب ضرب انتساب تقسیم انتساب باقیمانده تقسیمX+=y x-=y x* =y x/=y x% =yX=x+y X=x-y X=x*y X=x/y X=x% y عملگرنام& | ^ >> و(AND) یا (OR) یای انحصاری (XOR) نقیض (NOT) شیفت به راست (right shift) شیفت به چپ ( left shift) بالاترین تقدم () !
~ ++ -- sizeof * / % + - > > = = = !
= & ^ | && | | ?
= + = - = * = / = % = پایین ترین تقدم , + - * / % ^ & | ~ !
= + = -= *= /= % = ^ = & = | = > >>= = && | | + + - - - > * , - > [] () new delete New [] delete [] , .* ..
?
sizeof