понедельник, 5 декабря 2011 г.

Перегрузка операторов

Складываю сюда примеры перегрузок операторов, в качестве памятки как это работает. Часть примеров реализована для Qt.

Пример 1.

Перегрузка оператора ввода в поток << и оператора приведения типа int:
  • operator <<
  • operator int()
#include <QDebug>
class myclass {
private:
    int val;
public:
    myclass() {
        val = 7;
    }
    void setVal(int _val) { val = _val; }
    int getVal() { return val; }
    int operator()() { return 77; }
    int operator()(int x) { return x+1; }
    int operator()(int x, int y) { return x+y; }
    operator int() { return val*val; }
};

QDebug operator<< (QDebug out, myclass &obj) {
    out << obj.getVal();
    return out.maybeSpace();
}

int main()
{
    myclass a;
    qDebug() << (int)a;     // 49    // operator int()
    qDebug() << int(a);     // 49    // operator int()
    qDebug() << a;          // 7     // operator<<
    qDebug() << a(5);       // 6     // int operator()(int x)
    qDebug() << a(9, 0);    // 9     // int operator()(int x, int y)
    qDebug() << a(9, 2);    // 11    // int operator()(int x, int y)
    qDebug() << a();        // 77    // int operator()()

    return 0;
}

Если убрать определение функции QDebug operator<< (QDebug out, myclass &obj), то изменится в коде результат работы строки qDebug() << a;
#include <QDebug>
class myclass {
private:
    int val;
public:
    myclass() {
        val = 7;
    }
    void setVal(int _val) { val = _val; }
    int getVal() { return val; }
    int operator()() { return 77; }
    int operator()(int x) { return x+1; }
    int operator()(int x, int y) { return x+y; }
    operator int() { return val*val; }
};

int main()
{
    myclass a;
    qDebug() << (int)a;     // 49    // operator int()
    qDebug() << int(a);     // 49    // operator int()
    qDebug() << a;          // 49    // operator int() ###<-- здесь
    qDebug() << a(5);       // 6     // int operator()(int x)
    qDebug() << a(9, 0);    // 9     // int operator()(int x, int y)
    qDebug() << a(9, 2);    // 11    // int operator()(int x, int y)
    qDebug() << a();        // 77    // int operator()()

    return 0;
}
P.S. В данном примере функция operator<< принимает второй параметр как не константный, хотя с точки зрения здравого смысла, данная операция не должна менять входящий объект, поэтому второй оргумент можно было бы определить константным, но в таком случае потребуется объявить данный метод дружественным для класса myclass, т.к. выводимый нами атрибут находиться в private разделе, а воспользоваться вызовом метода obj.getVal() при константом параметре мы бы уже не могли.
class myclass {
    // ...
    friend QDebug operator<< (QDebug out, const myclass &obj);
}

QDebug operator<< (QDebug out, const myclass &obj) {
    out << obj.val;      // вызов приватного атрибута val
    return out.maybeSpace();
}

Комментариев нет:

Отправить комментарий