我正在掌握c ++并且有一种语言功能我特别难以理解。
我习惯于明确地声明和初始化变量,但在c ++中,我们有时似乎声明并隐式构造变量。
例如,在此片段中,rdev似乎是隐式构造的(因为它随后用于构造default_random_engine);
random_device rdev;
default_random_engine gen(rdev());
有人可以解释这里发生了什么吗?除了int myInt;
?
答案 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
既不是类类型也不是数组类型,因此不执行初始化,并且在显式初始化之前它将具有不确定的值(通过为其赋值)。