所以我得到了这段代码,我必须确定输出,但是我不知道如何开始。有人可以一步一步告诉我会发生什么吗?
第S(int V, S*...)
行和第S s = S(10, new...)
行使我最困惑。
我确实对指针和类有一个粗略的了解,但显然还不够。
我知道S* n
的含义和s.n -> n
的含义,但是S s
使我感到困惑
我尝试逐步遵循代码,但在第S(int V, S* N....)
行迷路了
struct S {
S* n;
int v;
S(int V, S* N) : n(N), v(V) {};
};
S s = S(10, new S(20, &s));
std::cout << (s.n->n->v);
输出为10
,但我不知道为什么。
答案 0 :(得分:2)
让我们看一下每一行的代码行:
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
。
答案 1 :(得分:0)
sn在“ =”的左侧给您s,然后-> n从S(20,&s)给您(S * n)结构,该结构与值10相同的s ,并且-> v返回值10
答案 2 :(得分:0)
第一行令人困惑的只是一个构造器,它使用以下参数初始化struct
成员:
struct S {
S* n; // <-- N goes here
int v; // <-- V goes here
S(int V, S* N) : n(N), v(V) {};
};
第二条令人困惑的行是构造两个S
类型的对象,让我们分解一下:
// this goes to s1.v
// |
// | this goes to s1.n
// v v~~~~~~~~~~~~~
S s1 = S(10, new S(20, &s1));
// ^~~~~~~~~~~~~~
// let's call this s2
现在是s1.n == s2
和s2->n == &s1
,这就是s1.n->n == &s1
和s1.n->n->v == 10
的原因。