内置类型有默认构造函数吗?

时间:2011-02-25 03:41:59

标签: c++ constructor value-initialization

在阅读this文章后,我指出int ()产生0,因为临时int的值已初始化,而不是因为int()调用{{1}的默认构造函数}}。 (根据我的理解,这篇文章有缺陷。)

我还说过原始(内置)类型没有构造函数。原作者让我查看第10.4.2节(TC ++ PL),其中说

  

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

但我仍然认为语句“C ++允许甚至内置类型(基本类型)都有默认构造函数。”是有缺陷的(根据C ++ 03)。

我认为TC ++ PL中的Bjarne将“构造函数(如符号,int”与实际的构造函数调用混淆了。当Bjarne写这本书的时候没有引入价值初始化,对吧?那么根据C ++ 98和C ++ 03,TC ++ PL中的文本是不正确的?

你们有什么想法?

修改

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

  

我认为你混淆了“实际的构造函数调用”和概念上有一个构造函数。 内置类型被认为具有构造函数(标准用于描述其行为的任何单词)。

3 个答案:

答案 0 :(得分:43)

简单回答:技术上没有。

长答案:

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

int x(5);  // Looks like a constructor. Behaves like one: x is initialized.
int y();   // Fail. Actually a function declaration.
// BUT
int z = int(); // Looks like a constructor. Behaves like a constructor (0 init).

int a(b);  // Again.

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

如果它看起来像一只鸭子,像鸭子一样嘎嘎叫,那么它就像鸭子一样。

答案 1 :(得分:24)

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

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

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

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

答案 2 :(得分:5)

正如其他人所指出的,该标准在少数情况下与TC ++ PL相矛盾,通常与术语相关。 Bjarne Stroustrup亲自总结了这一情况:

(...) However, [TC++PL] is not a reference manual or the standards text. If you need 100% precise and complete information you'll have to consult the text of the ISO C++ standard. (...)