Давайте посмотрим на строку кода на строку:
Struct S {
// ...
};
Это создает структуру с именем S
.
Внутри есть две переменные (члены структуры):
S* n;
int v;
Чтобы создать объект типа S
, вы определили «конструктор»:
S(int V, S* N) : n(N), v(V) {};
, который принимает целое число и указатель на структуру S
, которые оба непосредственно назначаются членам создаваемого объекта.
Затем в основной части кода:
S s = S(10, new S(20, &s));
Объект s
создан.
Внутри целое число v
равно 10, и вы можете получить доступ с помощью s.v
.
Существует также n
, указатель на структуру S
, доступный с s.n
.
У этого n
также есть два параметра, на этот раз доступных с ->
, поскольку он является указателем.
s.n->v
назначено равным 20.
s.n->n
назначается указателем на s
, определенным ранее.
Таким образом, вы можете упростить s.n->n
до указателя на s
.
Таким образом, печать:
std::cout << (s.n->n->v);
эквивалентно
std::cout << s.v;
и ответ 10
.