->
这是唯一真正棘手的问题。它必须是一个非静态成员函数,并且不包含任何参数。返回值用于执行成员查找。
如果返回值是类类型的另一个对象,而不是指针,则随后的成员查找也由operator->
函数处理。这称为“向下钻取行为”。语言将operator->
调用链接在一起,直到最后一个返回指针为止。
struct client
{ int a; };
struct proxy {
client *target;
client *operator->() const
{ return target; }
};
struct proxy2 {
proxy *target;
proxy &operator->() const
{ return * target; }
};
void f() {
client x = { 3 };
proxy y = { & x };
proxy2 z = { & y };
std::cout << x.a << y->a << z->a; // print "333"
}
->*
这一点很棘手,因为它没有什么特别之处。的非过负荷版本需要指针的一个目的是在左手侧类类型和指针的一个目的是在右侧构件类型。但是,当您重载它时,您可以接受所需的任何参数并返回所需的任何内容。它甚至不必是非静态成员。
换句话说,这个人是就像一个正常的二进制运算符+
,-
和/
。另请参阅:自由运算符-> *是否会重载邪恶?
.*
和 .
这些不能重载。当左侧为类类型时,已经具有内置含义。能够在左侧为指针定义它们可能会有点道理,但是语言设计委员会认为这会比有用更令人困惑。
超载->
,->*
,.
,并且.*
只能在情况填写,其中一个表达式将是不确定的,它永远不会改变,这将是没有超载的有效表达的意思。