Складываю сюда примеры перегрузок операторов, в качестве памятки как это работает. Часть примеров реализована для 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();
}
Комментариев нет:
Отправить комментарий