举例来说,这就是为什么。
Say you are implementing a class of special vectors. For instance a Color
class.
Color
s are going to basically be vectors with 4 values, r,g,b,a.
现在我们正在写一个图形引擎,在我们的程序中,我们经常会想知道当两个不同来源的灯光对正在蒸发的像素作用时,像素会怎么样(就像在射线追踪器中那样 ) 。 定义一个 + 操作员来对两个不同来源的光被加在一起时会发生什么。
如果我们没有操作员, 您可以在您的代码中写入两个 < code> Color code> :
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),
);
A pain to write out.
But of course, If we take the Color
class, and overwrite the add operator to do all of this for us, in our code we can just write
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)
);
}
因为我们的特殊添加代码 只有一个地方, 你可以优化它更好, 和代码 在你的方案的其他部分 变得更容易读取。
一种至少看它的方式。 过去, 我比较喜欢 < code> addLights (color1, color2) 等函数, 因为它容易编码, 很容易读, 更易读, 因为它显然不是传统的 < code> victor 添加。 我敢打赌, 你的整个职业生涯不会超越操作员, 我不认为你会错过很多。