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

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از سربارگزاری عملگرها)

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

ادعا می‌شود سربارگذاری عملگرها مفید است چون اجازه می‌دهد روند توسعهٔ برنامه با استفاده از نشان‌گذاری «نزدیک‌تر به هدف» انجام شود. و این امکان را فراهم می‌سازد که انواع دادهٔ تعریف‌شده توسط کاربر با سطح نحویِ همسانی با انواع دادهٔ توکار زبان برنامه‌نویسی به‌کار برده شوند. این کار به‌آسانی می‌تواند با فراخوانی توابع شبیه‌سازی شود. برای مثال سه عدد صحیح 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;
     }