【问题标题】:How do I analyse the output of this code with the struct如何使用结构分析此代码的输出
【发布时间】:2019-11-12 19:42:04
【问题描述】:

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

【问题讨论】:

  • 请不要链接到代码。将所有相关代码 in 放入问题中 - 作为 text.
  • 你知道s是什么吗? s.n 是什么? s.n-&gt;n 是什么?我们有多少对象?
  • 这如何编译?您将指针 s 传递为 &amp;s
  • 你懂int i = 42;吗? S s = /*..*/; 是一样的。类型为Ss 的定义。
  • 棘手的部分是&amp;s,这是正在建设中的s。但无论如何相对直观。 s 未初始化,但 &amp;s 有意义。

标签: c++ struct constructor


【解决方案1】:

我们来看看每行代码:

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 也有两个参数,这次可以通过-&gt; 访问,因为它是一个指针。

  • s.n-&gt;v 被分配为 20。
  • s.n-&gt;n 被分配为指向 s 的指针,之前已定义。

因此您可以将s.n-&gt;n 简化为指向s 的指针。

这样打印:

std::cout << (s.n->n->v);

等价于

std::cout << s.v;

答案是10

【讨论】:

  • 非常感谢!你能解释一下 n(N) 和 v(V) 代表什么吗?
  • 欢迎 :) 我可以试着解释一下:小写的 v 是结构体 S 的成员,大写的 V 是构造时给出的参数。 (在您的示例中为 10 和 20)。写v(V),把V的值复制到v里面,和n(N)的解释一样。您可以在此页面了解更多信息:cplusplus.com/doc/tutorial/classes
  • 所以要评估输出我必须找到 s.n 并且要找到 s.n 我必须找到指针 N,这意味着评估 new S(20, &s) ?
【解决方案2】:

第一个令人困惑的行只是一个构造函数,它使用如下参数初始化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-&gt;n == &amp;s1,这就是为什么s1.n-&gt;n == &amp;s1s1.n-&gt;n-&gt;v == 10

【讨论】:

  • 轻微挑剔:s1.n == &amp;s2s2-&gt;n == &amp;s1s1.n-&gt;n == &amp;s1
  • 或与代码中s1为实例,s2为指针一致
【解决方案3】:
struct S{
        S* n
        int v;
        S(int V, S* N): n(N), v(V){};
        };

S s = S(10,new S(20,&s));
cout << (s.n->n->v);

sn 为您提供“=”左侧的 s,然后 ->n 为您提供 (S* n) 来自 S(20,&s) 的结构,该结构与具有值 10 的 s 相同, ->v 返回值 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多