Читая эту статью, кажется, что оператор + унарный. Как так. По моему мнению, унарный оператор является оператором, который не зависит от другой переменной для ее работы, например ++a или a--. Как переменная "+" унарная. Я думал, что он двоичный? Буду признателен, если кто-нибудь сможет это прояснить.
+
является и унарным, и двоичным оператором. +a
+
форма (+a
) заставляет операнд оцениваться как число или указатель, тогда как бинарная форма +
форма (a + b
) является добавлением.
Унарное +
, как правило, противоположно Унарный -
; применение его к любому числовому значению не изменит его. (+1 == 1
) Однако у него есть некоторые виды использования, включая принуждение массива к распаду в указатель:
template <typename T> void foo(const T &) { }
void test() {
int a[10];
foo(a); // Calls foo<int[10]>()
foo(+a); // Calls foo<int*>()
}
(Демо)
Это то же самое касается операторов -
и *
. У вас есть -a
(отрицание) и a - b
(вычитание); *a
(разыменование указателя) и a * b
(умножение).
Вы перегружаете обе версии по-разному. Для перегрузки через функции-члены:
public:
T operator+() const; // Unary
T operator+(const U &) const; // Binary
Как и при любой другой перегрузке оператора, обе формы могут возвращать значение, отличное от своего закрывающего типа; например, у вас может быть класс строк, чей operator+()
возвращает числовой тип. Это будет соответствовать соглашению унитарного +
оценивающего его операнд как число.
Вы можете также перегрузить эти операторы как свободные функции:
T operator+(const U &); // Unary, called on type U and returns T.
T operator+(const U &, const V &); // Binary, called on types U and V and returns T.
Unary +, как в +a, определяется как дополнение унарного - (-a). Это "дефолт", поэтому на самом деле не часто, если он когда-либо использовался. Однако он может использоваться с переменными, относящимися к классам, где он может быть перегружен, чтобы иметь значение класса. Так что это совсем не бесполезно.
+x
) и двоичный плюс (a + b
). Он должен иметь в виду только один.(-) for negative
и(+) for positive