سلام!

این جلسه می خواهیم عمل گر های ++ و -- را هم به صورت پیشوندی (prefix) و هم به صورت پسوندی (postfix) سربارگذاری کنیم.

اوّل از همه باید فرق عمل گر های پیشوندی و پسوندی را متوجه شویم. خروجی برنامه ی زیر را با برنامه ی زیر آن مقایسه کنید.

#include <iostream>

using namespace std;

int main(){
    int a = 0;
    cout << a++ << endl;
    return 0;
}

#include <iostream>

using namespace std;

int main(){
    int a = 0;
    cout << ++a << endl;
    return 0;
}

متوجه می شوید که اگر عمل گر ++ به صورت پیشوندی ظاهر شود، مقدار اضافه شده را برمی گرداند و اگر به صورت پسوندی استفاده شود، مقدار قبلی متغیر را برمی گرداند. این توضیح برای عمل گر -- هم صدق می کند.

حال این سوال پیش می آید که چه گونه این عمل گر ها را برای یک class پیاده سازی کنیم؟ فرض کنید که می خواهید عمل گر ++ را به صورت پیشوندی برای Point تعریف کنید. برای این کار باید کدی مانند کد زیر بنویسید؛

Point operator++(Point &p){
    p.setX(p.x() + 1);
    p.setY(p.y() + 1);
    return p;
}

برای این که همین عمل گر را به صورت پسوندی تعریف کنید، باید از کد زیر استفاده کنید؛

Point operator++(Point &p, int){
    Point p2 = p;
    p.setX(p.x() + 1);
    p.setY(p.y() + 1);
    return p2;
}

در واقع یک ورودی int هم به ورودی ها اضافه می کنید. این کار باعث می شود که compiler بفهمد این یک عمل گر پسوندی است.

برای تمرین، عمل گر های ++ و -- را به صورت پیشوندی و پسوندی برای Point تعریف کنید.

موفق باشید!