这是为什么的一个例子。
假设您正在实现一类特殊向量。比如一个Color
类。
Color
s 将基本上是具有 4 个值的向量,r,g,b,a。
现在我们正在编写一个图形引擎,在我们的程序中,我们经常想知道当来自两个不同来源的光作用于我们正在评估的像素(如光线追踪器中)时,像素会发生什么。定义一个 + 运算符来评估当来自两个不同光源的光加在一起时会发生什么会很方便。
如果我们没有运算符,您可以在代码中编写将两个Color
s 相加:
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
添加。我敢打赌,你的整个职业生涯都不会凌驾于运营商之上,我认为你不会错过太多。