C++ C++;零初始化
我很难理解我的类中的一个成员在什么时候以及为什么根据初始化为零 考虑以下测试程序:C++ C++;零初始化,c++,c++14,zero-initialization,C++,C++14,Zero Initialization,我很难理解我的类中的一个成员在什么时候以及为什么根据初始化为零 考虑以下测试程序: #include <iostream> #include <stdio.h> class MyTest { private: const static unsigned int dimension = 8; void (* myFunctions [dimension])(); public: MyTest() {} void print() {
#include <iostream>
#include <stdio.h>
class MyTest {
private:
const static unsigned int dimension = 8;
void (* myFunctions [dimension])();
public:
MyTest() {}
void print() {
for(unsigned int i=0; i < MyTest::dimension; i++) {
printf("myFunctions[%d] = %p\n", i, this->myFunctions[i]);
}
}
};
int main() {
//We declare and initialize an object on the stack
MyTest testObj = {};
testObj.print();
return 0;
}
看起来像是堆栈中未初始化的值
如果我将对象的声明移到main之外(作为全局变量),它将再次打印所有零
如果我正确理解了cppreference,这是因为我有一个具有静态存储持续时间的变量,因此初始化为零。它通过零初始化我的类(即myFunctions
)数组的所有非静态数据成员来初始化我的类类型。数组是通过零初始化它的每个元素来初始化的,在我的函数指针例子中,它是一个空指针
当我用mytesttestobj={}声明对象时,为什么它不初始化堆栈中的对象代码> 以下
MyTest testObj = {};
不是MyTest
的零初始化,而是简单地调用其默认构造函数。CPPPreference页面解释了原因(我的重点):
作为非类类型和无构造函数的值初始化类类型成员的值初始化序列的一部分,包括未提供初始值设定项的聚合元素的值初始化
MyTest
是一个类类型,并且a有一个构造函数
使用
MyTest() = default;
将改为零初始化对象
下面是相关的标准引用(重点)
发件人:
初始化T类型对象的值意味着:
- 如果T是一个(可能是cv限定的)类类型,没有默认构造函数([class.ctor]),或者是用户提供或删除的默认构造函数,那么对象是默认初始化的
- 如果T是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,则对象为零初始化,并检查默认初始化的语义约束,如果T有一个非平凡的默认构造函数,则对象为默认初始化
发件人:
类型为T的对象或引用的列表初始化定义如下:
- 否则,如果初始值设定项列表没有元素,并且T是具有默认构造函数的类类型,则对象值已初始化。
在这里我不符合你的期望。显然,您链接的文档页面中的三点都不适用。mytesttestobj={}
不是零初始化。它是值初始化,它只调用默认构造函数,在您的情况下,默认构造函数不初始化任何东西。MyTest(){}
构造函数不初始化任何东西。这种行为特定于函数指针吗?注意:6.6.2静态初始化
静态存储持续时间的对象是零初始化的。这就是为什么当您将其设为全局变量时,所有内容都初始化为零。自动对象遵循更复杂的规则。啊,谢谢。连同值初始化部分,我现在也明白了为什么在注释掉类中的构造函数时,当声明为mytesttestobj时,它会打印相同的未初始化值当我执行mytesttestobj={}时,代码>和全部为零代码>等一下。如果没有显式提供构造函数,那么所有指针都应该为零?还是我错了?@bartop搞错了,对不起,更正了。@bartop你错了int main(){int*p;}
-这里p
不能保证nullptr
。它是一个未初始化的指针,具有不确定的值。@Vittorio:如果用=default
声明默认构造函数,是否会导致它被值初始化?
MyTest() = default;