如何使用struct分析此代码的输出

时间:2019-07-02 07:48:41

标签: c++ struct constructor

所以我得到了这段代码,我必须确定输出,但是我不知道如何开始。有人可以一步一步告诉我会发生什么吗? 第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,但我不知道为什么。

3 个答案:

答案 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 == s2s2->n == &s1,这就是s1.n->n == &s1s1.n->n->v == 10的原因。