是运营商' +'一元还是二元?

时间:2014-11-09 00:10:51

标签: c++ operator-overloading

在阅读this文章时,似乎运营商+是一元的。那个怎么样。 根据我的理解,一元运算符是一个运算符,它不依赖于另一个变量来操作,如++ a或a--。变量怎么样' +'一元。我以为是二进制?如果有人能清楚这一点,我将不胜感激。

2 个答案:

答案 0 :(得分:6)

+既是一元运算符又是二元运算符。一元+形式(+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*>()
}

Demo

这与-*运营商的处理方式相同。你有-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.

答案 1 :(得分:1)

+ a中的一元+被定义为补充一元 - (-a)。这是“默认”,所以实际上并不经常使用。但是它可以与引用类的变量一起使用,它可以重载以具有类特定的含义。所以它并非完全无用。