c ++中隐式构造的变量

Gis*_*wok 9 c++

我正在掌握c ++并且有一种语言功能我特别难以理解.

我习惯于明确地声明和初始化变量,但在c ++中,我们有时似乎声明并隐式地构造变量.

例如,在这个片段中,rdev似乎是隐式构造的(因为它随后用于构造default_random_engine);

random_device rdev;
default_random_engine gen(rdev());
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?除了一个简单的声明之外,我该怎么说int myInt;呢?

Mik*_*our 5

有人能解释一下这里发生了什么吗?

这些是定义,而不仅仅是声明.变量定义创建变量.在第一种情况下,没有初始化,表明它应该默认初始化.

除了一个简单的声明之外,我该怎么说int myInt;呢?

这也是一个定义,创建int变量并使其保持未初始化状态.

您可以声明一个全局变量而不定义它:

extern int myInt;
Run Code Online (Sandbox Code Playgroud)

extern表示它具有外部链接,并在其他地方定义.如果不定义其他类型的变量,则无法声明它们.


bob*_*bah 5

random_device rdev; // creates an instance of random_device on the stack
                    // with default constructor (taking no arguments)

default_random_engine gen(  // creates an instance of default_random_engine
                            // on the stack
    rdev()                  // passing it the result of
                            // invocation of operator '()'
                            // on the instance rdev of random_device
);
Run Code Online (Sandbox Code Playgroud)

相同的更详细的形式(与一些C++ 11):

auto rdev = random_device {};
auto gen = default_random_engine { rdev.operator()() };
Run Code Online (Sandbox Code Playgroud)


Pup*_*ppy 4

有人能解释一下这是怎么回事吗?我怎样才能将其与 int myInt; 等简单声明区分开来?

它们都是简单的定义。

唯一的区别是类型的属性。random_device需要建造,所以就是这样。int确实如此,但人们哭得太频繁了,所以事实并非如此。坦率地说,int的行为更多的是一种语言缺陷,而不是您真正想要的东西。

最终,这是类型的属性,而不是定义的属性。