Ghalebha_dar_C++

در نمایش آنلاین پاورپوینت، ممکن است بعضی علائم، اعداد و حتی فونت‌ها به خوبی نمایش داده نشود. این مشکل در فایل اصلی پاورپوینت وجود ندارد.




  • جزئیات
  • امتیاز و نظرات
  • متن پاورپوینت

امتیاز

درحال ارسال
امتیاز کاربر [0 رای]

نقد و بررسی ها

هیچ نظری برای این پاورپوینت نوشته نشده است.

اولین کسی باشید که نظری می نویسد “قالب ها در ++C”

قالب ها در ++C

اسلاید 1: قالب هاقالب یکی از ویژگی های قدرتمند زبان C++ است.با استفاده از قالب ها می توان مجموعه کاملی از توابع مرتبط به هم (توابع همنام ) را که توابع قالب نام دارند یا مجموعه کاملی از کلاس های مرتبط به هم را که کلاسهای قالب نامدارند مشخص کرد.به عنوان مثال می توان قالب تابعی برای تابع مرتب سازی ارایه نوشت و C++ به طور خودکار توابع قالب دیگری را تولید کند که ارایه ایاز نوع صحیح یا ارایه ای از نوع اعشاری یا ارایه ای از رشته ها و غیره را مرتب کند. توابع همنام اعمال مختلفی را روی انواع گوناگونی از داده ها انجام می دهند.اگر این اعمال برای هر نوع یکسان باشند با استفاده از قالب های تابع راحت تر انجام میشوند. به عبارت دیگر در توابع کلی یک عمل بر روی انواع مختلفی از داده ها انجام میشود.در C این کار توسط ماکروها انجام می شود اما ماکروهااثرات جانبی زیادی را ایجاد می کنند و کنترل نوع را نیز انجام نمی دهند.اما قالب ها ی تابع کنترل نوع دقیقی راانجام می دهند.

اسلاید 2: با استفاده از قالب ها می توان توابع کلی و کلاس های کلی را ایجاد کرد.در یک تابع یا کلاس کلی نوع دادهای که این توابع و کلاس ها بر روی ان عمل می کنند به صورت پارامتر مشخص میشود.بنابراین می توانید ازیک تابع یا کلاس با چند نوع مختلف از داده ها کار کنید بدون اینکه نیاز به دستورالعمل های خاص ان انواع باشد.توابع کلی:تابع کلی مجموعه کلی از اعمال را تعریف می کند که بر روی انواع مختلفی از داده ها انجام می شوند.نوع داده ای که تابع باید بر روی ان عمل کند به عنوان ارگومان به ان ارسال می شود.با تابع کلی یک رویه کلی را می توان بر روی انواع مختلفی از داده ها انجام داد.می دانید که بسیاری از الگوریتم ها بر روی انواع مختلفی از داده ها عمل می کنند بدون اینکه تغییراتی درانها ایجاد شود.به عنوان مثال مرتب سازی quick sort چه برای مرتب سازی ارایه صحیح و چه برای ارایه اعشاری یکسان است.فقط نوع داده ای که مرتب می شوند متفاوت است.با ایجاد یک تابع کلی می توانیدماهیت الگوریتم را مستقل از هر نوع داده ای تعریف کنید.به این ترتیب کامپایلر کد مناسبی را برای داده ای که در زمان اجرای تابع مشخص می شود تولید می کند.به طور کلی وقتی یک تابع کلی ایجاد می کنید مثل این است که تابعی ایجاد می کنید که خودش را مجددا تعریف می کند.

