zoukankan      html  css  js  c++  java
  • 对象的动态建立和释放

    我们知道可以用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<<"========调用构造函数=======
    ";
    } 
    Box::~Box()
    {
    	cout<<"========调用析构函数=======
    ";
    } 
    int main()
    {
    	Box * p=new Box(12,13,15);
    	cout<<"
    输出指针指向的对象的数据成员"<<endl;
    	cout<<p->width<<"	"<<p->length<<"	"<<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;
    }
    


    运行结果:



  • 相关阅读:
    最简单的基于FFMPEG+SDL的音频播放器 ver2 (採用SDL2.0)
    JBPM——工作流概念
    android项目中的拍照和本地图片截图
    hunnu--11547--你的组合数学学得怎样?
    POJ 2253
    [ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)
    Redis简述
    C/C++,从未过时的编程语言之父
    Android4.4 Framework分析——getContentResolver启动ContentProvider的过程
    2012_p2 寻宝 (treasure.cpp/c/pas)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3306285.html
Copyright © 2011-2022 走看看