关于new申请动态空间时调用构造、析构函数

  • Post author:
  • Post category:其他



先有一道小填空题开说:


有如下定义语句:MyClass *p[10], 则当指针数组p离开它的作用域时, 系统自动调用析构函数()次。      答案无疑是——0次。


这里只是定义了指针, 并没有为其指定指向的对象,没有构造所以也就谈不上析构。


若使用了new申请动态空间就不同了,上面是指针数组,下面以单独的指针说明一下:

#include<iostream>
using namespace std;

class Test
{
public:
	Test()
	{
		cout<<"构造"<<endl;
	}
	~Test()
	{
		cout<<"析构"<<endl;
	}
};

void main()
{
	cout<<"****************start*********************"<<endl;
	Test *arr[10];      //从结果来看, 这里没有调用构造函数
	Test * arrSingle;
	arrSingle = new Test[2];    //这里调用两次   这样使用,要求必须有默认构造函数
	delete []arrSingle;    //这里析构两次
	cout<<"****************end**********************"<<endl;
}


运行结果:




那么, 既然执行了构造函数, 那就意味了arrSingle 就必然已经是对象数组了。像对象那么使用它, 肯定没问题:

#include<iostream>
using namespace std;

class Test
{
private:
	int test;
public:
	Test()
	{
		test = 0;
		cout<<"构造"<<endl;
	}
	~Test()
	{
		cout<<"析构"<<endl;
	}
	void print()
	{
		cout<<"调用成员函数,输出数据成员:"<<test<<endl;
	}
};

void main()
{
	cout<<"****************start*********************"<<endl;

	Test *arr[10];
	Test * arrSingle;
	arrSingle = new Test[2];
	arrSingle[0].print(); 
	delete []arrSingle;

	cout<<"****************end**********************"<<endl;
}


运行结果:



转载于:https://www.cnblogs.com/tiny-rogue/archive/2013/05/03/3056249.html