اسلاید 3: تابع کلی با کلمه ی کلیدی template ایجاد می شود.این کلمه ی کلیدی قالبی را ایجاد می کند که عمل تابع را مشخص میکند و جزئیات امر را به کامپایلر واگذار می نماید.شکل کلی تعریف تابع قالب به صورت زیراست:(لیست پارامترها)نام تابع نوع برگشتی <نوع template< class} بدنه تابع {در اینجا نوع نامی است که مشخص می کند چه نوع داده ای توسط تابع مورد استفاده قرار می گیرد.این نوع در هنگام اجرای برنامه مشخص می شود.این نام ممکن است در تعریف تابع به کار گرفته شود.وقتی کامپایلرنسخه خاصی از تابع را ایجاد می نماید نوع واقعی را در ان جا قرار میدهد.مثال 1 :برنامه ای که با استفاده از یک تابع کلی محتویات دو متغیر را با هم عوض میکند.#include <iostream.h>#include <conio.h>Template <class X> void swapArgs (X &a, X &b){X temp;

اسلاید 4: temp=a;a=b;b=temp;}//****************************int main(){ int i=10,,j=20; double x=10.1,y=23.3; char a=‘x’,b=‘z’; clrscr(); cout<<“original i, j :”<<i<<“,”<<j<<“n”; cout<<“original x, y :”<<x<<“,”<<y<<“n”; cout<<“original a, b :”<<a<<“,”<<b<<“n”; swapArgs(i, j); swapArgs(x,y); swapArgs(a,b); cout<<“Swaped i, j :”<<i<<“,”<<j<<“n”; cout<<“Swaped x, y :”<<x<<“,”<<y<<“n”; cout<<“Swaped a, b :”<<a<<“,”<<b<<“n”; getch(); return 0;}

اسلاید 5: خروجیOriginal i, j :10 , 20Original x, y:10.1 , 23.3Original a, b :x , zSwaped i, j :20 ,10Swaped x,y :23.3 ,10.1Swaped a, b: z , xتحلیل مثال 1:سطر زیر را در نظر بگیرید:templat <class X> void swapArgs (X &a, X &b) این سطر به کامپایلر دو چیز را می گوید: 1.قالبی در حال ایجاد شدن است و 2.یک تعریف کلی اغاز شده است.در اینجا X یک نوع کلی است.پس از بخش templat تابعswapArgs() اعلان شد که از X به عنوان نوع داده هایی که باید با هم جابه جا شوند استفاده کرده است.در تابع main() تابع swapArgs() با استفاده از سه نوع داده مختلف فراخوانی شد: int ,float , char . چون تابع swapArgs() یک تابع کلی است کامپایلر سه نسخه از این تابع را ایجاد می کند: یکی از انها دو مقدار صحیح را جا به جا می کند دومی مقادیر اعشاری و سومی مقادیر کاراکتری را جا به جا می نماید.

اسلاید 6: نام دیگر تابع کلی (تابعی که با template تعریف می شود) تابع قالب است.تابع swapArgs() را که در مثال دیدید به صورت زیر نیز می توان نوشت:template <class X>Void swapArgs (X &a ,X &b){ X temp; temp=a; a=b; b=temp;} در این صورت دقت داشته باشید که بین خطی که با template شروع شد و خطی که تابع را تعریف کرد هیچ دستور دیگری نمی تواند ظاهر شود.

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

اسلاید 8: template <class Type> void bubble(Type *items, const int count){ register int a, b; Type temp; for ( a =1; a <count ; a++) for ( b = count – 1; b >= a; b-- ) if ( items [b – 1] > items [b] ){ temp = items [b – 1] ; items [b – 1] = items [ b ] ; items [ b ] = temp ; } }روش چاپ محتویات ارایه ها به نوع داده هایی که دران وجود دارد بستگی ندارد.بنابراین این عمل با استفاده از توابع قالب به راحتی انجام پذیر است.

اسلاید 9: کلاس های کلی یا قالب های کلاس:علاوه بر توابع کلی کلاس ها را نیز می توان به صورت کلی تعریف کرد.در این صورت کلاسی ایجاد میشود که تمام الگوریتم هایی را که توسط ان استفاده می گردد تعریف می کند.اما نوع واقعی که باید مورد استفاده قرار گیرد هنگامی که اشیایی از ان کلاس ایجاد می شوند به صورت پارامتر مشخص میگردد .وقتی کلاس کلی ایجاد میشود عمل مورد نظر را میتواند بر روی هر نوع داده ای انجام دهد. بر اساس نوعی که هنگام ایجاد شئ تعیین می کنید کامپایلر کد شناسایی را تولید می کند.شیوه اعلان کلاس کلی به صورت زیر است: } نام کلاس class <نوع <class template……} در این شکل کلی نوع هنگام ایجاد شئ مشخص می گردد و نوعی را که کلاس باید بر روی ان عمل نماید تعیین می کند. در صورت لزوم می توان بیش از یک نوع را تعیین کرد و انها را با کاما از هم جدا نمود. وقتی کلاس کلی را ایجاد کردید نمونه خاصی از ان کلاس را می توانید به طریق زیر مشخص کنید:ob ; < نوع > نام کلاس در این شکل کلی نوع مشخص می کند که کلاس باید بر روی چه نوعی عمل کند و ob شئ از این کلاس است.توابع عضو کلاس های کلی خودشان به صورت کلی اند.

