перегрузка-> оператор в C++

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

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

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

5
задан Eddy Pronk 25 May 2010 в 22:55
поделиться

5 ответов

Если у вас есть экземпляр класса 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;
}
2
ответ дан 13 December 2019 в 05:31
поделиться

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

0
ответ дан 13 December 2019 в 05:31
поделиться

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

O object;
object->whatever()

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

Таким образом

object->whatever();

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

object.ses->whatever();

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

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

11
ответ дан 13 December 2019 в 05:31
поделиться

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

Например, если вы напишете

O object;
(object->)...

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

0
ответ дан 13 December 2019 в 05:31
поделиться

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

-1
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: