перегрузка -> оператор в с ++ - PullRequest
5 голосов
/ 25 мая 2010

Я видел этот код, но не мог понять, что он делает:

inline S* O::operator->() const
{
    return ses; //ses is a private member of Type S*
}

так что теперь будет, если я использовал ->?

Ответы [ 5 ]

11 голосов
/ 25 мая 2010

Теперь, если у вас есть

O object;
object->whatever()

сначала будет вызван перегруженный operator->, который вернет ses сохраненный внутри объекта, затем для возвращенного указателя будет снова вызван operator-> (встроенный в случае S*).

So

object->whatever();

эквивалентно псевдокоду:

object.ses->whatever();

последнее было бы, конечно, невозможно, поскольку O::ses - это private - поэтому я называю это псевдокодом .

С такой перегрузкой вы можете создать оболочку вокруг указателя - такую ​​оболочку обычно называют smart pointer .

2 голосов
/ 25 мая 2010

Есть ли у вас экземпляр класса 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;
}
0 голосов
/ 25 мая 2010

Перегружает оператор -> класса O, который теперь возвращает S * вместо O *

0 голосов
/ 25 мая 2010

Каждый раз, когда объект типа O использует оператор ->, возвращается указатель на ses.

0 голосов
/ 25 мая 2010

Это перегруженный оператор, который возвращает указатель на некоторый член типа S.

Мол, если пишешь

O object;
(object->)...

деталь (object->) станет вашим указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...