قبل از اینکه توضیح بدم توی این مقاله قصد بررسی چه موضوعی رو داریم، بگذارید یک سوال ساده‌ی برنامه نویسی مطرح کنم! به نظرتون شرط زیر اجرا میشه یا نه؟ آیا می‌تونیم عبارت مورد نظر رو توی خروجی ببینیم؟

1

 

چند روز پیش به یک سوال جالب روی stackoverflow برخوردم که چنین چیزی رو پرسیده بودند ولی خب البته توی JavaScript و نه C++، و از اونجایی که من رابطه‌ی خوبی با این زبان دارم 😀 همون سوال رو توی قالب C++ مطرح کرده و بهش می‌پردازم. موضوع اینه که در نگاه اول و با فرض کردن اینکه نوع x هم عدد است، به سرعت و با اطمینان می‌گیم که این دیگه چه سوال مسخره‌ایه و معلومه که چنین چیزی ممکن نیست! ولی با کمی تامل و دقت و اگه با Operator Overloading‌ آشنایی داشته باشیم می‌تونیم کلاسی تعریف کنیم که توی اون، عملگر == تعریف جدیدی داشته و این شرط درست در بیاد.

تعریف مجدد یا Overloading‌ عملگرها یعنی اینکه برای انواع داده‌ای جدیدی که خودتون می‌نویسید معنی جدیدی تعریف کرده و عمکرد خاصی داشته باشید. برای انجام اینکار از کلمه‌ی کلیدی operator‌ استفاده می‌کنیم و اسم متدی که قرار است وظیفه‌ی عملگر را بر عهده بگیرد از ترکیب این کلمه و خود عملگر تشکیل می‌شود. مثلا برای تعریف معنی جدیدی برای عملگر + از عبارت operator+ برای اسم کلمه استفاده می‌کنیم. اینکه مقدار ورودی متد از چه نوعی باشه بستگی به این داره که اشیای ساخته شده از نوع جدید شما با چه انواع داده‌ای دیگری قصد جمع و ضرب و… شدن را دارند. همچنین نوع بازگشتی متد می‌تونه void باشه و چیزی را بر نگردونه و یا اینکه از نوع خود داده‌ی جدید یا هر نوع دیگه‌ای بسته به کاربرد شما باشه. برای یک مثال ساده فرض کنید کلاسی تعریف کرده‌ایم که دو متغیر عددی داشته و قصد تعریف کاربرد جدیدی برای + داریم. برای اینکار می‌تونیم به صورت زیر عمل کنیم:

2

به این صورت در صورت اجرا کردن کد زیر مقادیر a==3, b==8 در خروجی نمایش داده می‌شود.

3

در این اجرا در واقع عملگر + اجرای متد)  t1.operator+( t2 را شبیه سازی کرده‌است. به همین دلیل است که نوع ورودی متد operator باید با نوع داده‌ای که در سمت راست قرار می‌گیرد مطابقت داشته باشد.

نکته: این امکان در تمامی زبان‌های برنامه نویسی وجود نداشته و نمی‌تونیم چنین چیزی رو انجام بدیم. به عنوان مثال در Java چنین قابلیتی وجود نداشته و قابلیت‌های این‌چنینی توسط Interface و با Override کردن متدها انجام می‌پذیرد و شبیه‌سازی متدی وجود نداشته و باید موقع نیاز به یک عملیات، متدی را فراخوانی نماییم.

با این توضیحات بر می‌گردیم به سراغ سوالی که ابتدای کار مطرح کردیم. اگر نوع جدیدی ایجاد کرده و در آن تعریف جدیدی برای عملگر == بنویسیم که در آن مقدار فعلی یک متغیر داخلی به عنوان نتیجه ارسال شده و پس از آن یکی به مقدار متغیر اضافه کند، آیا شرط true بر می‌گرداند؟ خب فرض کنید مقدار اولیه‌ی این متغیر داخلی برابر ۱ باشد، پس از اولین اجرا یکی به این مقدار افزوده شده و مقدار جدید ۲ در آن قرار می‌گیرد. به دلیل true بودن اولین مقایسه، اینکار ادامه یافته و دومین مقایسه اجرا می‌شود. در این حالت مقدار فعلی این متغیر برابر ۲ بوده و مجدد به آن اضافه می‌شود و این روال ادامه می‌یابد. در این شرایط اگر این مقایسه تا  x == 1000‌نیز ادامه می‌یافت باز شرط برقرار بوده و عبارت مورد نظر چاپ می‌شد.

در کد زیر این شرایط برقرار می‌باشد:

4

نکته‌ی آخری که در این کد وجود دارد طرز کار return value++ می‌باشد. برای درک این بخش، تکه کد زیر را در نظر بگیرید. به نظر شما مقدار متغیرهای b, c چند است؟

5

در صورت استفاده از عبارت a++ ابتدا مقدار فعلی متغیر برای نتیجه در نظر گرفته شده و سپس به آن یکی اضافه می‌شود ولی در صورتیکه از ++a استفاده شود، ابتدا جمع انجام شده و سپس مقدار نهایی a به عنوان نتیجه ارسال می‌شود. پس با این توضیحات مقدار b==1‌ و c==3 نتیجه‌ی نهایی این کد خواهد بود.

اميدوارم مفيد بوده باشه، موفق باشيد.

کانال تلگرام