为什么要重载以前未定义的运算符

Why are you overloading an operator that has not been defined before?

本文关键字:未定义 运算符 重载 为什么      更新时间:2023-10-16

在下面的示例中,加法运算符已重载:

class CVector {
public:
int x,y;
CVector operator + (const CVector&);
};

但是你会说加法运算符对于 CVector 类型来说是重载的,而加法运算符以前甚至没有在此类中声明或定义过?

谢谢!

cppreference 将运算符重载简要定义为

运算符重载:自定义用户定义类型的操作数的C++运算符。重载运算符是具有特殊函数名称的函数。

所以运算符+实际上是一个预定义名称operator+的函数,它已经被用于几种类型。当您现在为用户定义的类型CVector提供自定义的operator+实现时,这被视为overloading,因为您为各个参数的给定函数名称定义了不同的实现。

你会说加法运算符对于 CVector 类型来说是重载的,而加法运算符以前甚至没有在此类中声明或定义过吗?

是的。

假设您有:

int a = 10;
int b = 20;

如果使用 a + b ,则使用的是为 int 定义的 + 运算符的版本。

现在,假设您有:

std::string as;
std::string bs;

如果使用 as + bs ,则使用的是为 std::strings 定义的 + 运算符的版本。 因此,此+运算符是与 std::string 一起使用的重载

来到你的课堂,假设你有:

CVector v1 = { ... };
CVector v2 = { ... };

当你定义一个允许你使用 v1 + v2 的函数时,它是使用 CVector+ 运算符的重载

它不是+运算符的过载CVector
它是使用 CVector s 的 + 运算符的重载