C++ 超载->;c+中的运算符+;
我看到了这段代码,但我不明白它的作用:C++ 超载->;c+中的运算符+;,c++,operator-overloading,C++,Operator Overloading,我看到了这段代码,但我不明白它的作用: inline S* O::operator->() const { return ses; //ses is a private member of Type S* } 那么,如果我使用->,现在会发生什么呢?它是一个重载运算符,将返回指向s类型的某个成员的指针 比如,如果你写 O object; (object->)... 部分(object->)将成为您的指针。它重载类O的操作符->,该操作符现在返回一个S*,而不是一个O*每当
inline S* O::operator->() const
{
return ses; //ses is a private member of Type S*
}
那么,如果我使用
->
,现在会发生什么呢?它是一个重载运算符,将返回指向s
类型的某个成员的指针
比如,如果你写
O object;
(object->)...
部分
(object->)
将成为您的指针。它重载类O的操作符->,该操作符现在返回一个S*,而不是一个O*每当类型O的对象使用->操作符时,将返回指向ses的指针。就是您有一个类O的实例,并且您确实有
obj->func()
然后操作符->返回ses,然后使用返回的指针调用func()
完整示例:
struct S
{
void func() {}
};
class O
{
public:
inline S* operator->() const;
private:
S* ses;
};
inline S* O::operator->() const
{
return ses;
}
int main()
{
O object;
object->func();
return 0;
}
现在如果你有
O object;
object->whatever()
首先将调用重载的运算符->
,它将返回存储在对象中的ses
,然后将再次为返回的指针调用运算符->
(在S*
情况下内置)
所以
相当于伪代码:
object.ses->whatever();
后者当然是不可能的,因为O::ses
是private
——这就是为什么我称之为伪代码
使用这种重载,您可以围绕指针创建一个包装器—这种包装器通常称为智能指针。默认情况下,类O没有一个->运算符返回一个带有suce重载的O*”=>您是指“这样”还是“suce”是
->
运算符的名称?(非英语母语人士提问)@ereOn:Fixed,这是打字错误。如果S的func()声明为:virtual void func()=0;虚拟功能至少应该受到保护,但最好是私有的。类S负责确保ses指向有效的对象。虚拟私有函数?除非你满脑子都是好友类声明,否则我认为私有和虚拟在很大程度上是互斥的。@luiscubal:实际上拥有私有虚拟是一种很好的技术(在流媒体库中广泛使用)。但是,如果您只是希望一个类重写一个纯虚拟方法,而不需要将其私有化,那么这并不总是合适的,但是如果您希望基类在虚拟调用之前做一些工作,那么它是有用的。说它应该被保护或私有化是远远不够的,这只是一种可以使用的技术。@Martin York:我看到关于堆栈溢出的这个主题(虚拟私有)已经有问题了。我必须研究这个奇怪的话题。BTW,这是C++,只因为C语言不允许函数或操作符重载。这是区分这两种语言的另一个问题。
object.ses->whatever();