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;}
也可以这样做int*
,并带有int*v(){return&I;}
等函数,将打印出变量的地址,除非用*符号取消引用它们。引用会自动取消引用自身你似乎有很多问题:
I
,它只是使用初始化列表来构造I变量。构造函数S(inti){i=i;}
也可以这样做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初始值设定项语法的优点是它执行初始化而不是分配。