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