我发现这里很少有讨论运算符重载和在 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 同样的推理适用于.*
It is very easy to understand, if you go through the internal mechanism of operator function invocation.
Say a class Complex
can have two members; r
for the real part and i
for the imaginary part. For instance:
Complex C1(10,20),C2(10,2) // we assume there is an already a two argument constructor within class.
Now if you write C1+C2
as a statement, the compiler tries to find the overloaded version of the +
operator on complex numbers. If you overload the +
operator, so C1+C2
is internally translated as c1.operator+(c2)
.
But what would you translate an overloaded .
operator as? For instance:
C1.disp()//display content of a complex object
Now try to come up with an internal representation of C1.operator.(------)
. Given that this syntax would modify it's own semantic meaning, the result is hopelessly messy. For that reason overloading the .
is not allowed.