跳转至

动态创建对象

有些程序设计需要用动态创建对象

  1. 开发空中交通指挥软件,有可能指挥很多飞机,有时候飞机多,有时候飞机少,需要动态创建对象的方法。

  2. 一个网络软件,规模可能很大可能很小,都需要使用动态创建对象。

  3. C语言动态内存分配

  4. malloc()
  5. free()
  6. C++动态创建对象
  7. new
  8. delete
  9. delete[]

例:word中创建表格,表格可能大也可能小,根据行数和列数大小动态创建。

例:画图,有可能画很多圆,不可能知道用户会画多少个圆,所以需要使用动态创建对象的方法,根据用户操作创建对象。非常灵活。

//定义一个圆类
class Circle {
    //半径
    int r;
public:
    //构造函数
    Circle() {}
    Circle(int rr) : r(rr) {}
    void print() {
        cout << "r = " << r << endl;
    }
};

Circle *pCircle;//动态的创建就需要指针。定义一个指针。
vector<Circle *> allCircles;//用vector保存起来,存的都是指针

//根据输入的个数,动态创建圆对象。
void test() {
    int count;
    cout << "要画多少个圆: ";
    cin >> count;
    for (int i = 0; i < count; i++) {
        pCircle = new Circle(i);//用new创建的返回的是一个指针
        allCircles.push_back(pCircle);
    }

    for (int i = 0; i < count; i++) {
        delete allCircles[i];
    }
}

动态的创建使用new,返回的是一个指针。

用new操作符就可以动态的创建对象。

动态创建对象是在堆里。

内存有三个重要的部分,是编程中用到的。

  1. 静态内存

不能动态创建对象

不能动态创建对象

只有堆上可以动态分配内存创建对象

全局变量在静态内存

当程序开始运行时就存在。程序结束时才消失。生命期很长。

局部变量在栈里。

在堆里 用指针。基本类型也可以用指针动态的创建。自定义类型和基本类型都可以用new动态创建。

动态创建是在运行的时候在堆上创建的,全局变量在静态内存和局部变量在栈里是编译的时候创建的。

//全局,静态内存。静态创建。
int a = 100;
Circle c(100);

void demo() {
    //局部,栈。静态创建。
    int b = 200;
    Circle bc(200);

    //动态创建,指针,在堆里。
    int *pi = new int(300);
    Circle *pCircle = new Circle(300);
      delete pCircle;//需要delete释放内存
}

demo中,当作用域函数结束之后,C++会自动结束变量生命。自动释放销毁,收回内存。

动态创建的,当作用域结束之后,C++不回自动收回。必须自己写delete,删除。

可以在析构函数是否被调用测试是否被销毁。

使用了new不delete的话。内存泄漏。电脑死机。

动态创建对象非常的灵活,既可以动态创建对象,也可以动态创建数组。

数组指针指向的是数组中的第一个元素对象。释放的时候只delete的话只是释放的第一个。需要使用delete[],把所有的元素对象都释放掉。

void demo() {
    MyType *fp = new MyType;
    MyType *fp2 = new MyType[100];

    int a[100];
    int *pia = new int[100];

    delete fp;
    delete [] fp2;
    delete [] pia;
}