c ++中隐式构造的变量

时间:2015-04-17 14:44:52

标签: c++

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

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

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

random_device rdev;
default_random_engine gen(rdev());

有人可以解释这里发生了什么吗?除了int myInt;

之类的简单声明之外,我怎么能说出这一点

4 个答案:

答案 0 :(得分:5)

  

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

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

  

除了int myInt;之类的简单声明?

之外,我怎么能说出这一点

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

您可以在不定义全局变量的情况下声明它:

extern int myInt;

extern表示它具有外部链接,并在其他位置定义。其他类型的变量不能在不定义变量的情况下声明。

答案 1 :(得分: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
);

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

auto rdev = random_device {};
auto gen = default_random_engine { rdev.operator()() };

答案 2 :(得分:4)

  

有人可以解释这里发生了什么吗?我怎么能区分它   来自一个简单的声明,例如int myInt;

它们都是简单的定义。

唯一的区别是该类型的属性。 random_device需要构建,所以它是。 int但是人们哭的太多了,所以事实并非如此。坦率地说,int的行为更像是一种语言缺陷,而不是你真正想要的东西。

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

答案 3 :(得分:3)

如C ++标准(8.5.11)中所述:If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [ Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note ]

这正是您的情况:没有显式初始化程序的变量定义。 那么,让我们看看default-initialized的含义(8.5.7):

To default-initialize an object of type T means:
  — if T is a (possibly cv-qualified) class type (Clause 9),
    the default constructor for T is called
    (and the initialization is ill-formed if T has no accessible default constructor);
 — if T is an array type, each element is default-initialized;
 — otherwise, no initialization is performed.

这清楚地说明了两个例子之间的区别:

  • random_device是一个类类型,因此默认构造函数(没有参数的构造函数)被隐式调用。
  • int既不是类类型也不是数组类型,因此不执行初始化,并且在显式初始化之前它将具有不确定的值(通过为其赋值)。