Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 超载->;c+中的运算符+;_C++_Operator Overloading - Fatal编程技术网

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();