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;
}