3

Stroustrup 的C++ 编程语言(此处为第 4 版)第 6.3.5.1 节的最后一句话是:

如果数组或结构是,则默认初始化数组或类的成员。

但是,此测试显示默认初始化对象的未初始化成员(我也尝试过g++4.7 -std=c++11

#include <iostream>

struct Foo
{
    int i;

    Foo();
};

Foo::Foo() {}

int main()
{
    Foo f;
    std::cout << "f.i: " << f.i << std::endl;

    return 0;
}

我一定遗漏了一些东西,但有没有一种解释并不意味着 Stroustrup 的断言有误?


编辑:在回答之后,我了解到默认初始化的概念应该包括文本其他部分中所谓的未初始化(例如在§17.3.1 中)。这对我来说听起来很不清楚。事实上,使用uninitialized来表示除“未明确用户初始化”之外的任何内容(就像那里的情况一样)是矛盾的:有些东西是默认初始化的,但尚未初始化。除非人们放弃 X 和 un-X 分类相反的、排他的事物集的自然语言证据……

此外,同一节(第 6.3.5.1 节)中的前一句为

局部变量 [...] 默认情况下不会初始化,除非它们是具有默认构造函数的用户定义类型 [...]

矛盾在这里再次显现。接受第一个和后一个语句为真意味着存在同时默认初始化和默认未初始化的变量(即局部变量) 。

恕我直言,这充其量是一种非常不清楚的自然语言来描述事物。

4

1 回答 1

6

根据第 8.5/7 节:

默认初始化 T 类型的对象意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认值,则初始化是非良构的构造函数);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。

int落在最后一点,所以它没有被初始化。如果您的成员具有类型,例如,std::string它将调用的默认构造函数,std::string并且您将有一个空字符串。

于 2013-07-04T20:20:11.150 回答