اسلاید 10: با استفاده از قالب ها می توان کلاسی را طراحی کرد که بر روی انواع مختلفی از داده ها عمل کند.به این ترتیب حجم برنامه ها کاهش پیدا می کند و قابلیت انعطاف برنامه بالا می رود.از طریق قالب ها می توانید یک کلاس کلی را تولید کنید که جایگزین بسیاری از کلاسها شود.انواعی که کلاسهای کلی بر روی انها عمل می کنند هنگام ترجمه مشخص می شوند.شکل 1:template <class T>Class Tsimple { private: T data; public: Tsimple (T n); void show (); };نوع واقعی بعدا تعیین می شودهر نوع اولیه ای را میتوان برای ان تعریف کرد هر نوع اولیه ای را می توان برای این تابع عضو تعیین کرد

اسلاید 11: شکل 2:template < class T >Tsimple < T > :: Tsimple ( T n ){ data = n;}تعریف قالبی است که هنوز نوع داده مشخص نیستنوع n بعدا تعیین می شودهمانطور که در شکل 1 میبینید تعریف سازنده کلاس مثل سایر توابع عضو است با این تفاوت که قبل از سطری که تعریف میشود باید template < class T > را قرار داد( شکل 2).برای تعریف تابع عضو کلاس باید قبل از تعریف ان template < class T > را قرار داد( شکل 3)

اسلاید 12: تا کنون کلاسی را تعریف کردیم که هر نوع داده ای را به عنوان عضو خودش می پذیرد.در برنامه اصلی باید مشخص کنید که کلاس باید از چه نوعی باشد.در شکل 4 نوع int را برای کلاس در نظر می گیریم.برای اینکه این کلاس را به کلاس نو ع کاراکتری یا نوع double تبدیل کنیم مانند شکل 5 عمل می کنیم.Template < class T >Void Tsimple < T > :: show (){ cout << “ data = “ << data << endl ;}کلاس قالبتابع عضوشکل 3:

اسلاید 13: Tsimple < int > x( 25 )Tsimple < char > y ( ‘ P ‘ ) ;Tsimple < double > z ( 1.25 ) ;کلاس کلی را به کلاس نوع int تبدیل می کندشکل 4:شکل 5:کلاس کلی را به کلاس نوع کاراکتری تبدیل می کندکلاس کلی را به کلاس نوع double تبدیل می کند

اسلاید 14: مثال 2:برنامه ای که با تعریف یک کلاس کلی بر روی انواع مختلفی از داده ها عمل می کند.#include <iostream.h>#include <conio.h>#include <stdlib.h>template <class T>Class Tsimple { private: T data; public: Tsimple (T n); void show ();};//**************************template <class T>Tsimple < T > :: Tsimple (T n){ data = n;}//***************************template <class T> void Tsimple < T > :: show ()

اسلاید 15: { cout << data << endl;}//***************************** int main (){ clrscr (); Tsimple <int> x(25); cout << “ x = “; x.show (); Tsimple < char > y (‘P’); cout << “ y= “; y.show (); Tsimple < double > z(1.25); cout << “ z = “; z.show (); getch (); return 0;}خروجیx = 25y = Pz =1.25

اسلاید 16: چند نکته :کلاس کلی می تواند بیش از یک نوع داده کلی داشته باشد.برای این منظور باید تمام انواع مورد نیاز را در مشخصات template ذکر و انها را با کاما از هم جدا کرد.در مشخصات قالب کلاس کلی می توان ارگومان هایی تعریف کرد.شیوه تعریف این ارگومان ها مانند تعریف ارگومان ها در توابع معمولی است.کلاس قالب می تواند ارگومان پیش فرضی مربوط به نوع کلی داشته باشد.به عنوان مثال قالب زیر را در نظر بگیرید:template <class x = int > class myClass {…} اگرهنگام ایجاد شیئی از کلاس myClass نوعی مشخص نشود نوع int منظور خواهد شد.ارگومان های کلاس کلی نیز می توانند پارامتر های فرضی داشته باشند .در اینصورت چنانچه هنگام ایجاد شیئی از ان کلاس مقداری برای ان پارامتر ها مشخص نشوند مقادیر فرضی مورد استفاده قرار می گیرند.

