يه مثال هم در مورد ترتيب فراخواني سازنده و نابود کننده توسط کامپايلر ميگم :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اين يه کلاسه که فقط يه Constructor داره و يه Destructor . دو تا هم داده عضو داره که يکيش از نوع int و دومي از نوع string که خود string هم يه کلاسه از کتابخانه استاندارد ++C .
الان اگه يه نکته بگم باز دوستان ميگن اينور و اونور نپر .
ولي ميگم .
وقتي از شيء يه کلاسه ديگه تو کلاس خودمون استفاده مي کنيم ميگيم از خاصيت Composition يا ترکيب استفاده کرديم . که ميگيم CreateAndDestroy يه string داره . بعدا تو بحث ارث بري اين مفهوم رو بهتر مي فهمين . تو ارث بري هم ميگيم فلان يه فلان است .
تو اين جا message يه شيء از کلاس string هست که پياده سازي کلاس string تو کتابخانه استاندارد هستش و شما کافيه فقط اونو include کنين .
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اين هم پياده سازي اين کلاس .
يه نکته اي بگم .
لازم نيست تو نابود کننده اين کارايي که تو بالا انجام گرفته انجام بديم . چون اين يه مثاله و مي خوايم ترتيب فراخواني سازنده و نابود کننده معلوم بشه ، اين پيغام ها رو چاپ کرديم .
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اين هم تابع main بود .
تو اينجا با مفهوم static بودن هم آشنا ميشين .
يه تابع تعريف کرديم به اسم create که نه چيزي مي گيره و نه چيزي برميگردونه .
بعد يه شيء سراسري يا Global از کلاسمون تعريف کرديم . چون سازنده مون دو تا پارامتر داره پس موقع تعريف شيء هم دو آرگومان براش مي فرستيم . اوليش از نوع int و دوميش از نوع string . ( رشته ها داخل " " قرار مي گيرن . ) چون سازنده فراخواني ميشه ، پس دستورات موجود تو اون اجرا ميشه . پس با اجراي برنامه ، ابتدا پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تابع main شروع ميشه . پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
باز يه شيء ايجاد مي کنيم و سازنده فراخواني ميشه و يه پيغام چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد يه شيء static تعريف مي کنيم و سازنده فراخواني ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا تابع create رو فراخواني مي کنيم . اجرا از تابع main منتقل ميشه به تابع create .
با اجراي تابع create پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با تعريف يک شيء داخل اين تابع سازنده فراخواني ميشه و در نتيجه پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
يه شيء static ديگه تعريف مي کنيم و باز پيغام چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دوباره يه شيء ديگه و فراخواني سازنده و چاپ پيغام :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا يکي از نکات مهم اينجاست . مي بينين که به پايان تابع create رسيديم . پس با تموم شدن اجراي اين تابع ، اشيايي که تو اون تعريف شده بودن بايد نابود بشن و اين به معناي فراخواني نابود کننده است . پس براي دو شيء 7 و 5 ، نابودکننده احضار ميشه . چرا براي 6 نه ؟ چون اون يه static بود .
پيغام هاي زير چاپ ميشن :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اجراي برنامه برميگرده به تابع main .
دستور زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
يه شيء ديگه تعريف مي کنيم و سازنده فراخواني ميشه و پيغام زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد دستور زير چاپ ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا مهمترين نکته که غرض از اين مثال هم ذکر اين نکته بود .
الان کار تابع main هم تموم شد و نوبت مي رسه به نابود شدن شيء ها يکي پس از ديگري . چه static و چه غير static . حالا کدوم يکي پس از کدوم يکي ؟ اين مهمه !
چون شيء 4 آخرين شيئي بود که ايجاد شده بود پس اول اون نابود ميشه . چاپ پيغام زير هم اين مطلب رو تاييد مي کنه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد شيء 2 نابود مي شه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا اول اون شيء static که تو تابع create بود نابود ميشه و بعد static موجود تو تابع main :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آخر سر هم اون شيء Global نابود ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بنابراين خروجي کامل برنامه اين ميشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید