سربارگزاری عملگرها

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

در برنامه‌نویسی رایانه‌ای سربارگزاری عملگر (به نام چندریختی ادهاک نیز شناخته می‌شود) حالت ویژه‌ای از چندریختی است که در آن بخشی و یا همهٔ عملگرها مانند +، = یا

[ویرایش]

بسته به نوع آرگومان‌هایشان، پیاده‌سازی‌های متفاوتی دارند. گاهی سربارگذاری توسط زبان برنامه‌نویسی تعریف می‌شود. همچنین برنامه‌نویس می‌تواند برای پشتیبانی انواع جدید، عملگرها را دوباره پیاده‌سازی کند (سربارگزاری کند).

ادعا می‌شود سربارگزاری عملگرها مفید است چون اجازه می‌دهد روند توسعهٔ برنامه با استفاده از نشان‌گذاری «نزدیک‌تر به هدف» انجام شود. و این امکان را فراهم می‌سازد که انواع دادهٔ تعریف‌شده توسط کاربر با سطح نحویِ همسانی با انواع دادهٔ توکار زبان برنامه‌نویسی به‌کار برده شوند. این کار به‌آسانی می‌تواند با فراخوانی توابع شبیه‌سازی شود. برای مثال سه عدد صحیح a ، b ، c را در نظر بگیرید:

a + b * c 

در یک زبان برنامه‌نویسی که از سربارگزاری عملگرها پشتیبانی می‌کند، با فرض این که تقدم عملگر '*' بیشتر از '+' است، در واقع عبارت بالا روش کاراتر نوشتن عبارت زیر است:

 add (a, multiply (b,c))

مثال‌ها[ویرایش]

در این مثال، عملگر جمع سربارگزاری شده است تا توسط نوع دادهٔ تعریف‌شده توسط کاربرِ Time استفاده شود:

 Time operator+(const Time& lhs, const Time& rhs) {
     Time temp = lhs;
     temp.seconds += rhs.seconds;
     if (temp.seconds>= 60) {
         temp.seconds -= 60;
         temp.minutes++;
         }
     temp.minutes += rhs.minutes;
     if (temp.minutes>= 60) {
         temp.minutes -= 60;
         temp.hours++;
         }
     temp.hours += rhs.hours;
     return temp;
     }

جمع یک عمیات دودویی است. بنابراین دو عملوند راست و چپ دارد. در سی++ آرگومان‌های ارسال شده به تابع جمع، عملوندها هستند. و شیء temp نتیجهٔ برگردانده شده است. این عملیات همچنین می‌تواند توسط یک متد از کلاس انجام شود. در این حالت عملوند lhs با this جایگزین می‌شود. (می‌توان در بدنهٔ کلاس this را ننوشت.) این کار باعث می‌شود عملوند سمت چپ لزوماً از نوع Time باشد همچنین امکان ایجاد تغییر در عملوندها را فراهم می‌سازد.

 Time Time::operator+(const Time& rhs) const {
     Time temp = *this;  /* Copy 'this' which is not to be modified */
     temp.seconds += rhs.seconds;
     if (temp.seconds>= 60) {
         temp.seconds -= 60;
         temp.minutes++;
         }
     temp.minutes += rhs.minutes;
     if (temp.minutes>= 60) {
         temp.minutes -= 60;
         temp.hours++;
         }
     temp.hours += rhs.hours;
     return temp;
     }