اسلاید 17: 3. قالب ها و وراثت :قالب ها و وراثت به شکلهای گوناگونی با هم ارتباط دارند :قالب کلاس می تواند از قالب کلاس دیگر مشتق شود.قالب کلاس می تواند از کلاس غیر قالب مشتق شود.کلاس قالب می تواند از قالب کلاس مشتق شود.کلاس غیر قالب میتواند از قالب کلاس مشتق شود.4. قالب ها و کلاس های دوست :همانطور که می دانید کلاس ها و توابع می توانند دوست کلاس های دیگر تعریف شوند.در قالب های کلاس نیزنوعی رابطه دوستی را می توان ایجاد کرد.دوستی را می توان بین قالب کلاس و تابع عمومی یا تابع عضوکلاس دیگر یا حتی یک کلاس کامل ایجاد کرد. در قالب کلاس X که به صورت زیر تعریف شده استtemplate <class T> class X اعلان رابطه دوستی به صورت زیرFriend void f1() ; موجب می شود تا f1 با هر کلاس قالبی که از قالب کلاس قبلی ایجاد می شود دوست باشد.

اسلاید 18: 5. قالب ها و اعضای استاتیک :همانطور که می دانید در کلاس های معمولی عضو داده ای استاتیک بین تمام اشیای ان کلاس مشترک است و عضو داده ای باید به عنوان حوزه فایل مقدار اولیه بگیرد.هر کلاس قالب که از قالب کلاس ایجاد شد عضو داده ای استاتیک مربوط به قالب کلاس خود را داراست تمام اشیای ان کلاس قالب در ان عضو داده ای مشترک خواهند بود.حوزه انها نیز در فایل است.هر کلاس قالب کپی مخصوص به خود را از توابع عضو استاتیک می گیرد.6. کلاس های قالب و پردازش ساختمان ها :ساختمان ها انواع جدیدی اند و تعداد عناصر انها متغیر است.در نگاه اول به نظر می رسد که هر ترکیبی رادر یک قالب نمی توان به کار برد.قالبی که ساختمان را پردازش می کند مانند قالبی است که انواع اولیه را پردازش می کند.اما باید در خارج از قالب فکر جدیدی کرد.عملگر >> را باید برای ساختمان مجددا تعریف کرد.در اینصورت قالب داده های موجود در ساختمان را به cout ارسال می کند. نوشتن کلاس قالب ساختمان ساده است در واقع مثل کلاس قالب انواع اولیه است ولی با اندکی تغییر :template <class T>class Tnotsimple { private : T d ; public : Tnotsimple (T n );

اسلاید 19: void show ( ); };دراین کلاس d یک عضو داده ای است که نوع ان مشخص نیست .سازنده Tnotsimple یک پارامتر دارد که نوع ان در برنامه اصلی مشخص می شود.تابع عضو show() محتویات d را در صفحه نمایش ظاهر می کند.اما بخش مهم کار با این کلاس تعریف مجدد عملگر >> است که محتویات ساختمان را به خروجی می برد.اکنون ساختمان زیر را تعریف می کنیم :struct data { char name [20] ; int age ; double height ; }; پس از تعریف ساختمان به تعریف مجدد عملگر >> می پردازیم ( شکل 6 ).

اسلاید 20: ostream &oprator << (ostream & str_out , data &q){ str_out << q.name << “ “ ; str_out << q.age << “ “ ; str_out << q.height << “ “ ; return str_out ;}شکل 6:مرجعی به ساختمان است که باید به خروجی برودعملگر >> مجددا تعریف می شودداده های خروجی به این جریان می ایند Str_outیک بافر است

اسلاید 21: مثال 3 :برنامه ای که با کلاس قالب ساختمانی را پردازش می کند.#include <iostream.h>#include <conio.h>#define tab ‘t’struct data { char name [20] ; int age ; double height ;};//**************************ostream &operator << (ostream &str_out , data &q ) { str_out << q.nam << tab ; str_out << q.age << tab ; str_out << q.height << endl; return str_out ;}//**************************template <class T >class Tnotsimple { private: T d ;

