栈相当于装衣服的箱子,先放入的在最底下,后放入的在最上方,所以当取出数据时,采用的是先进后出的顺序,每次取出数据需要从最后一个放入的数据开始。
堆相当于一个书架,也是采用一定的顺序存放数据,但是取出时可以任意从书架中取出,堆的存取是随意。
首先自定义一个类名TV
class TV
{public: char name[20]; int type; void changeVol(); void power();} 定义了一个电视类,有开关和调节声音的功能
当从栈中实例化对象时:int main(void){TV tv; TV tv[20]; return 0;}
当从栈实例一个对象时,写法为 类名加对象名。在这里不用使用delete关键词来手动释放内存,栈中的内存会自动释放。
当从堆中实例化对象时:int main(void){TV *tn=new TV(); TV *tt=new TV[20]; delete tn delete[]tt; return 0;}
当从堆实例一个对象时,写法为类名加指针符号*加对象名,然后new一个TV类的内存空间给tn。 TV *tt=new TV[20];这段代码的含义是:“在栈内存中存放了一个指向一块堆内存中的指针tt。就是说程序在堆中分配了一块内存,然后将内存的首地址,存在栈中。 而这里需要手动释放内存,delete []tt; 是告诉编译器,释放tt数组的内存空间。
实例化对象后
在栈中访问对象成员 举例 tv.type = 0; 使用 . 来访问创建的对象。
在堆中访问对象成员 举例 堆访问对象成员 tn->type = 0; 使用 -> 来访问创建的对象。