1、内置类型(如 int, double, char)
如想要更安全的行为(初始化为0
),使用 new Type()
。如需要性能优化、并打算手动初始化值,可以使用 new Type
。
#include <iostream> using namespace std; int main() { int* a = new int; // 未初始化,值是垃圾 int* b = new int(); // 初始化为0 std::cout << "*a = " << *a << " (未定义行为)\n"; std::cout << "*b = " << *b << " (值为0)\n"; delete a; delete b; return 0; }
2、自定义类型(类或结构体)
对于有构造函数的类或结构体,两者的行为是一样的,都会调用构造函数。
#include <iostream> using namespace std; struct MyStruct { int x; MyStruct() { x = 42; std::cout << "Constructor called, x = " << x << std::endl; } }; int main() { // 使用 new MyStruct 分配对象,调用默认构造函数 MyStruct* obj1 = new MyStruct; // 调用构造函数 std::cout << "obj1->x = " << obj1->x << std::endl; // 使用 new MyStruct() 分配对象,也调用默认构造函数 MyStruct* obj2 = new MyStruct(); // 同样调用构造函数 std::cout << "obj2->x = " << obj2->x << std::endl; // 释放内存 delete obj1; delete obj2; return 0; }
3、无构造函数的结构体或 POD 类型
当结构体或类是 Plain Old Data(POD)类型时,new Plain
不会初始化成员,new Plain()
会对成员执行值初始化(即 x
为 0
)。
#include <iostream> using namespace std; struct Plain { int x; }; int main() { // new Plain:不会对成员变量进行初始化 Plain* p1 = new Plain; // new Plain():会将成员变量值初始化为 0 Plain* p2 = new Plain(); std::cout << "p1->x (未初始化,值不确定/垃圾值): " << p1->x << std::endl; std::cout << "p2->x (初始化为 0): " << p2->x << std::endl; // 释放内存 delete p1; delete p2; return 0; }
4、数组
C++ 中,new Type
与 new Type()
表示的是动态分配对象的两种不同写法,它们在数组上下文中也有不同的行为。
#include <iostream> using namespace std; int main() { // 分配未初始化的数组 int* arr1 = new int[5]; // 每个元素未初始化,可能是任意值(垃圾值) // 分配并初始化为 0 的数组 int* arr2 = new int[5](); // 每个元素初始化为 0 std::cout << "arr1 contents (未初始化): "; for (int i = 0; i < 5; ++i) { std::cout << arr1[i] << " "; // 输出的是未定义值(可能是随机的) } std::cout << std::endl; std::cout << "arr2 contents (初始化为0): "; for (int i = 0; i < 5; ++i) { std::cout << arr2[i] << " "; // 应全为 0 } std::cout << std::endl; // 释放内存 delete[] arr1; delete[] arr2; return 0; }