В C # для перегрузки таких операторов, как ‘+’, ‘-‘ и т. Д., Я должен сделать функцию статическим членом класса:
class MyType
{
/*...*/
public static MyType operator+ (MyType a, MyType b)
{
MyType ret;
/* do something*/
return ret;
}
}
Насколько я знаю, в C ++ я могу перегрузить оператор:
class MyType
{
/*...*/
public:
MyType operator+ (MyType b) // *this is the first operand
{
MyType ret;
/* do something*/
return ret;
}
};
Проблема в том, что *this
это первый операнд, поэтому первый операнд должен иметь тип MyType. Например, если я хочу добавить MyType
в целое число:
MyType a, b;
b = a + 1; // Valid
b = 1 + a; // Error
В C # я могу перегрузить оператор «+» для каждого случая.
Мой вопрос: могу ли я сделать в C ++ так же, как в C #, использовать статические операторы? Насколько я знаю, есть один способ сделать это с дружественными операторами, но они теряются при наследовании функции.
Сделать operator+
перегрузка с int
на левой стороне свободная функция вместо функции-члена MyType
:
class MyType
{
...
// MyType + int can be a member function because MyType
// is the type of the sum's left hand side
MyType operator+(int rhs) const;
};
// int + MyType needs to be a free function because
// int is the type of the sum's left hand side
MyType operator+(int lhs, const MyType &rhs);
Еще одна распространенная идиома — сделать перегрузки friend
из класса интересов. Теперь вы можете реализовать оба варианта одинаково:
class MyType
{
...
friend MyType operator+(int lhs, const MyType &rhs)
{
// get access to MyType's private members here
// to implement the sum operation
...
}
friend MyType operator+(const MyType &lhs, int rhs)
{
// you can also implement the symmetric case
// of int on the right hand side here
...
}
};
Обратите внимание, что хотя operator+
перегрузки выглядят как функции-члены во втором примере, они на самом деле являются свободными функциями, которые живут в глобальной области видимости из-за их объявления как friend
с MyType
,
Вы можете определить оператор в глобальной области видимости в C ++, например,
MyType operator+ (const MyType& a, const MyType& b)
{
MyType ret;
/* do something*/
return ret;
}
Вам может понадобиться добавить объявление друга в MyType
если оператор должен получить доступ к закрытым членам класса.