اسلاید 22: public : Tnotsimple (T n ); void show ( );};//***************************template <class T>Tnotsimple < T > :: Tnotsimple ( T n ) { d = n ;}//**************************template <class T >void Tnotsimple < T > :: show ( ){ cout << d << endl ;}//****************************int main ( ) { clrscr ( ) ; struct data man = { “ali” , 25, 175 }; Tnotsimple <data> x(man) ; x.show ( ) ; getch ( ) ; return 0 ;}

اسلاید 23: خروجیali 25 175پردازش استثنا هاقابلیت توسعه C++ می تواند انواع و تعداد خطاهایی را که اتفاق می افتد افزایش دهد.ویژگی هایی که در اینجا ارائه می شوند باعث می شوند تا برنامه نویس بتواند برنامه هایی بنویسد که قدرتمند عاری از خطا وتحمل کننده عیب ها باشند.سیستم هایی که با این ویژگی ها نوشته شدند نتایج مثبتی را ارائه کرده اند.به کمک پردازش استثنا هنگامی که خطایی در برنامه رخ دهد برنامه به طور خودکار روال کنترل خطا رافراخوانی می کند.کد کنترل خطا به ماهیت و اندازه سیستم های نرم افزاری بستگی دارد.در بعضی از سیستم ها مثل سیستم های تجاری باید کد کنترل خطای زیادی وجود داشته باشد.ابزارهای زیادی برای کنترل خطا وجود دارد.معمولا کدهای کنترل خطا در سراسر کد سیستم پراکنده اند.خطاها در جاهایی که اتفاق می افتند تحت کنترل قرار می گیرند.امتیازاین روش این است که برنامه نویسی که کد رامی خواند کنترل خطا را در نزدیکی ان مشاهده می کند و متوجه می شود که ایا کنترل خطای مناسبی پیاده سازی شده است یا خیر.

اسلاید 24: مشکل این روش این است که کد سیستم با پردازش خطا درهم می امیزد و از حالت یکنواختی خارج می شود.این کار موجب می شود تا خواندن برنامه جهت پی بردن به صحت کامل ان مشکل شود.علاوه بر این درک و نگهداری کد دشوار خواهد شد.بعضی از استثناهای متداول عبارتند از: عدم موفقیت عملگر new جهت تخصیص حافظه , خروج از حد ارایه , سر ریز در محاسبات , تقسیم بر صفر , و پارامترهای نامعتبر تابع.ویژگی های جدید C++ در پردازش استثنا برنامه نویس را قادر می سازد تا کد کنترل خطا را از متن برنامه جدا کند و به این ترتیب به خوانایی برنامه بیا فزاید.با ویزگی های پردازش استثنا در C++ می توان تمام استثناهای مربوط به یک نوع خاص یا تمام استثناهای انواع مرتبط را تشخیص داد.به این ترتیب احتمال اینکه برنامه نتواند خطایی را تشخیص دهد کاهش می یابد.پردازش استثنا موجب می شوند تا برنامه نویس خطاها را تشخیص دهد و انها را تحت کنترل در بیاورد تا موجب اشکالاتی در برنامه نشوند.اگر برنامه نویس نتواند خطاهای مهم را پردازش کند برنامه خاتمه می یابد.پردازش استثنا برای کنترل خطاهای همگامی مثل تقسیم بر صفر طراحی شده است.با پردازش استثنا قبل ازاینکه برنامه عمل تقسیم را انجام دهد مقسوم علیه را کنترل می کند و در صورتی که مقسوم علیه صفرباشد استثنایی را صادر می نماید.پردازش استثنا در وضعیت هایی مورد استفاده قرار می گیرد که اگر خطایی موجب استثنا شد سیستم بتواند ترمیم شود.روند ترمیم را پردازش استثنا گویند.به خصوص در مواردی که برنامه نتواند ترمیم شود ولی لازم است به طرز خوبی خاتمه یابد پردازش استثنا ابزار مفیدی است.

