使用new运算符创建数组时带尾括号与不带尾括号的核心区别是什么?
用new创建数组时带尾随括号与不带括号的核心区别
核心差异在于初始化方式的不同:
针对内置数据类型(如int、char、float等):
new int[5];执行默认初始化:数组里的每个元素不会被赋值,值是未定义的随机垃圾值,直接使用可能导致不可预测的行为。new int[5]();执行值初始化:数组的每个元素都会被强制初始化为0。
针对自定义类类型(拥有默认构造函数的情况):
两种写法的效果完全一致,都会调用类的默认构造函数来初始化数组中的每个元素。如果类没有默认构造函数,两种写法都会编译失败——因为不管是默认初始化还是值初始化,都需要默认构造函数的支持。
代码示例
// 内置类型测试 int* arr_default = new int[5]; // arr_default的元素是随机垃圾值,未定义 int* arr_value = new int[5](); // arr_value的每个元素都是0 // 自定义类测试 class TestClass { public: int num; TestClass() : num(20) {} // 默认构造函数 }; TestClass* cls_arr1 = new TestClass[3]; TestClass* cls_arr2 = new TestClass[3](); // 两个数组的每个元素num都是20,行为一致
内容的提问来源于stack exchange,提问作者Synex
相关产品推荐
相关产品推荐

