Складываю сюда примеры перегрузок операторов, в качестве памятки как это работает. Часть примеров реализована для Qt.
Если убрать определение функции QDebug operator<< (QDebug out, myclass &obj), то изменится в коде результат работы строки qDebug() << a;
Пример 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(); }
Комментариев нет:
Отправить комментарий