اسلاید 25: اصول پردازش استثناها :پردازش استثناها در C++ با سه کلمه کلیدی try, catch ,throw انجام می شوند.دستورالعمل هایی که ممکن است تولید خطا کنند و موجب بروز استثنا شوند در بلوکی به نام try قرار می گیرند.پس از هر بلوک try یک یا چند بلوک catch قرار می گیرد.هر بلوک catch حاوی یک پردازشگر استثنا است.اگر استثنا با یکی از پارامترهای موجود در بلوک های catch مطابقت داشته باشد کد مربوط به ان بلوک catch اجرا می شود.بنابراین ممکن است بیش از یک بلوک catch برای هر بلوک try وجود داشته باشد ونوع استثنا مشخص می کند که کدام بلوک catch باید اجرا شود.اگر استثنایی به وجود نیاید و یا خطایی در بلوکtry رخ ندهد هیچ بلوک catch اجرا نمی شود.اگر در بلوک try خطایی اتفاق افتد استثنایی توسط دستور throw صادر می شود.این دستور به صورت زیربه کار می رود :throw operand ;این دستور استثنایی را که در جلوی ان با operand (عملوند ) مشخص شده است صادر می کند.استثنا باید در بلوک try یا تابعی که در داخل بلوک try اجرا می شودصادر گردد.عملوند throw می تواند از هر نوعی باشد.اگر یک شئ باشد ان را شئ استثنا می نامیم .به جای شئ می توان یک عبارت شرطی را ارسال کرد.

