理由の例を次に示します。
特別なベクトルのクラスを実装しているとします。たとえばColor
クラス。
Color
s は基本的に r、g、b、a の 4 つの値を持つベクトルになります。
現在、グラフィック エンジンを作成しています。このプログラムでは、(レイ トレーサーのように) 評価しているピクセルに 2 つの異なる光源からの光が作用したときにピクセルに何が起こるかを知りたいことがよくあります。+ 演算子を定義して、2 つの異なる光源からの光が加算されたときに何が起こるかを評価すると便利です。
演算子がなかった場合は、2 つ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;
これを in outColor
クラス定義で定義すると
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)
);
}
私たちの特別な追加コードは 1 か所だけにあるため、コードをより適切に最適化でき、プログラムの残りのコードがはるかに読みやすくなります。
少なくともそれを見るその1つの方法。addLights(color1, color2)
以前は、コーディングが簡単で読みやすく、従来のvector
追加ではないことが明らかなため、次のような関数を好んでいました。オペレーターを上書きすることなく、キャリア全体を過ごすことができるに違いありません。多くを逃すことはないと思います。