Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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++_Static Variables_Class Constants - Fatal编程技术网

C++ 此静态类字段在它之前使用';什么东西被创造出来了?

C++ 此静态类字段在它之前使用';什么东西被创造出来了?,c++,static-variables,class-constants,C++,Static Variables,Class Constants,所以,我一直在试验静态类字段(特别是常量字段),并让自己进入。。。。这: #include <iostream> #include <conio.h> class Test { public: Test() { std::cout << "Constructing (Default CTOR)\n"; } Test(int f) { std::cout << "Constructing (Int arg CTOR)\n"; }

所以,我一直在试验静态类字段(特别是常量字段),并让自己进入。。。。这:

#include <iostream>
#include <conio.h>

class Test {
public:
    Test() { std::cout << "Constructing (Default CTOR)\n"; }
    Test(int f) { std::cout << "Constructing (Int arg CTOR)\n"; }

    void method() const { std::cout << "Already constructed and being used\n"; }
};

class Stack {
public:
    // static const Test what{ 5 }; // - "element of type "const Test" can not have an initializer inside of a class"
    // const Test ok{ 5 }; // now it can (?)

    static const Test what;

    Stack() {
        what.method();
    }

    // Stack() : what{5} {} // can't do that because "what" will be dependent on object creation (which is not how static class fields roll)
};

Stack obj;

const Test Stack::what{};

int main()
{
    _getch();
    return 0;
}
在这段代码中,我希望看到某种错误,但输出结果如下:

我对这里发生的事情有一些假设,但我不确定它们是否正确。所以,如果是,请纠正我

以下是我的假设:

基本上,静态变量是在程序的最开始创建的(并且是值初始化的),而在程序的最末尾(当您实际关闭.exe时)被释放。 在我的示例中,类
堆栈中有一个静态常量变量
what
,我认为它是在初始化程序值的开始处创建的。这就是为什么它的
data
字段设置为0,我们可以使用它的方法。但我认为这不正确,因为它会将
Constructing(默认CTOR)
输出到控制台中。所以我有点被困在那里

我也不明白为什么我的第一个例子中的注释行是非法的。静态/常量类字段的规则是什么

如果你对我的例子有什么想法,请解释一下


感谢您的关注。

命名空间范围内的静态变量(即不在函数内)是按照其在源文件中的定义顺序构造的。此顺序仅适用于同一源文件中的变量之间,而不适用于不同源文件之间


因此,
obj
总是在
what
之前构造。在调用构造函数之前,可以对具有构造函数的对象执行有限的操作;调用成员函数不是其中之一(C++14[basic.life]/5.2)。因此,在
Stack
的构造函数中调用
what.method()
会导致未定义的行为。

我怀疑这与默认构造函数实际上没有修改对象中的任何内容有关。如果将第二个默认构造函数更改为具有
:data{1}
?@Barmar,则会发生什么情况。输出仍然相同,没有错误。因为您
#include
我无法编译您的代码。如果你坚持标准C++,我可能已经能够帮助你了。@ NWP只有一条线取决于Curio。h,<代码>当然,你可以知道如何用标准C++替换它。我相信这是预期的行为。静态对象的构造函数按照编译单元中出现的顺序调用;对于不同编译单元中的静态对象的构造顺序是未定义的。从静态构造函数调用的代码中执行ect。与某些语言不同,没有“类构造函数”这是在引用类中的静态对象之前调用的。现在,我邀请实际阅读规范的人指出我的错误…啊,我明白了。感谢您提供的信息性答案!所以我的第二个exmaple输出中的零应该是一个错误:)
#include <iostream>
#include <conio.h>

class Test {
public:
    int data;

    Test() { std::cout << "CONSTRUCTING (Default CTOR)\n"; } // notice, value-initialization of 'data' has been removed
    Test(int f) : data{ f } { std::cout << "CONSTRUCTING (Int arg CTOR)\n"; }

    void method() const { std::cout << "ALREADY CONSTRUCTED AND BEING USED :)\n" << data << std::endl; }
};

class Stack {
public:
    static const Test what;

    Stack() {
        what.method();
    }
};

Stack obj;

const Test Stack::what{ 5 };

int main()
{
    obj.what.method();

    _getch();
    return 0;
}