对象的动态建立和释放

我们知道可以用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;

}


运行结果:

 

对象的动态建立和释放


 

你可能感兴趣的:(对象)