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

Pra*_*rav 43 c++ constructor value-initialization

看完文章我做了一个点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中有缺陷的文本,这是他的答复

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

Mar*_*ork 47

简单回答:技术上没有

答案很长:

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

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.
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SoulReaper:不引用.`int x(5);`相当于`int x = 5`.虽然在编译后我怀疑你会发现对象与这些对象有任何不同. (4认同)
  • @JonathanMee:它强制零初始化而不是默认初始化(我忘记了技术的确切名称).如果你想到用户定义的类型`T`和编译器定义的构造函数.然后`T x; T*y = new T;`是默认初始化`T x = T(); T*y = new T()`是零初始化.它的设计使模板与用户定义的类型和POD类型的工作方式相同. (4认同)

Jam*_*lis 25

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

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

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

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


dec*_*ype 5

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

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

  • 链接坏了:( (4认同)