在C++中,重载运算符是什么意思?

5
我看到了这段代码,但我不太明白它的作用是什么:
inline S* O::operator->() const
{
    return ses; //ses is a private member of Type S*
}

如果我使用了->,现在会发生什么?


顺便提一下,这里仅限于C++,因为C语言不允许函数和运算符重载。这是区分这两种语言的另一个问题。 - Thomas Matthews
5个回答

11

现在如果你有

O object;
object->whatever()

首先会调用重载的 operator->,该运算符将返回对象内部存储的 ses,然后再次调用 operator->(如果类型为 S*,则调用内置运算符),以访问返回的指针。

因此

object->whatever();

等价于伪代码:

object.ses->whatever();

后者当然是不可能的,因为 O::ses 是私有的——这就是为什么我称它为伪代码。

有了这样的重载,你可以创建一个指针包装器——这种包装器通常被称为智能指针


“With suce overload” => 你是指“such”还是“suce”是->运算符的名称?(非英语母语者询问) - ereOn
@ereOn:已修复,那些是拼写错误。 - sharptooth

2

如果您有一个类O的实例,并且您执行

obj->func()

然后operator->返回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;
}

1
如果 S 的 func() 被声明为如下形式会发生什么: 虚函数 void func() = 0; - hero
虚函数至少应该是受保护的,但最好是私有的。确保 ses 指向有效对象是类 S 的责任。 - Eddy Pronk
虚拟私有函数?除非你充满了友元类声明,否则我认为私有和虚拟大多是互斥的。 - luiscubal
2
@luiscubal:实际上,拥有私有虚函数是一种很好的技术(在流媒体库中广泛使用)。但并不总是适用。如果你只想让一个类重写一个纯虚函数而无需将其设为私有,则不需要这样做,但如果你希望基类在虚函数调用之前执行一些工作,则这是有用的。说它应该是受保护的或私有的就太远了,那只是可以使用的一种技术。 - Martin York
@Martin York:我看到在Stack Overflow上已经有关于这个主题(虚拟私有)的问题了。我得调查一下这个奇怪的话题。 - luiscubal
如果函数S是虚拟的,那么你将得到一个虚拟函数查找。这个运算符的行为就像O实例实际上是S*一样。 - Puppy

0

这是一个重载运算符,将返回类型为 S 的某个成员的指针。

例如,如果你编写

O object;
(object->)...

这部分代码 (object->) 将成为您的指针。


0

当类型为O的对象使用->运算符时,将返回指向ses的指针。


-1

它重载了类O的运算符->,现在返回一个S*而不是O*


3
默认情况下,类O没有一个返回O*的->运算符。 - Didier Trosset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接