1


我阅读了以下链接:-

带括号和不带括号初始化的对象

默认构造函数的类型

diff b/w value,zero and default intilization

我有一些问题想澄清。


1)给定一个POD类,比如说:-

class A{
        int val;
};


如果我创建一个 A 类型的对象。

一个对象;// 这会调用编译器提供的隐式定义的构造函数吗?
现在据我所知,在这种情况下没有调用构造函数。它正确吗?

新的 A(); // value-initialize A,这是零初始化,因为它是一个 POD。现在在这种情况下将隐式定义编译器提供的构造函数?零初始化对象的构造函数是否有任何作用?

如果我的理解是错误的,请给我一个根本不调用隐式定义的构造函数的例子。

先感谢您。

4

2 回答 2

3

1) 正确。obj.val未初始化。

2)这是一个函数声明,而不是初始化:

A obj(); // function obj() returning an A

如果你这样做了,

A obj{};     //C++11
A obj = A(); // C++03 and C++11

obj将被值初始化obj.val. 这反过来意味着obj.val它将被零初始化值初始化意味着内置类型的零初始化)。

于 2013-11-11T17:24:37.193 回答
2
A obj;

它调用默认构造函数(甚至不是为了优化),但是默认构造函数不会初始化它。

 

A obj();

这是一个函数声明。没有参数和返回A

 

A obj{};

相反,您可以使用上面设置val为零的代码。

于 2013-11-11T17:23:56.017 回答