我知道,对于非POD类型的默认初始化也将默认通过调用其默认构造函数初始化非静态非POD成员变量。但我不确定这是怎么发生的。这里是我的意思的例子:困惑用户如何空定义的构造函数将初始化非静态非POD的成员变量
#include <iostream>
#include <vector>
using namespace std;
class Test2 {
public:
Test2() {cout <<"Here";}
};
class Test {
public:
Test() {}
Test2 i;
};
int main() {
Test foo;
}
输出是:
Here
基于C++的初始化标准(8.5),默认初始化:
— if T is a non-POD class type (clause 9), the default constructor
for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
所以鉴于此,我确实希望默认构造函数Test()
会被调用,但是类Test
的空默认构造函数不会初始化Test2 i
expli毋庸置疑,Test2()
不知何故被暗中调用。我想知道的是这是怎么发生的?同样,对于值初始化(与上面的例子没有关系),如果一个空的用户定义的默认构造函数没有显式地初始化一个POD非静态成员变量,那么这个变量如何得到零初始化(我知道它是这样做的做)?由于基于标准,似乎对于值初始化来说,当你有一个用户定义的默认构造函数时发生的一切就是构造函数被调用。
的值初始化C++标准的相应部分如下:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the
default constructor for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
这个问题类似于c++ empty constructor and member initialization 但不同的是,而不是问最终结果的行为是什么,我会想知道为什么会发生最终结果行为。
编译器写入遵循的标准奠定了规则,标准说,X应该发生在情况Y中,所以编译器发出代码来在情况Y中执行X.我不明白这是如何造成混淆的。 –
如果你没有在构造函数中初始化它的初始化为ou –
@Benjamin:我的困惑是,我认为X应该发生在情况Y有副作用,其中副作用不被我上面列出的标准解释。 – user1082160