C++ Don';我不明白变量I是如何在结构中被赋值的

C++ Don';我不明白变量I是如何在结构中被赋值的,c++,C++,我有以下代码: #include <iostream> using namespace std; struct S { S(int i): I(i) { } int & v () { return I; } private : int I; }; S s1 (1); int main() { cout << s1.v() << "\n"; return 0; } 我对它的工作原理感到困惑。例如,

我有以下代码:

#include <iostream>
using namespace std;

struct S {
    S(int i): I(i) { }
    int & v () { return I; }
    private :
    int I;
};

S s1 (1);
int main() {

    cout << s1.v() << "\n";

    return 0;
}
我对它的工作原理感到困惑。例如,在
s1
中,它调用构造函数
S(int i)
,但在没有
i
类的情况下,它如何对
i
进行子分类并调用其构造函数,在没有为私有变量
i
赋值的情况下,私有变量
i
如何获得赋值?另外,如果
v()
返回
int&
(因此,我认为它会打印出一个内存位置,但它始终给出1)

抱歉,如果这听起来很愚蠢,我想不出来

当没有I类时,它如何对I进行子分类并调用其构造函数;当没有为私有变量I赋值时,它如何为其赋值

语法

S(int i): I(i) { }
表示通过为成员
I
分配参数
I
的值来构造
S
。您可以这样实现它:

S(int i) { I = i; }

如果v()返回int&(因此是一个引用,我认为它会打印出一个内存位置,但它始终给出1)

通过
v
返回的引用是对
s1
的成员
I
的引用。只要
s1
尚未解除分配,引用就有效。在代码中,它是一个静态变量,只有在程序退出时才会解除分配

当没有I类时,它如何对I进行子分类并调用其构造函数;当没有为私有变量I赋值时,它如何为其赋值

语法

S(int i): I(i) { }
表示通过为成员
I
分配参数
I
的值来构造
S
。您可以这样实现它:

S(int i) { I = i; }

如果v()返回int&(因此是一个引用,我认为它会打印出一个内存位置,但它始终给出1)


通过
v
返回的引用是对
s1
的成员
I
的引用。只要
s1
尚未解除分配,引用就有效。在您的代码中,它是一个静态变量,只有在程序退出时才会解除分配。

没有任何子类。我建议你选一本好的C++书,读一点。C++中的一个类(或结构)具有访问说明符<代码>公共< /代码>、<代码>保护< /COD>和私下< /代码>,它控制访问级别,以遵循说明符:

class A
{
  /* private by default */
public:
  /* public stuff */
private:
  /* private again */
};

struct B
{
  /* public by default */
private:
  /* private stuff */
public:
  /* public stuff again */
private:
  /* private stuff again */
};
您的类
S
只包含一个私有成员
int I
,该成员由构造函数初始化为
1
,然后打印出来


继承的语法是类声明中的冒号:

class  Foo : public Bar,
             protected FooBase,
             private SomeHelper
{ /* ... */ };

没有任何子类。我建议你选一本好的C++书,读一点。C++中的一个类(或结构)具有访问说明符<代码>公共< /代码>、<代码>保护< /COD>和私下< /代码>,它控制访问级别,以遵循说明符:

class A
{
  /* private by default */
public:
  /* public stuff */
private:
  /* private again */
};

struct B
{
  /* public by default */
private:
  /* private stuff */
public:
  /* public stuff again */
private:
  /* private stuff again */
};
您的类
S
只包含一个私有成员
int I
,该成员由构造函数初始化为
1
,然后打印出来


继承的语法是类声明中的冒号:

class  Foo : public Bar,
             protected FooBase,
             private SomeHelper
{ /* ... */ };

你似乎有很多问题:

  • 结构不是子类化
    I
    ,它只是使用初始化列表来构造I变量。构造函数
    S(inti){i=i;}
    也可以这样做

  • 它将在构造函数中赋值,请参见#1

  • 您混淆了引用和指针。引用假装起到了常规值传递数字的作用。指针返回
    int*
    ,并带有
    int*v(){return&I;}
    等函数,将打印出变量的地址,除非用*符号取消引用它们。引用会自动取消引用自身


  • 你似乎有很多问题:

  • 结构不是子类化
    I
    ,它只是使用初始化列表来构造I变量。构造函数
    S(inti){i=i;}
    也可以这样做

  • 它将在构造函数中赋值,请参见#1

  • 您混淆了引用和指针。引用假装起到了常规值传递数字的作用。指针返回
    int*
    ,并带有
    int*v(){return&I;}
    等函数,将打印出变量的地址,除非用*符号取消引用它们。引用会自动取消引用自身


  • 冒号后面的部分称为初始化列表。@anon:每个类型都有一个构造函数。偶数指针。
    I
    未被分配。正在初始化。冒号后面的部分被称为初始化列表。@anon:每个类型都有一个构造函数。偶数指针。
    I
    未被分配。它正在初始化。谢谢,它现在有意义了,除了:为什么不让返回类型
    int
    any diff?另外:当您返回int&时,您可以通过函数更改变量的值。就像你可以做的那样
    si.v()=3
    。这种用法是引入语言引用的主要原因之一。它没有被分配到任何地方,ctor初始值设定项语法的优点是它执行初始化而不是赋值。谢谢,现在它有意义了,除了:为什么不只使返回类型
    int
    any diff?anon:When您返回int&,您可以通过函数更改变量的值。就像你可以做的那样
    si.v()=3
    。这种用法是引入语言引用的主要原因之一。它没有被分配到任何地方,ctor初始值设定项语法的优点是它执行初始化而不是分配。