Я видел этот код, но я не мог понять то, что он делает:
inline S* O::operator->() const
{
return ses; //ses is a private member of Type S*
}
таким образом, что происходит теперь, если я использовал ->
?
Если у вас есть экземпляр класса 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;
}
Каждый раз, когда объект типа O использует оператор ->, будет возвращен указатель на ses.
Теперь, если у вас
O object;
object->whatever()
сначала будет вызван перегруженный operator->
, который вернет ses
, хранящийся внутри объекта, затем operator->
(встроенный в случае S*
) будет вызван снова для возвращенного указателя.
Таким образом
object->whatever();
это эквивалентно псевдокоду:
object.ses->whatever();
последний был бы, конечно, невозможен, поскольку O::ses
является private
- поэтому я и называю это псевдокодом.
С помощью такой перегрузки можно создать обертку вокруг указателя - такая обертка обычно называется умным указателем.
Это перегруженный оператор, который возвращает указатель на некоторый член типа S
.
Например, если вы напишете
O object;
(object->)...
часть (object->)
станет вашим указателем.
Он перегружает оператор -> класса O, который возвращает теперь S* вместо O*