Перегрузка операторов? - PullRequest
0 голосов
/ 19 октября 2019

Я изучаю оператор перегрузки с помощью этой программы (взято http://www.cplusplus.com/doc/tutorial/templates/):

class CVector {
public:
    int x, y;
    CVector() {};
    CVector(int a, int b) : x(a), y(b) {}
    CVector operator + (const CVector&);
};

CVector CVector::operator+ (const CVector& param) {
    CVector temp;
    cout << x << " " << param.x  << endl; //my addition
    temp.x = x + param.x;
    temp.y = y + param.y;
    return temp;
}

int Desperate2() {
    CVector bar(1, 2);
    CVector foo(3, 4);
    CVector result;
    result = bar+foo;
    cout << result.x << ',' << result.y << '\n';
    return 0;
}

Я не понимаю, почему значение x в temp.x = x+param.x является значением bar и param.x значение foo. И если мы напишем result = foo + bar наоборот.

1 Ответ

1 голос
/ 19 октября 2019

result = bar+foo; также можно записать как result = bar.operator+(foo);.

Так что в случае bar + foo мы вызываем функцию-член operator+ на панели и передаем ей параметр foo.

Мы могли бы написать это следующим образом, и это тот же принцип.

class CVector {
public:
    int x, y;
    CVector() {};
    CVector(int a, int b) : x(a), y(b) {}
    CVector add(const CVector&);
};

CVector CVector::add(const CVector& param) {
    CVector temp;
    cout << x << " " << param.x  << endl; //my addition
    temp.x = x + param.x;
    temp.y = y + param.y;
    return temp;
}

int Desperate2() {
    CVector bar(1, 2);
    CVector foo(3, 4);
    CVector result;
    result = bar.add(foo);
    cout << result.x << ',' << result.y << '\n';
    return 0;
}

Тот факт, что bar+foo вызывает функцию-член operator+, может считаться синтаксическим сахаром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...