اسلاید 26: بلوک try :شکل کلی استفاده از بلوک try به صورت زیر است :try { بدنه بلوک { بدنه بلوک حاوی دستورالعمل هایی است که ممکن است در اثر بروز خطا استثنایی را صادر کند.دقت داشته باشید که بلوک try می تواند حاوی چند دستو اندک در داخل یک تابع یا کل دستورالعمل های موجود در تابع main( ) باشد.3. بلوک catch :پس از هر بلوک try باید یک یا چند بلوک catch قرار داشته باشد تا استثناها را پردازش کنند .به عبارت دیگر پردازشگر استثناها در بلوک catch قرار دارد.شکل کلی بلوک catch به صورت زیر است : } ( پارامتر نوع 1 ) catch بدنه بلوک { } (پارامتر نوع 2 ) catch بدنه بلوک { ....

اسلاید 27: } (پارامتر نوع n ) catch بدنه بلوک {بلوک catch در ارگومان خود نوع شیئی را که باید پردازش استثنا در ان اجرا شود مشخص می کند.پارامتر موجود در پردازشگر catch می تواند فاقد نام باشد.اگر پارامتر دارای نام باشد می توان در داخل بلوک catch به ان مراجعه کرد.اگر پارامتر فاقد نام باشد مثلا فقط نوع پارامتر مشخص شده باشد تا تطابقان با نوع شیئی که پرتاب شد انجام شود فقط کنترل از نقطه پرتاب به پردازشگر منتقل می شود.این حالت برای بسیاری از استثناها قابل قبول است.استثنایی که شئ پرتاب شده ان با نوع ارگومان در بلوک catch یکسان باشد پردازشگر استثنای موجود در ان بلوک catch اجرا می شود. بلوک catch به صورت زیر نیز قابل استفاده است : } (...) catch بدنه بلوک {مفهوم این بلوک این است که تمام استثناها را می پذیرد.توجه داشته باشید که اگر چند بلوک catch را به اینشیوه به کار می برید این شیوه را باید به عنوان اخرین بلوک در نظر بگیرید.اشکالی که این روش کاربرد دارد این است که نمی توانید مطمئن شوید که استثنا از چه نوعی است.ممکن است چند پردازشگر استثنا با نوع استثنایی که پرتاب شد مطابقت داشته باشند.در این حالت اولین انها اجرا می شود.

اسلاید 28: اگر چند پردازشگر استثنا با استثنای پرتاب شده مطابقت داشته باشند و هر کدام از انها استثنا رابه روش خاصی پردازش کند ترتیب پردازشگر های استثنا شیوه پردازش ان را تحت تاثیر قرار می دهد. نوع پارامتر پردازشگر catch در موارد زیر با شئ پرتاب شده تطابق پیدا می کند :وقتی از یک نوع باشند.پارامتر پردازشگر catch کلاس پایه عمومی از کلاس شئ پرتاب شده باشد.پارامتر پردازشگر نوع اشاره گر پایه یا مرجع و شئ پرتاب شده نوع اشاره گر یا مرجع کلاس مشتق باشد.پردازشگر catch به صورت catch (…) باشد.

اسلاید 29: چند نکته :پردازشگر استثنا نمی تواند به اشیای اتوماتیکی که در بلوک try تعریف شدند دسترسی داشته باشد زیرا وقتی استثنا اتفاق می افتد بلوک try خاتمه می یابد و تمام اشیای اتوماتیک موجود در بلوک try قبل از اجرای پردازشگر استثنا از بین می روند.اگر استثنایی در پردازشگر استثنا رخ دهد استثنای اول در پردازشگر استثنا پردازش می شود .لذا استثناهایی که در پردازشگر استثنا اتفاق می افتند باید در خارج از بلوکی که استثنای اول پرتاب شد پردازش شوند.با استفاده از دستور return در پردازشگر catch نمی توان به نقطه پرتاب استثنا برگشت .دستور return موجب می شود تا کنترل به تابعی برگردد که تابع حاوی بلوک catch را فراخوانی کرده است.برای هر بلوک try می توان بیش از یک بلوک catch در نظر گرفت.هنگامی که می خواهید هم استثناهای نوع کلاس پایه و هم استثناهای کلاس مشتق را پردازش کنید ابتدا بلوک های catch مربوط به کلاس مشتق را قرار دهید.در غیر این صورت بلوک catch مربوط به کلاس پایه می تواند با تمام کلاس های مشتق تطابق داشته باشد.

اسلاید 30: استثناهایی را که توابع میتوانند پرتاب کنند می توان محدود کرد.به عبارت دیگر می توان کاری کرد که توابع هر نوع استثنایی را پرتاب نکنند.برای اعمال این محدودیت باید یک بلوک throw به تعریف تابع اضافه کنید.شکل کلی ان به صورت زیر است : ( لیست انواع ) throw ( لیست ارگومان ها ) نام تابع نوع تابع } بدنه بلوک {به این ترتیب فقط استثناهایی که انواع انها در جلوی throw در پرانتز امده اند توسط تابع میتوانند پرتاب شوند .اگر استثناهای دیگری پرتاب شوند برنامه خاتمه می یابد.اگر نخواهید تابعی استثنایی را صادر کند لیست انواع را ذکر نکنید. اگر سعی شود استثنایی صادر گردد که توسط هیچ تابعی پشتیبانی نمی شود تابع کتابخانه ای unexpected() اجرا می شود.این تابع به نوبه خود تابع abort( ) را فراخوانی می کند و برنامه را خاتمه می دهد

اسلاید 31: مثال :برنامه ای که استثنای تقسیم بر صفر را پردازش می کند.#include < iostream.h >//using namespace std ;Class divexcp { public : divexcp () : message (“attempt to ddivide by zero”) { } const char *what () const { return message ; } private : const char *message ;};//**************************Double quote (int numerator , int denum ){ if (denum == 0 ) throw divexcp() ; return (double) (numerator) / denum ;}//****************************Int main() { int num1 , num2 ; double result ;

اسلاید 32: cout << “Enter tow integer : “ ; while (cin >> num1 >> num2 ) { try { result = quote (num 1 , num 2 ); cout << “The quotient is : “ << result << endl ; } catch (divexcp ex) { cout << “Exception occurred : “ << ex.what() << “n”; } cout << “n Enter tow integers : “ ; } cout << endl; return 0 ;}خروجیEnter tow integers : 100 7The quotient is : 14.2857Enter tow integers : 100 0Exception occurred : attemted to divide by zeroEnter tow integers :

34,000 تومان

خرید پاورپوینت توسط کلیه کارت‌های شتاب امکان‌پذیر است و بلافاصله پس از خرید، لینک دانلود پاورپوینت در اختیار شما قرار خواهد گرفت.

در صورت عدم رضایت سفارش برگشت و وجه به حساب شما برگشت داده خواهد شد.

در صورت بروز هر گونه مشکل به شماره 09353405883 در ایتا پیام دهید یا با ای دی poshtibani_ppt_ir در تلگرام ارتباط بگیرید.

افزودن به سبد خرید