我们知道可以用new运算符可以动态的分配内存,用delete运算符可以释放这些内存。
当我们使用new运算符动态的分配一个内存之后,会自动返回一个该内存段的起始地址,也就是指针。
=============下面先给出一个new和delete基本应用的例子,回顾一下它的基本用法============
#include<iostream> using namespace std; int main() { int *p;//定义一个指向int型变量的指针p p=new int(3);//开辟一个存放整数的存储空间,返回一个指向该存储空间的的地址 cout<<*p<<endl; delete p;//释放该空间 char *p_c; p_c=new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址 int i; for(i=0;i<10;i++) { *(p_c+i)=i+'0'; } for(i=0;i<10;i++) { cout<<*(p_c+i); } delete [] p_c; cout<<endl; return 0; }
运行结果:
同样的,new和delete运算符也可以应用于类的动态建立和删除
用new运算符动态地分配内存后,将返回一个指向新对象的指针的值,即所分配的内存空间的起始地址。用户可以获得这个地址,并用这个地址来访问对象。
当然C++还允许在执行new时,对新建的对象进行初始化。
Box *pt =new Box(12,15,18);
用new建立的动态对象一般是不用对象名的,而是通过指针进行访问,它主要应用于动态的数据结构,如链表等。访问链表中的结点,并不需要通过对象名,而是在上一个结点中存放下一个节点的地址,从而用上一个结点找到下一个结点,构成连接关系。
在不再需要使用new建立的对象时,,可以用delete运算符予以释放。在执行delete运算符的时候,在释放内存空间之前,会自动调用析构函数。
#include<iostream> using namespace std; class Box { public: Box(int w,int l,int h); ~Box(); int width; int length; int height; }; Box::Box(int w,int l,int h) { width=w; length=l; height=h; cout<<"========调用构造函数=======\n"; } Box::~Box() { cout<<"========调用析构函数=======\n"; } int main() { Box * p=new Box(12,13,15); cout<<"\n输出指针指向的对象的数据成员"<<endl; cout<<p->width<<"\t"<<p->length<<"\t"<<p->height<<endl; delete p; return 0; }
然后,举一个更加实际的例子
=========================题目=======================
编写一个程序,要求先输入同学的人数,然后分别输入同学的学号、姓名和英语、数学成绩。
然后打印出所有同学的信息
#include<iostream> #include<string> #include<iomanip> using namespace std; class Student { public: Student(int num, string nam, float e,float m); void show(); Student * next; private: int number; string name; float English; float Math; }; Student::Student(int num,string nam,float e,float m) { number=num; name=nam; English=e; Math=m; } void Student::show() { cout<<setiosflags(ios::left); cout<<setw(10)<<number; cout<<setw(15)<<name; cout<<"English:"<<setw(10)<<English; cout<<"Math:"<<setw(10)<<Math; cout<<endl; } int main() { int i=0,n; cout<<"请输入同学人数:"; cin>>n; Student * head=NULL; Student * node=NULL; Student * p=NULL; string name; float English; float Math; for(i=1;i<=n;i++) { cout<<"请输入第"<<i<<"个同学的姓名,英语成绩,数学成绩"<<endl; cin>>name>>English>>Math; node=new Student(i,name,English,Math); if(head==NULL) head=node; else p->next=node; p=node; if(i==n) p->next=NULL; } cout<<"============输出学生信息=========="<<endl; p=head; while(p!=NULL) { p->show(); p=p->next; } //==========释放对象占用的空间======= p=head; Student * l; while(p!=NULL) { l=p; p=p->next; delete l; } return 0; }
运行结果: