48

读完这篇文章后,我提出了一个int ()产生 0 的观点,因为临时int是值初始化的,而不是因为int()调用了int. (根据我的理解,这篇文章有缺陷。)

我还说过原始(内置)类型没有构造函数。原作者让我检查第 10.4.2 节(TC++PL),上面写着

内置类型也有默认构造函数($6.2.8)

但我仍然认为“C++ 甚至允许内置类型(原始类型)具有默认构造函数”这句话。有缺陷(根据 C++03)。

我认为 TC++PL 中的 Bjarne 将“像符号 ie 一样的构造函数()”与实际的构造函数调用混为一谈。Bjarne 在写这本书的时候并没有引入值初始化,对吧?那么根据 C++98 和 C++03,TC++PL 中的文本是否不正确?

你们有什么感想?

编辑

我亲自(通过邮件)向 Bjarne 询问了 TC++PL 中有缺陷的文本,这是他的回复

我认为您将“实际的构造函数调用”与概念上的构造函数混为一谈。 内置类型被认为具有构造函数(无论标准使用什么词来描述它们的行为)。

4

3 回答 3

49

简单的回答:技术上没有。

长答案:

,但是!

用于初始化它们的语法使它们看起来像是由默认构造函数或默认复制构造函数构造的。

int x0(5);     // Looks like a constructor. Behaves like one: x is initialized.
int x1{5};

int y0();      // Fail. Actually a function declaration.
// BUT
int y1{};      // So new syntax to allow for zero initialization
int z0 = int();// Looks like a constructor. Behaves like a constructor (0 init).
int z1 = int{};

int a0(b);     // Again.
int a1{b};

所以从技术上讲,基本 POD 类型没有构造函数。但是出于所有意图和目的,它们的行为就像它们有一个复制构造函数和默认构造函数(当用大括号初始化时)。

如果它长得像鸭子,叫起来像鸭子,那它就很像鸭子。

于 2011-02-25T03:55:03.500 回答
30

构造函数是一个成员函数(构造函数在 C++ 标准的第 12 节中完全指定,其中涵盖了特殊的成员函数,如构造函数和析构函数)。

只能为类类型定义成员函数(C++03 9.3/1 说“在类定义中声明的函数,不包括使用朋友说明符声明的函数,称为该类的成员函数”)。

所以非类类型(包括基本类型、数组类型、引用类型、指针类型和枚举类型)没有构造函数。

我没有C++ 编程语言的副本来阅读“内置类型也有默认构造函数”这句话的上下文,但我猜 Stroustrup 要么在松散、非- 技术意义,或术语的含义或在标准中使用它的方式在书籍出版和语言标准化之间发生了变化。我猜前者比后者更有可能。

于 2011-02-25T03:46:15.490 回答
5

正如其他人所指出的,该标准在某些情况下与 TC++PL 相矛盾,通常与术语有关。Bjarne Stroustrup 自己很好地总结了这种情况:

(...) 但是,[TC++PL] 不是参考手册或标准文本。如果您需要 100% 准确和完整的信息,则必须查阅 ISO C++ 标准的文本。 (...)

于 2011-02-25T06:57:00.293 回答