آموزش برنامه نویسی شی گرا در ++C (قسمت 3)

سلام به همراهان عزیز , در 2 مطلب قبلی مفاهیم شی گرایی را به طور کامل بیان کردیم ; در این مطلب به چگونگی استفاده از عملگرها می بردازیم و شی گرایی را به اتمام می رسانیم.سربار گذاری عملگر در ++C :عملگر های موجود ( + , = , - , ++ , ...) در زبان ++C برای کار کردن با انواع اصلی داده (یعنی ...,int,float,char) سازگاری دارند ; ولی وقتی یک کلاس جدید تعریف می کنیم در واقع با انواع جدیدی از داده سرکار داریم که عملگر چیزی درمورد این اشیا نمی داند و نمی تواند به درستی با آن ها کار کند به همین دلیل باید چگونگی عملکرد عملگرهای موجود را برای برنامه تعریف کنیم ; به این عمل سربار گذاری عملگر گویند.در سربار گذاری عملگر از operator استفاده می کنیم ; در کد متوجه می شوید.اشاره گر this :اشاره گر this یک اشاره گر درونی و مخفی در زبان ++C می باشد که به شی جاری اشاره می کند ; منظور از شی جاری , شی ای است که هم اکنون عملی بر روی آن انجام شده است.برای درک بهتر مباحث گفته شده به قطعه کد زیر دقت کنید :در این کد ابتدا کلاسی به نام location تعریف کرده ایم که هریک از اشیا آن دارای طول و عرض جغرافیایی می باشند ; در خط 16.17 دو متد جهت سربارگذاری عملگر + , = معرفی کرده ایم , تعاریف این دو متد سربارگذاری به ترتیب در خطوط 24 - 19 و 31 - 25 قرار گرفته اند. در بدنه متد ()=operator طول و عرض جغرافیایی شی سمت راست = را در طول و عرض جغرافیایی شی سمت چپ = قرار می دهیم ; نتیجه این جایگزینی را در خط 23 با استفاده از اشاره گر this برگشت داده ایم. در خطوط 31 - 25 متد مربوط به سربارگذاری عملگر جمع (+) را می بینیم. در این متد ابتدا یک شی موقتی از کلاس location به نام temp تعریف کردیم. سپس طول و عرض جغرافیایی شی سمت راست + به صورت نظیر به نظیر با طول و عرض جغرافیایی شی سمت چپ + جمع شده و نتیجه در شی temp قرار گرفته است. پس از آن شی temp را به عنوان حاصل جمع برگشت داده ایم.در برنامه اصلی (main) اشیا x , y , z را تعریف کرده و ابتدا مقادیر دو شی x و y را در خروجی چاپ کرده ایم. عملیات اصلی که در این برنامه باعث فراخوانی دو متد سربارگذاری تعریف شده می شود در خط 39 واقع شده است. در نهایت در خطوط 40.41 مقدار شی z در خروجی چاپ شده است.تابع دوست (Friend function) :به خاطر داریم که اعضای محرمانه (private) یک کلاس فقط قابل دسترسی در داخل همان کلاس می باشند ولی اینجا می خواهیم یک استثنا معرفی کنیم که تابع دوست نام دارد ; تابع دوست با اینکه خارج از کلاس می باشد ولی اجازه ی دسترسی به اعضای محرمانه کلاس را دارد.به عنوان مثالی از تابع دوست کلاس به قطعه کد زیر توجه کنید , در این قطعه کد مجددا عملگر + را سربارگذاری کرده ایم ; دلیل اینکه این بار متد سربارگذاری عملگر + را به صورت تابع دوست کلاس معرفی کردیم این است که این تابع این بار دو پارامتر از جنس کلاس دارد. چنین تابعی نمی تواند عضو کلاس باشد. تنها چاره این است که این متد را به عنوان تابع دوست کلاس معرفی کنیم.به دو نکته توجه داشته باشید :1. از عبارت friend در ابتدای اعلان تابع استفاده می کنیم (خط 17).2. قبل از اسم متد سربارگذاری , عبارت ::location وجود ندارد (خط 25). همین مسئله نشان می دهد که این متد یک تابع معمولی بوده و عضو کلاس نیست. خروجی قطعه کد زیر همانند قبل است.سربارگذاری عملگرهای افزایشی و کاهشی ( ++ , - - ) :در قطعه کد زیر به عنوان مثال عملگر افزایشی ( ++ ) را سربارگذاری کردیم ; می دانیم که این عملگر بصورت پیش افزایشی ( x++ ) و پس افزایشی ( ++x ) قابل استفاده است. عملگر کاهشی ( - - ) نیز بصورت مشابه قابل سربارگذاری است. در خطوط 16.17 دو متد با نام یکسان و پارامتر متفاوت جهت سربارگذاری عملگرهای پیش افزایشی و پس افزایشی اعلان شده است. متد دوم سربارگذاری عملگر پس افزایشی را انجام می دهد. پارامتر int در نظر گرفته شده تنها برای تمایز دو حالت پیش افزایشی و پس افزایشی بوده و کاربرد دیگری ندارد.در متد مربوط به سربارگذاری عملگر پیش افزایشی ( خطوط 25 - 20 ) به هر کدام از اجزا طول و عرض جغرافیایی یک واحد اضافه شده است. نتیجه نیز با استفاده از اشاره گر this برگشت داده شده است. برای حالت پس افزایشی , از آنجا که ابتدا محاسبه صورت گرفته و سپس عمل افزایش انجام می شود , ابتدا مقدار اولیه شی موردنظر در شی موقتی temp ذخیره شده و سپس عمل افزایش انجام می شود. در نهایت شی temp (مقدار اولیه شی مورد نظر) برگشت داده می شود.سربارگذاری عملگرهای انتساب مرکب ( =+ , … ) : در قطعه کد زیر به عنوان مثال عملگر انتساب مرکب =+ را سربارگذاری کردیم. سایر عملگرهای انتساب مرکب ( =- , =* , =/ , …) نیز بصورت مشابه قابل سربارگذاری هستند. در خط 13 متد سربارگذاری موردنظر اعلان و در خطوط 20 - 15 پیاده سازی شده است. می بینیم که این بار هم نتیجه با استفاده از اشاره گر this برگشت داده شده است.سربارگذاری عملگرهای رابطه ای | مقایسه ای ( == , … ) : در قطعه کد زیر به عنوان مثال عملگر رابطه ای == را سربارگذاری کرده ایم. سایر عملگرهای رابطه ای | مقایسه ای (> , < , =! , …) نیز بصورت مشابه قابل سربارگذاری هستند. در خط 13 متد سربارگذاری موردنظر اعلان و در خطوط 22 - 16 پیاده سازی شده است. از آنجا که متد سربارگذاری عملگر == به دو پارامتر از جنس کلاس نیاز دارد , لذا این متد به عنوان تابع دوست کلاس تعریف شده است.ممنونم از همراهیتون امیدوارم که متوجه شده باشید.