【问题标题】:Do built-in types have default constructors?内置类型有默认构造函数吗?
【发布时间】:2011-02-25 03:41:58
【问题描述】:

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

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

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

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

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

你们觉得呢?

编辑

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

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

【问题讨论】:

  • 为什么这个被关闭为主观和争论?这肯定有一个“是/否”的答案。
  • 顺便说一句,我认为这个矛盾之前已经出现过。 TC++PL 在某些领域过于简化和概括,在这种情况下是错误的。
  • 如果它看起来像构造函数,走路像构造函数,说话像构造函数......如果它不是构造函数真的重要吗?
  • 对我来说听起来像是对术语的争论。
  • @Keith :值初始化是在 C++03 中引入的。第 8.5/5 节。 “初始化器为空括号集的对象,即 (),应进行值初始化。”

标签: c++ constructor value-initialization


【解决方案1】:

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

长答案:

没有。 但是!

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

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 类型没有构造函数。但就所有意图和目的而言,它们的行为就像具有复制构造函数和默认构造函数(使用大括号初始化时)。

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

【讨论】:

  • 所以像这样的语法:int x(5); 被转换为int x; x=5; ?谢谢:)
  • @SoulReaper:不引用。 int x(5); 等价于 int x = 5。虽然在编译后我怀疑你会发现对象与这些中的任何一个有什么不同。
  • @LokiAstari 对我来说,int() 是最令人困惑的。如果不是构造函数,那是什么?
  • @JonathanMee:它强制零初始化而不是默认初始化(我忘记了该技术的确切名称)。如果您想到带有编译器定义的构造函数的用户定义类型T。那么T x;T* y = new T;是默认初始化T x = T();T* y = new T()是零初始化。它的设计使模板可以与用户定义的类型和 POD 类型一样工作。
  • @LokiAstari 如果你有兴趣,我在这里询问了“技术名称”:stackoverflow.com/q/27443532/2642059
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    正如其他人所指出的,该标准在少数情况下与 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. (...)

    【讨论】:

    • 链接坏了:(
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多