20 对象的动态建立与释放
与普通变量相同,对象也可以使用 new
运算符进行动态存储分配。
1 为什么需要动态建立对象
动态内存分配,分配的内存空间在 “堆” 中,而静态存储分配的内存在 “栈” 中。
如果我们不使用动态存储分配,我们建立的变量和对象,都会保存在 “栈” 中,而 “栈” 的空间并不大,一般为 1-8MB。如果存储的数据总量超过了 “栈” 的空间大小,就会引起 “栈溢出” 问题,程序会因此崩溃。
而 “堆” 空间就大很多。对象本身就比一般变量更大,因此,使用动态存储分配方式创建对象,可以避免 “栈溢出” 问题。
2 语法
用 new
运算符创建的对象,是没有对象名的,因此只能通过指针访问对象的成员。
需要使用无参构造函数创建对象时:
类名 * 指针名;
指针名 = new 类名;
需要使用有参构造函数创建对象时:
类名 * 指针名;
指针名 = new 类名(参数);
例子:
#include<iostream>
using namespace std;
class Student {
private:
string name;
int age;
int score;
public:
Student(string _name, int _age, int _score) : name(_name), age(_age > 0 ? _age : 0), score(_score) {
cout << "调用" << name << "的构造函数" << endl;
}
~Student() {
cout << "调用" << name << "的析构函数" << endl;
}
// age 属性的 Getter 方法
int getAge() {
return age;
}
// age 属性的 Setter 方法
void setAge(int newAge) {
if (newAge < 0){
cout << "年龄不能为负数!" << endl;
return;
}
age = newAge;
}
void say() {
cout << "我是" << name << ",我今年" << age << "岁了,我的成绩是" << score << "分。" << endl;
}
};
int main() {
Student *stu1 = new Student("张三", 16, 85);
stu1->setAge(-16);
stu1->say();
delete stu1;
return 0;
}