源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C++对象的动态建立与释放详解

  • 时间:2020-12-20 14:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++对象的动态建立与释放详解
=============下面先给出一个new和delete基本应用的例子,回顾一下它的基本用法============
[u]复制代码[/u] 代码如下:
#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; }
运行结果: [img]http://files.jb51.net/file_images/article/201310/20130906155218593.png[/img] 同样的,new和delete运算符也可以应用于类的动态建立和删除 用new运算符动态地分配内存后,将返回一个指向新对象的指针的值,即所分配的内存空间的起始地址。用户可以获得这个地址,并用这个地址来访问对象。 当然C++还允许在执行new时,对新建的对象进行初始化。
[u]复制代码[/u] 代码如下:
Box *pt =new Box(12,15,18);
用new建立的动态对象一般是不用对象名的,而是通过指针进行访问,它主要应用于动态的数据结构,如链表等。访问链表中的结点,并不需要通过对象名,而是在上一个结点中存放下一个节点的地址,从而用上一个结点找到下一个结点,构成连接关系。 在不再需要使用new建立的对象时,,可以用delete运算符予以释放。在执行delete运算符的时候,在释放内存空间之前,会自动调用析构函数。
[u]复制代码[/u] 代码如下:
#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; }
[img]http://files.jb51.net/file_images/article/201310/20130906164805250.png[/img] 然后,举一个更加实际的例子 =========================题目======================= 编写一个程序,要求先输入同学的人数,然后分别输入同学的学号、姓名和英语、数学成绩。 然后打印出所有同学的信息
[u]复制代码[/u] 代码如下:
#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; }
运行结果: [img]http://files.jb51.net/file_images/article/201310/20130906202200828.png[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部