【问题标题】:int a=int(); what happens in C++98?int a=int();在 C++98 中会发生什么?
【发布时间】:2015-06-02 18:11:44
【问题描述】:

在您认为将其标记为重复之前,请完整阅读该问题。像这样的声明

int i=int();

大多数程序员会说这里有值初始化 & i 将被初始化值。 (0作为输出)。但它也会在 C++98 编译器上打印 0 作为输出。 下面是我在 C++98 实现上测试的程序,并给了我 0 作为输出。

#include <iostream>
int main()
{
     int i=int();
     std::cout<<i;
}

不要说i是上面C++98程序中初始化的值,因为C++03中引入了值初始化。那么我是如何在这里初始化的呢?真的是构造函数调用吗? int() 看起来像构造函数调用。正如 Bjarne stroustrup 在他的《C++ 编程语言和 TC++PL》一书中所说,原始类型在 C++ 中也有默认构造函数。

C++ 编程语言 Bjarne stroustrup:

10.4.2 内置类型也有默认构造函数

还阅读了同一本书的第 6.2.8 节。

以下链接还表明内置类型在 C++ 中具有默认构造函数。

1)http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15

2) http://www.geeksforgeeks.org/c-default-constructor-built-in-types/

那我真的可以说是整数类型的构造函数调用吗?

【问题讨论】:

  • @vsoftco:这怎么可能?
  • 我所知道的没有(相对较新的)编译器具有实际的 C++98 模式。
  • 我不会为你挖掘历史,但如果值初始化的概念是作为纠正 C++98 行为的缺陷报告引入的,那么编译器将追溯实现它,即使对于C++98 模式。无论如何,为什么 C++98 和 C++03 之间的区别甚至很重要?接受后者作为 C++ 11 之前的标准化后 C++。
  • 大多数编译器不区分 C++03 和 C++98。前者实际上是后者的错误修复,因此编译器倾向于将它们合并在一起,如果您要求 C++98,则为您提供 C++03

标签: c++ constructor c++98 built-in-types


【解决方案1】:

5.2.3 显式类型转换(函数式表示法)

2 表达式 T(),其中 T 是一个简单类型说明符 (7.1.5.2),用于非数组完整对象类型或(可能是 cv 限定的)void 类型,创建指定类型,其值由 默认初始化(8.5;void() 情况下不进行初始化)。 [...]

8.5 初始化器

5 [...] 默认初始化 T 类型的对象意味着:

-- 如果T 是非 POD 类类型(第 9 条),则为 T 被调用(如果 T 没有可访问的默认构造函数,则初始化格式错误);

--如果T是数组类型,每个元素都是默认初始化的;

--否则,对象的存储是零初始化的。

没有问题。从第一个 C++ 标准开始,int() 就保证评估为零。它通过默认初始化而不是值初始化发生的事实是一个与您的问题完全无关的技术细节。

【讨论】:

  • 那么,默认构造函数的任务是为内置类型执行默认初始化吗?
  • @meet 当它说“非 POD 类类型”时,表示“不是 POD 类类型的类类型”,而不是“不是 POD 类类型的类型”。第三项适用:对象的存储是零初始化的。没有使用构造函数。
  • 那么究竟是什么时候调用和使用内置类型的构造函数?
  • @meet 内置类型没有构造函数。构造函数是成员函数,内置类型没有也不能有任何成员。所以从来没有。也就是说,有些人确实选择说int 有一个默认构造函数,而int() 调用该默认构造函数。从我的引用中可以看出,这不是 C++ 标准的描述方式,据我所知,这是一个不常见的观点,但最终结果是相同的,所以没有错,只是可能令人困惑。
  • 但是 Bjarne Stroustrup 在他的《C++ 编程语言》一书中第 10.4.2 节说内置类型也有默认构造函数
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2011-09-07
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多