没有类的重载运算符

时间:2016-07-27 09:27:18

标签: c++ operator-overloading

我们可以在非对象上使用运算符重载吗?例如,添加两个vector<int>。或者我是否需要创建一个具有vector<int>的类,然后重载+运算符。

另外,我想知道在二元运算符中是否可以有2种不同类型的操作数。如果是,怎么样?

3 个答案:

答案 0 :(得分:2)

  

我们可以在非对象上使用运算符重载吗?

运算符本质上是作为函数实现的,可以接受与函数类似的类型范围。

有一个few restrictions,特别是受到以下事实的限制:至少有一个参数必须是classenum (用户或库类型)。

此外,有一些运算符必须作为成员函数实现,因此它们将与一个类相关联,但许多可以在类之外声明和定义。

参数的确切数量由正在实施的运算符决定。一元运算符接受1个参数,二元运算符接受2个参数。

通常,建议是提供类似于canonical forms的行为,但语言本身不会将您的实现限制为仅仅是这种行为。

  

另外,我想知道在二元运算符中是否可以有2种不同类型的操作数。如果是,怎么样?

是。同样,就像函数一样。

答案 1 :(得分:1)

我们可以在非对象上使用运算符重载吗?例如,添加两个向量。

我认为你想问一下是否可以在类定义之外使用运算符重载 。是的,这绝对是可能的,正如其他人在这里所说的那样。这是一个为自定义'MyClass'类型重载'+'运算符的简单示例:

MyClass operator+(const MyClass& a, const MyClass& b)
{
    return MyClass(a.value + b.value);
}

但是,std::vector没有算术运算符的重载是有原因的,因为结果是不明确的。你想要'+'将两个向量链接在一起还是应该添加组件?你如何处理大小不同的载体?通常,STL的容器为这些目的提供了特殊的方法,并且在不清楚时不依赖于操作员,因此请确保您已经检查了specification of std::vectors

您可以根据自己的需要自由地实现此类运算符,尤其是使用自己的类型,但是您可能会产生不直观的行为,最终导致错误的代码。在std::vector的情况下,最好编写一个具有描述性名称的函数,该函数以您希望的方式在std::vector上运行:

std::vector<int> addComponents(const std::vector<int>& a, const std::vector<int>& b);

答案 2 :(得分:-1)

  

我们可以在非对象上使用运算符重载吗?例如,添加两个向量[?]

您的问题的前提已被破坏,因为 a vector<int>是一个对象

超载你喜欢的一切。

  

另外,我想知道在二元运算符中是否可以有2种不同类型的操作数。

试试吧。

  

如果是,怎么样?

输入。