c++ - 如何重载运算符+?

标签 c++ operator-overloading

有人可以用初学者的术语解释运算符重载的工作原理吗?我需要将“+”运算符重载为成员函数,并链接到对象数组。我从谷歌上读了一些东西,它似乎与“+”的运行方式相同而没有重载,所以我真的很困惑。

这是我到目前为止的声明:

ALIST<t_type> & operator+(const t_type );

所以我在公共(public)部分的 ALIST 类中声明了这一点。 “+”运算符现在是否重载了,还是我需要在此函数定义中做更多的工作以使其重载?

此外,一旦它最终重载,我现在可以用它做什么?重载它有什么意义?

请用初学者的术语解释一下,谢谢。

最佳答案

这是一个例子来说明原因。

假设您正在实现一类特殊 vector 。例如 Color 类。 Color 基本上是具有 4 个值的 vector ,r,g,b,a。

现在我们正在编写一个图形引擎,在我们的程序中,我们经常想知道当来自两个不同光源的光作用在我们正在评估的像素上时像素会发生什么(就像在光线追踪器中一样)。定义一个 + 运算符来评估当来自两个不同光源的光加在一起时会发生什么会很方便。

如果我们没有运算符,您可以在代码中编写以将两个 Color 相加:

Color newColor = Color(
    color1.r + color2.r, 
    color1.g + color2.g,
    color1.b + color2.b,
    color1.a + color2.a
);

更糟糕的是,如果您密切关注光的物理特性,您可能会发现颜色不会正常添加。例如,它们可能会根据某些线性函数进行加法,例如f(a) = a^2 ...(我不认为光不会这样做,这只是一个随机示例)。

f(a) = a^2; f(b) = b^2
f(a + b) = ??
a = f(a)^.5; b = f(b)^.5
a + b = f(a)^.5 + f(b)^.5
f(a + b) = (f(a)^.5 + f(b)^.5)^2 *yada yada yada i'm terrible at math.

这意味着我们的 Color 添加代码现在变成了

Color newColor = Color(
    pow(pow(color1.r, .5) + pow(color2.r, .5),2), 
    pow(pow(color1.g, .5) + pow(color2.g, .5),2),
    pow(pow(color1.b, .5) + pow(color2.b, .5),2),
    pow(pow(color1.a, .5) + pow(color2.a, .5),2), 
);

写出来很痛苦。 但是当然,如​​果我们采用 Color 类,并覆盖 add 运算符来为我们完成所有这些,我们就可以在代码中编写

Color color = color1 + color2;

Color 类定义中定义了这个

Color Color::operator+(const Color &rhs) const {
     return Color(
           pow(pow(this.r, .5) + pow(rhs.r, .5),2), 
           pow(pow(this.g, .5) + pow(rhs.g, .5),2),
           pow(pow(this.b, .5) + pow(rhs.b, .5),2),
           pow(pow(this.a, .5) + pow(rhs.a, .5),2)
     ); 
}

由于我们的特殊添加代码只在一个地方,您可以更好地优化它,并且程序其余部分的代码变得更具可读性。

至少这是一种看待它的方式。过去,我更喜欢像 addLights(color1, color2) 这样的函数,因为它更容易编码,同样易于阅读,而且可读性更好,因为很明显它不是传统的 vector 添加。我敢打赌,您可以在整个职业生涯中都不会压倒运营商,而且我认为您不会错过太多。

关于c++ - 如何重载运算符+?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708600/

相关文章:

c++ - 函数返回指向类的指针时是否调用复制构造函数?

c++ - 知道函数内部参数中基指针派生类的类型吗?

c++ - 在 C++ 泛型编程中重载增量运算符

c++ - 在 C++ 中实现 Matlab 语法

r - 多个类的 S3 运算符重载

c++ - 运算符重载 [operator A() const]

c++ - 预处理器输出文件是否为有效的 C/C++ 文件

c++ - 在 QLabel 中隐藏或裁剪重叠文本?

c++ - 是否存在检测有符号类型的位移位操作的 GCC 警告?

c++ - C++中operator[]()一定要是成员函数吗?