Перегрузка в виде внешней функции
Vector operator-(Vector const & v) {
return Vector(-v.x, -v.y);
}
Vector operator*(Vector const & v, double d) {
return Vector(v.x * d, v.y * d);
}
Перегрузка внутри классов
(type)
, []
, ->
, ->*
, =
. struct Vector {
Vector operator-() const {
return Vector(-x, -y);
}
Vector operator-(Vector const & p) const {
return Vector(x - p.x, y - p.y);
}
private:
double x,y;
};
struct BigNum {
BigNum & operator++(){ // prefix
// increment
return *this;
}
BigNum & operator++(int) {// postfix
BigNum tmp(*this);
++(*this);
return tmp;
}
};
Переопределине операторов ввода-вывода
struct Vector { … };
std::istream& operator»(std::istream & is, Vector &p) { is » p.x » p.y; return is; }
std::ostream& operator«(std::ostream &os, Vector const &p) { os « p.x « ’ ‘ « p.y; } ```
struct String {
operator bool() const {
return size_ != 0;
}
operator char const *() const {
if (*this)
return data_;
return "";
}
};
&&
, ||
, ,
. Т.к. при переопределении будет нарушен порядок выполнения, так же может быть нарушена lazy evaluation.+=
разумно реализовать внутри класса
+
, -
разумно переопределить снаружи класса, чтобы работало приведение типов
struct String {
String (char const * str) { ... }
String & operator+=(String const & s) {
...
return *this;
}
// String operator+(String const & s2) const { ... }
}
String operator +(String s1, String const & s2) {
return s1+=s2;
}
String s1("world");
String s2 = "Hello " + s1; // перегрузка внутри функции не сработает в данном кейсе, перегрузка снаружи сработает
=
то нужно переопределить и !=
>
то нужно переопределить и остальные (>=
, <
<=
)=
и >
, остальные реализовать через нихНужно соблюдать стандартную семантику (чтобы операция с пользовательскими типами была аналогичной операции со встроенными типами)