2. 堆上动态创建对象
在 C 语言中,如果动态在堆上申请内存存放数据需要使用 malloc 和 free 一系列函数。
C++ 语言建议使用 new 和 delete 关键字在堆上创建对象用于代替 C 语言的 malloc 系列函数来动态创建对象。
关键字 new 用来在堆上动态创建对象。使用 new 创建对象时先调用 malloc 函数申请内存,然后调用相应的构造函数来初始化对象。
关键字 delete 用来销毁在堆上创建的对象,使用 delete 销毁对象时先调用析构函数进行反向初始化,然后再调用 free 函数来销毁对象占用的内存。
new 创建对象的语法
// 创建单个对象
new 类名; // 调用无参数的构造函数
new 类名(实参列表); // 根据重载规则调用有参数的构造函数
// 创建对象数组
new 类名[对象个数(整数)]
// 创建对象数组,并指定构造函数
new 类名[对象个数(整数)]{每个对象的初始化构造函数}
delete 销毁对象的语法
// 销毁单个对象
delete 对象地址
// 销毁对象数组
delete [] 对象地址
示例
此示例示意使用 new 和 delete 来动态申请单个对象和动态申请对象的数组。
// filename: new_delete.cpp
#include <iostream>
using namespace std;
class Square {
public:
Square(double l=1) {
cout << "边长为" << l << "的正方形被创建!" << endl;
length = l;
}
~Square() {
cout << "边长为" << length << "的正方形被销毁!" << endl;
}
double get_length(void) {
return length * 2;
}
private:
double length;
};
int main(int argc, char * argv[]) {
Square * ps = NULL;
cout << "动态分配一个对象" << endl;
ps = new Square(2); // 创建一个 Square 对象
cout << ps->get_length() << endl;
delete ps; // 销毁这个 Square 对象
// 创建三个 Square 对象
cout << "动态分配多个对象" << endl;
ps = new Square[3]{Square(3), Square(4), Square(5)};
for (int i = 0; i < 3; i++) {
ps[i].get_length();
}
delete [] ps;
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o new_delete new_delete.cpp
weimz@mzstudio:~$ ./new_delete
动态分配一个对象
边长为2的正方形被创建!
4
边长为2的正方形被销毁!
动态分配多个对象
边长为3的正方形被创建!
边长为4的正方形被创建!
边长为5的正方形被创建!
边长为5的正方形被销毁!
边长为4的正方形被销毁!
边长为3的正方形被销毁!
实验
使用 new 动态创建 10 个整数类型的对象数组。使用后再使用 delete 进行销毁。