Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我们可以';在构造函数初始化列表中不能初始化静态变量,但可以在构造函数体中初始化_C++_Constructor - Fatal编程技术网

C++ 为什么我们可以';在构造函数初始化列表中不能初始化静态变量,但可以在构造函数体中初始化

C++ 为什么我们可以';在构造函数初始化列表中不能初始化静态变量,但可以在构造函数体中初始化,c++,constructor,C++,Constructor,我一直认为初始化列表比构造函数体更适合变量初始化。我还知道,当破坏静态变量时,可以在类外初始化静态变量 但我的问题是为什么我们不能在构造函数初始化列表中初始化静态变量,但我们可以在构造函数体中初始化静态变量 class sample { static int i; public: sample (int ii=20) { i=ii;} void show() { cout << i << endl; } }; i

我一直认为初始化列表比构造函数体更适合变量初始化。我还知道,当破坏静态变量时,可以在类外初始化静态变量

但我的问题是为什么我们不能在构造函数初始化列表中初始化静态变量,但我们可以在构造函数体中初始化静态变量

class sample
{
    static int i;
public:
    sample (int ii=20) { i=ii;}
    void show()
    {
        cout << i << endl;
    }

};

int sample::i=12;

int main()
{
    sample s;
    s.show();
    return 0;
}

它给出了错误。为什么?

在构造函数的主体中,您可以指定。只能在初始化列表中进行初始化

您认为初始化静态成员只是对它的赋值。您可以自己测试:将静态成员设置为const,您的构造函数将不再有效


然后,构造函数初始化列表仅适用于实例成员。但是,静态成员不是类实例的成员,而是与其他类成员具有相同可见性的全局变量;因此,在类初始化列表中“初始化”它们的任何尝试实际上都是静态成员的“重新初始化”,这在C++中是被禁止的。

< P>成员初始化列表表示初始化。
static
成员已在程序开始时初始化(在
main
之前)。如果您可以按照您的建议进行操作,您将使用您创建的每个
示例
对象“重新初始化”静态成员,但是对象只初始化一次


相反,如果要在初始化对象后更改其值,则必须为其赋值。这正是您的第一个代码对
i=ii所做的

您只能初始化一次,但构造函数可能会运行多次。此外,您不应该访问未初始化的内容

假设这是允许的。然后,您必须回答有关以下代码的疑难问题:

int foo::static_member;
foo::foo() : static_member(42){}
foo::foo(int a) : static_member(a) {}
foo::foo(double b) {}

int main()
{
  std::cout << foo::static_member;
  foo m(2.5);
}
intfoo::static_成员;
foo::foo():静态_成员(42){
foo::foo(inta):静态_成员(a){}
foo::foo(双b){}
int main()
{

STD::您不是在构造函数体中初始化它。您正在分配一个值。因为这是C++定义的方式:在“代码> > 和<<代码>之前,只能初始化非静态成员变量。{
每个人都误读了这个问题吗?他们想知道为什么你不能在成员初始化列表中初始化静态成员。这回答了你的问题吗?这真的回答了问题吗?看起来他们想知道的正好相反。你为什么不能在成员初始化列表中初始化静态成员?@JosephMansfield我读到了这个问题是因为不理解初始化列表和初始化正文之间的区别。解释为什么初始化列表不可能是一种有效的回答方法,解释为什么初始化正文没有发生是另一种有效的回答方法。@JosephMansfield:是的,hvd wro然而,我意识到可能会出现混淆,因此编辑了我的答案。在许多情况下,静态成员在程序启动之前已经初始化是错误的。静态成员不必是编译时常量。@phresnel静态变量在
main
之前初始化,它通常包含“程序”是的,静态成员和静态全局变量是在“程序”启动之前初始化的。只有函数局部静态是此规则的例外。@这取决于“程序启动之前”的解释方式-但我已经重新表述了它。@rubenvb:如果在main启动之前有代码执行,那么如果不是“一个正在运行的程序”,这可以被称为什么?Magic Pony Phase?我完全不同意你的看法。在操作系统级别上,运行程序包括任何运行时初始化。@phresnel这有点迂腐。即使初始化器是在编译时计算的,实际的对象在你执行程序之前并不存在,所以即使这样也不会发生“在程序启动之前”。我认为,在这种情况下,“在程序启动之前”的意思是在
main
开始运行之前,这是公认的。
int foo::static_member;
foo::foo() : static_member(42){}
foo::foo(int a) : static_member(a) {}
foo::foo(double b) {}

int main()
{
  std::cout << foo::static_member;
  foo m(2.5);
}