ここで、演算子のオーバーロードと、C++.
::
.*
sizeof
などでオーバーロードできない演算子について説明している投稿をいくつか見つけました。しかし、なぜ.*
避けるべきかについての正確な詳細や理由を見つけることができませんでしたか?重複として投票する人はほとんどいないかもしれませんが、私が欲しいものについてのこれらのリンクの詳細を入手できれば幸いです:)
2 に答える
馬の口から:
演算子
.
(ドット)は、原則として、->に使用されるのと同じ手法を使用してオーバーロードできます。ただし、そうすることで、操作がオブジェクトのオーバーロードを対象としているの.
か、それとも次のように参照されるオブジェクトを対象としているのかについて疑問が生じる可能性があります.
。
class Y {
public:
void f();
// ...
};
class X { // assume that you can overload .
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};
void g(X& x)
{
x.f(); // X::f or Y::f or error?
}
この問題はいくつかの方法で解決できます。標準化の時点では、どちらの方法が最適かは明確ではありませんでした。
AFAIUと同じ理由が当てはまります.*
演算子関数呼び出しの内部メカニズムを調べれば、非常に理解しやすいです。
クラスComplex
に2人のメンバーを含めることができるとします。r
実数部とi
虚数部。例えば:
Complex C1(10,20),C2(10,2) // we assume there is an already a two argument constructor within class.
ここで、ステートメントとして記述した場合、コンパイラーは、複素数C1+C2
でオーバーロードされたバージョンの演算子を見つけようとします。演算子+
をオーバーロードすると、内部的にはとして変換されます。+
C1+C2
c1.operator+(c2)
しかし、オーバーロードされた.
演算子を何と解釈しますか?例えば:
C1.disp()//display content of a complex object
次に、の内部表現を考え出してみてくださいC1.operator.(------)
。この構文がそれ自体の意味を変更することを考えると、結果は絶望的に乱雑になります。そのため、のオーバーロード.
は許可されていません。